import contextlib
import six
from shuup.apps.provides import get_provide_objects
from shuup.utils.importing import cached_load, load
_registry = []
[docs]
def register(module_class):
if isinstance(module_class, six.string_types):
module_class = load(module_class, "Admin Module")
_registry.append(module_class())
[docs]
def discover():
for obj in get_provide_objects("admin_module"):
register(obj)
[docs]
def get_admin_modules():
"""
:rtype: list[shuup.admin.base.AdminModule]
"""
if not _registry:
discover()
return iter(_registry)
[docs]
def get_modules():
"""
:rtype: list[shuup.admin.base.AdminModule]
"""
get_modules_spec = cached_load("SHUUP_GET_ADMIN_MODULES_SPEC")
return get_modules_spec()
[docs]
def get_module_urls():
for module in get_modules(): # pragma: no branch
yield from module.get_urls()
[docs]
@contextlib.contextmanager
def replace_modules(new_module_classes):
"""
Context manager to temporarily replace all modules with something else.
Test utility, mostly.
>>> def some_test():
... with replace_modules(["foo.bar:QuuxModule"]):
... pass # do stuff
:param new_module_classes: Iterable of module classes, like you'd pass to `register`
"""
old_registry = _registry[:]
_registry[:] = []
for cls in new_module_classes:
register(cls)
try:
yield
finally:
_registry[:] = old_registry