You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.4 KiB
71 lines
2.4 KiB
from django.core.exceptions import ImproperlyConfigured
|
|
from cms.utils.django_load import load
|
|
from smartsnippets.exceptions import WidgetAlreadyRegistered, WidgetNotRegistered
|
|
from smartsnippets.widgets_base import SmartSnippetWidgetBase
|
|
from models import SmartSnippetVariable
|
|
from collections import defaultdict
|
|
|
|
|
|
class WidgetPool(object):
|
|
def __init__(self):
|
|
self.widgets = {}
|
|
self._settings = defaultdict(dict)
|
|
self.discovered = False
|
|
|
|
def discover_widgets(self):
|
|
if self.discovered:
|
|
return
|
|
self.discovered = True
|
|
load('widgets')
|
|
|
|
def register_settings(self, namespace, settings_dict):
|
|
self._settings[namespace].update(settings_dict)
|
|
|
|
def unregister_settings(self, namespace, settings_keys=None):
|
|
if settings_keys:
|
|
for item in settings_keys:
|
|
self._settings[namespace].pop(item, None)
|
|
else:
|
|
self._settings.pop(namespace, None)
|
|
|
|
def register_widget(self, widget):
|
|
if not issubclass(widget, SmartSnippetWidgetBase):
|
|
raise ImproperlyConfigured(
|
|
'Smartsnippets widgets must be subclasses of WidgetBase, %s is not.'
|
|
% widget
|
|
)
|
|
widget_name = widget.__name__
|
|
if widget_name in self.widgets:
|
|
raise WidgetAlreadyRegistered(
|
|
"Cannot register %s, a widget with this name (%s) is already "
|
|
"retgistered." % (widget, widget_name)
|
|
)
|
|
|
|
widget.value = widget_name
|
|
self.widgets[widget_name] = widget
|
|
|
|
def unregister_widget(self, widget):
|
|
widget_name = widget.__name__
|
|
if widget_name not in self.widgets:
|
|
raise WidgetNotRegistered(
|
|
'The widget %s is not registered' % widget
|
|
)
|
|
del self.widgets[widget_name]
|
|
|
|
def get_widget(self, name):
|
|
self.discover_widgets()
|
|
return self.widgets[name]
|
|
|
|
def get_all_widgets(self, has_model=False, snippet=None):
|
|
self.discover_widgets()
|
|
widgets = [x for x in self.widgets.values() if x.model==SmartSnippetVariable]
|
|
widgets.sort(key=lambda obj: unicode(obj.name))
|
|
return widgets
|
|
|
|
def get_settings(self, namespace, name=None):
|
|
self.discover_widgets()
|
|
if not name:
|
|
return self._settings[namespace]
|
|
return self._settings[namespace].get(name, None)
|
|
|
|
widget_pool = WidgetPool()
|
|
|