import functools
import importlib
import logging
from collections import OrderedDict
VIEWDICT = OrderedDict()
[docs]def register(name):
"""
A decorator to register webadmin views. Example::
from netdef.Engines.webadmin import Views
@Views.register("NewView")
def setup(admin, view=None):
if not view:
view = NewView(name='NewView', endpoint='newview')
admin.add_view(view)
...
"""
def classdecorator(name, cls):
VIEWDICT[name] = cls
return cls
return functools.partial(classdecorator, name)
[docs]class Views:
"""
A collection of all loaded webadmin views
"""
def __init__(self, shared=None):
self.items = VIEWDICT
self.add_shared_object(shared)
self.logging = logging.getLogger(__name__)
[docs] def add_shared_object(self, shared):
self.shared = shared
[docs] def load(self, base_packages):
if isinstance(base_packages, str):
base_packages = [base_packages]
added = []
# insert default webadmin views into configfile
activate_views = OrderedDict()
activate_views["Home"] = 1
activate_views["FileModel"] = 1
activate_views["SettingsModel"] = 1
activate_views["SourcesModel"] = 1
activate_views["ExpressionsView"] = 1
activate_views["StatisticsModel"] = 1
activate_views["Tools"] = 1
activate_views["SecurityWebadminView"] = 1
activate_views["SecurityCertificatesView"] = 1
activate_views.update(self.shared.config.get_dict("webadmin_views"))
for name, activate in activate_views.items():
for base_package in base_packages:
if int(activate) and not name in added:
try:
importlib.import_module(
"{}.Engines.webadmin.{}".format(base_package, name)
)
added.append(name)
except ImportError as err:
if isinstance(err.name, str):
if not err.name.startswith(
"{}.Engines.webadmin".format(base_package)
):
if not err.name == "{}.Engines".format(base_package):
raise (err)
else:
raise (err)
for name, activate in activate_views.items():
if int(activate) and not name in added:
self.logging.error("%s not found in %s", name, base_packages)
[docs] def setup(self, admin):
for setup in self.items.values():
setup(admin)