Commit a1d6ebec by benjaoming

Refactor plugins: Put base classes in wiki.plugins

parent f7f65270
...@@ -35,4 +35,4 @@ def load(modname, verbose=False, failfast=False): ...@@ -35,4 +35,4 @@ def load(modname, verbose=False, failfast=False):
get_module(app, modname, verbose, failfast) get_module(app, modname, verbose, failfast)
def load_wiki_plugins(): def load_wiki_plugins():
load('wiki_plugin', verbose=False) load('wiki_plugin', verbose=True)
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.utils.importlib import import_module from django.utils.importlib import import_module
_cache = {}
_cache = {}
_settings_forms = [] _settings_forms = []
_markdown_extensions = [] _markdown_extensions = []
_article_tabs = []
class BasePlugin(object):
#settings_form = YourForm
pass
def register(PluginClass): def register(PluginClass):
""" """
...@@ -17,7 +13,8 @@ def register(PluginClass): ...@@ -17,7 +13,8 @@ def register(PluginClass):
""" """
if PluginClass in _cache.keys(): if PluginClass in _cache.keys():
raise Exception("Plugin class already registered") raise Exception("Plugin class already registered")
_cache[PluginClass] = PluginClass() plugin = PluginClass()
_cache[PluginClass] = plugin
settings_form = getattr(PluginClass, 'settings_form', None) settings_form = getattr(PluginClass, 'settings_form', None)
if settings_form: if settings_form:
...@@ -28,10 +25,16 @@ def register(PluginClass): ...@@ -28,10 +25,16 @@ def register(PluginClass):
settings_form = getattr(form_module, klassname) settings_form = getattr(form_module, klassname)
_settings_forms.append(settings_form) _settings_forms.append(settings_form)
if PluginClass.article_tab:
_article_tabs.append(plugin)
_markdown_extensions.extend(getattr(PluginClass, 'markdown_extensions', [])) _markdown_extensions.extend(getattr(PluginClass, 'markdown_extensions', []))
def get_plugins(): def get_plugins():
return _cache return _cache
def get_markdown_extensions(): def get_markdown_extensions():
return _markdown_extensions return _markdown_extensions
\ No newline at end of file
def get_article_tabs():
return _article_tabs
...@@ -12,6 +12,7 @@ from wiki import models ...@@ -12,6 +12,7 @@ from wiki import models
from wiki.editors import editor from wiki.editors import editor
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.plugins import PluginSettingsFormMixin
class CreateRootForm(forms.Form): class CreateRootForm(forms.Form):
...@@ -196,9 +197,33 @@ class CreateForm(forms.Form): ...@@ -196,9 +197,33 @@ class CreateForm(forms.Form):
return slug return slug
class PermissionsForm(forms.ModelForm):
class DeleteForm(forms.Form):
def __init__(self, *args, **kwargs):
self.article = kwargs.pop('article')
self.has_children = kwargs.pop('has_children')
super(DeleteForm, self).__init__(*args, **kwargs)
confirm = forms.BooleanField(required=False,
label=_(u'Yes, I am sure'))
purge = forms.BooleanField(widget=HiddenInput(), required=False,
label=_(u'Purge'),
help_text=_(u'Purge the article: Completely remove it (and all its contents) with no undo. Purging is a good idea if you want to free the slug such that users can create new articles in its place.'))
revision = forms.ModelChoiceField(models.ArticleRevision.objects.all(),
widget=HiddenInput(), required=False)
def clean(self):
cd = self.cleaned_data
if not cd['confirm']:
raise forms.ValidationError(_(u'You are not sure enough!'))
if cd['revision'] != self.article.current_revision:
raise forms.ValidationError(_(u'While you tried to delete this article, it was modified. TAKE CARE!'))
return cd
class PermissionsForm(PluginSettingsFormMixin, forms.ModelForm):
settings_form_id = "perms"
settings_form_headline = _(u'Permissions') settings_form_headline = _(u'Permissions')
settings_order = 5 settings_order = 5
settings_write_access = False settings_write_access = False
...@@ -227,26 +252,3 @@ class PermissionsForm(forms.ModelForm): ...@@ -227,26 +252,3 @@ class PermissionsForm(forms.ModelForm):
model = models.Article model = models.Article
fields = ('group', 'group_read', 'group_write', 'other_read', 'other_write') fields = ('group', 'group_read', 'group_write', 'other_read', 'other_write')
class DeleteForm(forms.Form):
def __init__(self, *args, **kwargs):
self.article = kwargs.pop('article')
self.has_children = kwargs.pop('has_children')
super(DeleteForm, self).__init__(*args, **kwargs)
confirm = forms.BooleanField(required=False,
label=_(u'Yes, I am sure'))
purge = forms.BooleanField(widget=HiddenInput(), required=False,
label=_(u'Purge'),
help_text=_(u'Purge the article: Completely remove it (and all its contents) with no undo. Purging is a good idea if you want to free the slug such that users can create new articles in its place.'))
revision = forms.ModelChoiceField(models.ArticleRevision.objects.all(),
widget=HiddenInput(), required=False)
def clean(self):
cd = self.cleaned_data
if not cd['confirm']:
raise forms.ValidationError(_(u'You are not sure enough!'))
if cd['revision'] != self.article.current_revision:
raise forms.ValidationError(_(u'While you tried to delete this article, it was modified. TAKE CARE!'))
return cd
\ No newline at end of file
class Registry(): from django.utils.translation import ugettext as _
class BasePlugin(object):
# Must fill in!
slug = None
# Optional
settings_form = None# A form class to add to the settings tab
urlpatterns = []
article_tab = None #(_(u'Attachments'), "icon-file")
article_view = None # A view for article_id/plugin/slug/
notifications = [] # A list of notification handlers to be subscribed if the notification system is active
# Example
# [{'model': models.AttachmentRevision,
# 'message': lambda obj: _(u"A file was changed: %s") % obj.get_filename(),
# 'key': ARTICLE_EDIT,
# 'created': True,
# 'get_article': lambda obj: obj.attachment.article}
# ]
markdown_extensions = []
def __init__(self): pass
self._registry = []
class PluginSidebarFormMixin(object):
def __init__(self, plugin_instance, *args, **kwargs):
kwargs['prefix'] = plugin_instance.slug
class PluginSettingsFormMixin(object):
settings_form_headline = _(u'Notifications')
settings_order = 1
settings_write_access = False
def register(self, plugin_instance): def get_usermessage(self):
if not isinstance(plugin_instance, WikiPlugin): pass
raise TypeError("That's not a WikiPlugin")
self._registry.append(plugin_instance)
class WikiPlugin():
pass
\ No newline at end of file
...@@ -3,13 +3,14 @@ from django.conf.urls.defaults import patterns, url ...@@ -3,13 +3,14 @@ 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 from wiki.core import plugins_registry
from wiki import plugins
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(plugins_registry.BasePlugin): class AttachmentPlugin(plugins.BasePlugin):
#settings_form = 'wiki.plugins.notifications.forms.SubscriptionForm' #settings_form = 'wiki.plugins.notifications.forms.SubscriptionForm'
...@@ -27,7 +28,6 @@ class AttachmentPlugin(plugins_registry.BasePlugin): ...@@ -27,7 +28,6 @@ class AttachmentPlugin(plugins_registry.BasePlugin):
) )
article_tab = (_(u'Attachments'), "icon-file") article_tab = (_(u'Attachments'), "icon-file")
article_view = views.AttachmentView().dispatch article_view = views.AttachmentView().dispatch
article_template_append = 'wiki/plugins/attachments/append.html'
# List of notifications to construct signal handlers for. This # List of notifications to construct signal handlers for. This
# is handled inside the notifications plugin. # is handled inside the notifications plugin.
......
...@@ -6,10 +6,10 @@ from django.contrib.contenttypes.models import ContentType ...@@ -6,10 +6,10 @@ 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.plugins import PluginSettingsFormMixin
class SubscriptionForm(forms.Form): class SubscriptionForm(PluginSettingsFormMixin, forms.Form):
settings_form_id = "notifications"
settings_form_headline = _(u'Notifications') settings_form_headline = _(u'Notifications')
settings_order = 1 settings_order = 1
settings_write_access = False settings_write_access = False
......
from wiki.core import plugins_registry from wiki.core import plugins_registry
from wiki import plugins
class NotifyPlugin(plugins_registry.BasePlugin): class NotifyPlugin(plugins.BasePlugin):
settings_form = 'wiki.plugins.notifications.forms.SubscriptionForm' settings_form = 'wiki.plugins.notifications.forms.SubscriptionForm'
......
...@@ -2,16 +2,15 @@ ...@@ -2,16 +2,15 @@
{% with selected_tab as selected %} {% with selected_tab as selected %}
{% for plugin in plugins %} {% for plugin in article_tabs %}
{% if plugin.article_tab %} <li class="pull-right{% if selected == plugin.slug %} active{% endif %}">
<li class="pull-right{% if selected == plugin.slug %} active{% endif %}"> <a href="{% url 'wiki:plugin' slug=plugin.slug article_id=article.id path=urlpath.path %}">
<a href="{% url 'wiki:plugin' slug=plugin.slug article_id=article.id path=urlpath.path %}"> <span class="{{ plugin.article_tab.1 }}"></span>
<span class="{{ plugin.article_tab.1 }}"></span> {{ plugin.article_tab.0 }}
{{ plugin.article_tab.0 }} </a>
</a> </li>
</li>
{% endif %}
{% endfor %} {% endfor %}
<li class="pull-right{% if selected == "settings" %} active{% endif %}"> <li class="pull-right{% if selected == "settings" %} active{% endif %}">
{% if not user.is_anonymous %} {% if not user.is_anonymous %}
<a href="{% url 'wiki:settings' article_id=article.id path=urlpath.path %}"> <a href="{% url 'wiki:settings' article_id=article.id path=urlpath.path %}">
......
...@@ -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['plugins'] = plugins_registry._cache.values() kwargs['article_tabs'] = plugins_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