# coding=utf-8
"""
A utilities of permission handler
"""
from __future__ import unicode_literals
import inspect
from django.core.exceptions import ImproperlyConfigured
from permission.compat import import_string, isstr
from permission.conf import settings
[docs]class PermissionHandlerRegistry(object):
"""
A registry class of permission handler
"""
def __init__(self):
self._registry = {}
[docs] def register(self, model, handler=None):
"""
Register a permission handler to the model
Parameters
----------
model : django model class
A django model class
handler : permission handler class, string, or None
A permission handler class or a dotted path
Raises
------
ImproperlyConfigured
Raise when the model is abstract model
KeyError
Raise when the model is already registered in registry
The model cannot have more than one handler.
"""
from permission.handlers import PermissionHandler
if model._meta.abstract:
raise ImproperlyConfigured(
"The model %s is abstract, so it cannot be registered "
"with permission." % model
)
if model in self._registry:
raise KeyError(
"A permission handler class is already " "registered for '%s'" % model
)
if handler is None:
handler = settings.PERMISSION_DEFAULT_PERMISSION_HANDLER
if isstr(handler):
handler = import_string(handler)
if not inspect.isclass(handler):
raise AttributeError(
"`handler` attribute must be a class. " "An instance was specified."
)
if not issubclass(handler, PermissionHandler):
raise AttributeError(
"`handler` attribute must be a subclass of "
"`permission.handlers.PermissionHandler`"
)
# Instantiate the handler to save in the registry
instance = handler(model)
self._registry[model] = instance
[docs] def unregister(self, model):
"""
Unregister a permission handler from the model
Parameters
----------
model : django model class
A django model class
Raises
------
KeyError
Raise when the model have not registered in registry yet.
"""
if model not in self._registry:
raise KeyError(
"A permission handler class have not been "
"registered for '%s' yet" % model
)
# remove from registry
del self._registry[model]
[docs] def get_handlers(self):
"""
Get registered handler instances
Returns
-------
tuple
permission handler tuple
"""
return tuple(self._registry.values())
# Permission handler registry instance
registry = PermissionHandlerRegistry()