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):
get_module(app, modname, verbose, failfast)
def load_wiki_plugins():
load('wiki_plugin', verbose=False)
load('wiki_plugin', verbose=True)
# -*- coding: utf-8 -*-
from django.utils.importlib import import_module
_cache = {}
_cache = {}
_settings_forms = []
_markdown_extensions = []
class BasePlugin(object):
#settings_form = YourForm
pass
_article_tabs = []
def register(PluginClass):
"""
......@@ -17,7 +13,8 @@ def register(PluginClass):
"""
if PluginClass in _cache.keys():
raise Exception("Plugin class already registered")
_cache[PluginClass] = PluginClass()
plugin = PluginClass()
_cache[PluginClass] = plugin
settings_form = getattr(PluginClass, 'settings_form', None)
if settings_form:
......@@ -28,10 +25,16 @@ def register(PluginClass):
settings_form = getattr(form_module, klassname)
_settings_forms.append(settings_form)
if PluginClass.article_tab:
_article_tabs.append(plugin)
_markdown_extensions.extend(getattr(PluginClass, 'markdown_extensions', []))
def get_plugins():
return _cache
def get_markdown_extensions():
return _markdown_extensions
\ No newline at end of file
return _markdown_extensions
def get_article_tabs():
return _article_tabs
......@@ -12,6 +12,7 @@ from wiki import models
from wiki.editors import editor
from wiki.core.diff import simple_merge
from django.forms.widgets import HiddenInput
from wiki.plugins import PluginSettingsFormMixin
class CreateRootForm(forms.Form):
......@@ -196,9 +197,33 @@ class CreateForm(forms.Form):
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_order = 5
settings_write_access = False
......@@ -227,26 +252,3 @@ class PermissionsForm(forms.ModelForm):
model = models.Article
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):
self._registry = []
pass
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):
if not isinstance(plugin_instance, WikiPlugin):
raise TypeError("That's not a WikiPlugin")
self._registry.append(plugin_instance)
def get_usermessage(self):
pass
class WikiPlugin():
pass
\ No newline at end of file
......@@ -3,13 +3,14 @@ from django.conf.urls.defaults import patterns, url
from django.utils.translation import ugettext as _
from wiki.core import plugins_registry
from wiki import plugins
from wiki.plugins.attachments import views
from wiki.plugins.attachments import models
from wiki.plugins.attachments import settings
from wiki.plugins.attachments.markdown_extensions import AttachmentExtension
from wiki.plugins.notifications import ARTICLE_EDIT
class AttachmentPlugin(plugins_registry.BasePlugin):
class AttachmentPlugin(plugins.BasePlugin):
#settings_form = 'wiki.plugins.notifications.forms.SubscriptionForm'
......@@ -27,7 +28,6 @@ class AttachmentPlugin(plugins_registry.BasePlugin):
)
article_tab = (_(u'Attachments'), "icon-file")
article_view = views.AttachmentView().dispatch
article_template_append = 'wiki/plugins/attachments/append.html'
# List of notifications to construct signal handlers for. This
# is handled inside the notifications plugin.
......
......@@ -6,10 +6,10 @@ from django.contrib.contenttypes.models import ContentType
from django.utils.safestring import mark_safe
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_order = 1
settings_write_access = False
......
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'
......
......@@ -2,16 +2,15 @@
{% with selected_tab as selected %}
{% for plugin in plugins %}
{% if plugin.article_tab %}
<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 %}">
<span class="{{ plugin.article_tab.1 }}"></span>
{{ plugin.article_tab.0 }}
</a>
</li>
{% endif %}
{% for plugin in article_tabs %}
<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 %}">
<span class="{{ plugin.article_tab.1 }}"></span>
{{ plugin.article_tab.0 }}
</a>
</li>
{% endfor %}
<li class="pull-right{% if selected == "settings" %} active{% endif %}">
{% if not user.is_anonymous %}
<a href="{% url 'wiki:settings' article_id=article.id path=urlpath.path %}">
......
......@@ -20,7 +20,7 @@ class ArticleMixin(TemplateResponseMixin):
def get_context_data(self, **kwargs):
kwargs['urlpath'] = self.urlpath
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_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