Commit c1455967 by benjaoming

Refactoring wiki.core.plugins

parent ebe86a45
# -*- coding: utf-8 -*-
"""
Credits to ojii, functions get_module and load are from:
https://github.com/ojii/django-load.
Thanks for the technique!
"""
from django.conf import settings
from django.utils.importlib import import_module
def get_module(app, modname, verbose, failfast):
"""
Internal function to load a module from a single app.
"""
module_name = '%s.%s' % (app, modname)
try:
module = import_module(module_name)
except ImportError, e:
if failfast:
raise e
elif verbose:
print "Could not load %r from %r: %s" % (modname, app, e)
return None
if verbose:
print "Loaded %r from %r" % (modname, app)
return module
def load(modname, verbose=False, failfast=False):
"""
Loads all modules with name 'modname' from all installed apps.
If verbose is True, debug information will be printed to stdout.
If failfast is True, import errors will not be surpressed.
"""
for app in settings.INSTALLED_APPS:
get_module(app, modname, verbose, failfast)
def load_wiki_plugins():
load('wiki_plugin', verbose=False)
# -*- coding: utf-8 -*-
from django.utils.importlib import import_module
_cache = {}
_settings_forms = []
_markdown_extensions = []
_article_tabs = []
_sidebar = []
def register(PluginClass):
"""
Register a plugin class. This function will call back your plugin's
constructor.
"""
if PluginClass in _cache.keys():
raise Exception("Plugin class already registered")
plugin = PluginClass()
_cache[PluginClass] = plugin
settings_form = getattr(PluginClass, 'settings_form', None)
if settings_form:
if isinstance(settings_form, basestring):
klassname = settings_form.split(".")[-1]
modulename = ".".join(settings_form.split(".")[:-1])
form_module = import_module(modulename)
settings_form = getattr(form_module, klassname)
_settings_forms.append(settings_form)
if getattr(PluginClass, 'article_tab', None):
_article_tabs.append(plugin)
if getattr(PluginClass, 'sidebar', None):
_sidebar.append(plugin)
_markdown_extensions.extend(getattr(PluginClass, 'markdown_extensions', []))
def get_plugins():
"""Get loaded plugins - do not call before all plugins are loaded."""
return _cache
def get_markdown_extensions():
"""Get all markdown extension classes from plugins"""
return _markdown_extensions
def get_article_tabs():
"""Get all article tab dictionaries from plugins"""
return _article_tabs
def get_sidebar():
"""Returns plugin classes that should connect to the sidebar"""
return _sidebar
def get_settings_forms():
return _settings_forms
\ No newline at end of file
...@@ -12,7 +12,7 @@ from wiki import models ...@@ -12,7 +12,7 @@ from wiki import models
from wiki.editors import getEditor from wiki.editors import getEditor
from wiki.core.diff import simple_merge from wiki.core.diff import simple_merge
from django.forms.widgets import HiddenInput from django.forms.widgets import HiddenInput
from wiki.core import baseplugin from wiki.core.plugins.base import PluginSettingsFormMixin
class CreateRootForm(forms.Form): class CreateRootForm(forms.Form):
...@@ -225,7 +225,7 @@ class DeleteForm(forms.Form): ...@@ -225,7 +225,7 @@ class DeleteForm(forms.Form):
return cd return cd
class PermissionsForm(baseplugin.PluginSettingsFormMixin, forms.ModelForm): class PermissionsForm(PluginSettingsFormMixin, forms.ModelForm):
settings_form_headline = _(u'Permissions') settings_form_headline = _(u'Permissions')
settings_order = 5 settings_order = 5
......
...@@ -44,7 +44,7 @@ if not 'south' in django_settings.INSTALLED_APPS: ...@@ -44,7 +44,7 @@ if not 'south' in django_settings.INSTALLED_APPS:
# PLUGINS # PLUGINS
###################### ######################
from wiki.core.plugins_load import load_wiki_plugins from wiki.core.plugins.loader import load_wiki_plugins
load_wiki_plugins() load_wiki_plugins()
......
...@@ -7,7 +7,8 @@ from django.utils.safestring import mark_safe ...@@ -7,7 +7,8 @@ from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from wiki.conf import settings from wiki.conf import settings
from wiki.core import article_markdown, plugins_registry from wiki.core import article_markdown
from wiki.core.plugins import registry as plugin_registry
from wiki import managers from wiki import managers
from mptt.models import MPTTModel from mptt.models import MPTTModel
...@@ -156,7 +157,7 @@ class Article(models.Model): ...@@ -156,7 +157,7 @@ class Article(models.Model):
content = preview_content content = preview_content
else: else:
content = self.current_revision.content content = self.current_revision.content
extensions = plugins_registry.get_markdown_extensions() extensions = plugin_registry.get_markdown_extensions()
return mark_safe(article_markdown(content, self, extensions=extensions)) return mark_safe(article_markdown(content, self, extensions=extensions))
......
...@@ -2,14 +2,15 @@ ...@@ -2,14 +2,15 @@
from django.conf.urls.defaults import patterns, url from django.conf.urls.defaults import patterns, url
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from wiki.core import plugins_registry, baseplugin from wiki.core.plugins import registry
from wiki.core.plugins.base import BasePlugin
from wiki.plugins.attachments import views from wiki.plugins.attachments import views
from wiki.plugins.attachments import models from wiki.plugins.attachments import models
from wiki.plugins.attachments import settings from wiki.plugins.attachments import settings
from wiki.plugins.attachments.markdown_extensions import AttachmentExtension from wiki.plugins.attachments.markdown_extensions import AttachmentExtension
from wiki.plugins.notifications import ARTICLE_EDIT from wiki.plugins.notifications import ARTICLE_EDIT
class AttachmentPlugin(baseplugin.BasePlugin): class AttachmentPlugin(BasePlugin):
#settings_form = 'wiki.plugins.notifications.forms.SubscriptionForm' #settings_form = 'wiki.plugins.notifications.forms.SubscriptionForm'
...@@ -44,5 +45,5 @@ class AttachmentPlugin(baseplugin.BasePlugin): ...@@ -44,5 +45,5 @@ class AttachmentPlugin(baseplugin.BasePlugin):
#print "I WAS LOADED!" #print "I WAS LOADED!"
pass pass
plugins_registry.register(AttachmentPlugin) registry.register(AttachmentPlugin)
from django import forms from django import forms
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from wiki.core.baseplugin import PluginSidebarFormMixin from wiki.core.plugins.base import PluginSidebarFormMixin
from wiki.plugins.images import models from wiki.plugins.images import models
......
...@@ -2,11 +2,12 @@ ...@@ -2,11 +2,12 @@
from django.conf.urls.defaults import patterns, url from django.conf.urls.defaults import patterns, url
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from wiki.core import plugins_registry, baseplugin from wiki.core.plugins import registry
from wiki.core.plugins.base import BasePlugin
from wiki.plugins.images import views, models, settings, forms from wiki.plugins.images import views, models, settings, forms
from wiki.plugins.notifications import ARTICLE_EDIT from wiki.plugins.notifications import ARTICLE_EDIT
class ImagePlugin(baseplugin.BasePlugin): class ImagePlugin(BasePlugin):
#settings_form = 'wiki.plugins.notifications.forms.SubscriptionForm' #settings_form = 'wiki.plugins.notifications.forms.SubscriptionForm'
...@@ -40,5 +41,5 @@ class ImagePlugin(baseplugin.BasePlugin): ...@@ -40,5 +41,5 @@ class ImagePlugin(baseplugin.BasePlugin):
#print "I WAS LOADED!" #print "I WAS LOADED!"
pass pass
plugins_registry.register(ImagePlugin) registry.register(ImagePlugin)
...@@ -6,9 +6,9 @@ from django.contrib.contenttypes.models import ContentType ...@@ -6,9 +6,9 @@ from django.contrib.contenttypes.models import ContentType
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from wiki.plugins.notifications import ARTICLE_EDIT from wiki.plugins.notifications import ARTICLE_EDIT
from wiki.core import baseplugin from wiki.core.plugins.base import PluginSettingsFormMixin
class SubscriptionForm(baseplugin.PluginSettingsFormMixin, forms.Form): class SubscriptionForm(PluginSettingsFormMixin, forms.Form):
settings_form_headline = _(u'Notifications') settings_form_headline = _(u'Notifications')
settings_order = 1 settings_order = 1
......
...@@ -7,7 +7,7 @@ from django_notify import notify ...@@ -7,7 +7,7 @@ from django_notify import notify
from django_notify.models import Subscription from django_notify.models import Subscription
from wiki import models as wiki_models from wiki import models as wiki_models
from wiki.core import plugins_registry from wiki.core.plugins import registry
from wiki.plugins.notifications import ARTICLE_EDIT #TODO: Is this bad practice? from wiki.plugins.notifications import ARTICLE_EDIT #TODO: Is this bad practice?
from wiki.plugins.notifications import settings from wiki.plugins.notifications import settings
...@@ -55,7 +55,7 @@ signals.post_save.connect(post_article_revision_save, sender=wiki_models.Article ...@@ -55,7 +55,7 @@ signals.post_save.connect(post_article_revision_save, sender=wiki_models.Article
################################################## ##################################################
# NOTIFICATIONS FOR PLUGINS # NOTIFICATIONS FOR PLUGINS
################################################## ##################################################
for plugin in plugins_registry.get_plugins(): for plugin in registry.get_plugins():
notifications = getattr(plugin, 'notifications', []) notifications = getattr(plugin, 'notifications', [])
for notification_dict in notifications: for notification_dict in notifications:
......
from wiki.core import plugins_registry, baseplugin from wiki.core.plugins import registry
from wiki.core.plugins.base import BasePlugin
class NotifyPlugin(baseplugin.BasePlugin): class NotifyPlugin(BasePlugin):
settings_form = 'wiki.plugins.notifications.forms.SubscriptionForm' settings_form = 'wiki.plugins.notifications.forms.SubscriptionForm'
def __init__(self): def __init__(self):
#print "I WAS LOADED!"
pass pass
plugins_registry.register(NotifyPlugin) registry.register(NotifyPlugin)
\ No newline at end of file \ No newline at end of file
...@@ -3,7 +3,7 @@ from django.conf.urls.defaults import patterns, url, include ...@@ -3,7 +3,7 @@ from django.conf.urls.defaults import patterns, url, include
from wiki.views import article, accounts from wiki.views import article, accounts
from wiki.conf import settings from wiki.conf import settings
from wiki.core import plugins_registry from wiki.core.plugins import registry
urlpatterns = patterns('', urlpatterns = patterns('',
url('^$', article.ArticleView.as_view(), name='root', kwargs={'path': ''}), url('^$', article.ArticleView.as_view(), name='root', kwargs={'path': ''}),
...@@ -38,7 +38,7 @@ urlpatterns += patterns('', ...@@ -38,7 +38,7 @@ urlpatterns += patterns('',
) )
for plugin in plugins_registry._cache.values(): for plugin in registry.get_plugins().values():
slug = getattr(plugin, 'slug', None) slug = getattr(plugin, 'slug', None)
plugin_urlpatterns = getattr(plugin, 'urlpatterns', None) plugin_urlpatterns = getattr(plugin, 'urlpatterns', None)
if slug and plugin_urlpatterns: if slug and plugin_urlpatterns:
......
...@@ -14,7 +14,7 @@ from django.views.generic.list import ListView ...@@ -14,7 +14,7 @@ from django.views.generic.list import ListView
from wiki.views.mixins import ArticleMixin from wiki.views.mixins import ArticleMixin
from wiki import editors, forms, models from wiki import editors, forms, models
from wiki.conf import settings from wiki.conf import settings
from wiki.core import plugins_registry from wiki.core.plugins import registry as plugin_registry
from wiki.core.diff import simple_merge from wiki.core.diff import simple_merge
from wiki.decorators import get_article, json_view from wiki.decorators import get_article, json_view
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
...@@ -223,7 +223,7 @@ class Edit(FormView, ArticleMixin): ...@@ -223,7 +223,7 @@ class Edit(FormView, ArticleMixin):
@method_decorator(get_article(can_write=True)) @method_decorator(get_article(can_write=True))
def dispatch(self, request, article, *args, **kwargs): def dispatch(self, request, article, *args, **kwargs):
self.sidebar_plugins = plugins_registry.get_sidebar() self.sidebar_plugins = plugin_registry.get_sidebar()
self.sidebar_forms = [] self.sidebar_forms = []
return super(Edit, self).dispatch(request, article, *args, **kwargs) return super(Edit, self).dispatch(request, article, *args, **kwargs)
...@@ -389,7 +389,7 @@ class Plugin(View): ...@@ -389,7 +389,7 @@ class Plugin(View):
def dispatch(self, request, path=None, slug=None, **kwargs): def dispatch(self, request, path=None, slug=None, **kwargs):
kwargs['path'] = path kwargs['path'] = path
for plugin in plugins_registry._cache.values(): for plugin in plugin_registry.get_plugins().values():
if getattr(plugin, 'slug', None) == slug: if getattr(plugin, 'slug', None) == slug:
return plugin.article_view(request, **kwargs) return plugin.article_view(request, **kwargs)
...@@ -407,7 +407,7 @@ class Settings(ArticleMixin, TemplateView): ...@@ -407,7 +407,7 @@ class Settings(ArticleMixin, TemplateView):
""" """
Return all settings forms that can be filled in Return all settings forms that can be filled in
""" """
settings_forms = [F for F in plugins_registry._settings_forms] settings_forms = [F for F in plugin_registry.get_settings_forms()]
if (self.request.user.has_perm('wiki.assign') or if (self.request.user.has_perm('wiki.assign') or
self.article.owner == self.request.user): self.article.owner == self.request.user):
settings_forms.append(self.permission_form_class) settings_forms.append(self.permission_form_class)
......
from django.views.generic.base import TemplateResponseMixin from django.views.generic.base import TemplateResponseMixin
from wiki.core import plugins_registry from wiki.core.plugins import registry
from wiki.conf import settings from wiki.conf import settings
class ArticleMixin(TemplateResponseMixin): class ArticleMixin(TemplateResponseMixin):
...@@ -20,7 +20,7 @@ class ArticleMixin(TemplateResponseMixin): ...@@ -20,7 +20,7 @@ class ArticleMixin(TemplateResponseMixin):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
kwargs['urlpath'] = self.urlpath kwargs['urlpath'] = self.urlpath
kwargs['article'] = self.article kwargs['article'] = self.article
kwargs['article_tabs'] = plugins_registry.get_article_tabs() kwargs['article_tabs'] = registry.get_article_tabs()
kwargs['children_slice'] = self.children_slice[:20] kwargs['children_slice'] = self.children_slice[:20]
kwargs['children_slice_more'] = len(self.children_slice) > 20 kwargs['children_slice_more'] = len(self.children_slice) > 20
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment