60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
from pkg_resources import iter_entry_points
|
|
import logging
|
|
|
|
from django.conf.urls import patterns, include, url
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
PLUGIN_GROUP_NAME = 'portail_citoyen2.plugin'
|
|
|
|
class PluginError(Exception):
|
|
pass
|
|
|
|
def get_plugins(*args, **kwargs):
|
|
plugins = []
|
|
for entrypoint in iter_entry_points(PLUGIN_GROUP_NAME):
|
|
try:
|
|
plugin = entrypoint.load()
|
|
except Exception, e:
|
|
logger.exception('failed to load entrypoint %s', entrypoint)
|
|
raise PluginError('failed to load entrypoint %s' % entrypoint)
|
|
plugins.append(plugin(*args, **kwargs))
|
|
return plugins
|
|
|
|
def register_plugins_urls(urlpatterns):
|
|
pre_urls = []
|
|
post_urls = []
|
|
for plugin in get_plugins():
|
|
if hasattr(plugin, 'get_before_urls'):
|
|
pre_urls.append(url('^', include(plugin.get_before_urls())))
|
|
if hasattr(plugin, 'get_after_urls'):
|
|
post_urls.append(url('^', include(plugin.get_after_urls())))
|
|
pre_patterns = patterns('', *pre_urls)
|
|
post_patterns = patterns('', *post_urls)
|
|
return pre_patterns + urlpatterns + post_patterns
|
|
|
|
def register_plugins_apps(installed_apps):
|
|
for plugin in get_plugins():
|
|
if hasattr(plugin, 'get_apps'):
|
|
apps = plugin.get_apps()
|
|
for app in apps:
|
|
if app not in installed_apps:
|
|
installed_apps += (app, )
|
|
return installed_apps
|
|
|
|
def register_plugins_middleware(middlewares):
|
|
for plugin in get_plugins():
|
|
if hasattr(plugin, 'get_before_middleware'):
|
|
pre_middleware = plugin.get_before_middleware()
|
|
middlewares = tuple(set(pre_middleware + middlewares))
|
|
if hasattr(plugin, 'get_after_middleware'):
|
|
post_middleware = plugin.get_after_middleware()
|
|
middlewares = tuple(set(post_middleware + middlewares))
|
|
return middlewares
|
|
|
|
def init():
|
|
for plugin in get_plugins():
|
|
if hasattr(plugin, 'init'):
|
|
plugin.init()
|
|
|