12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- from importlib import import_module
- from django.conf import settings
- __ALL__ = ['providers']
- # Manager for permission providers
- class PermissionProviders(object):
- def __init__(self):
- self._initialized = False
- self._providers = []
- self._providers_dict = {}
- self._annotators = {}
- self._serializers = {}
- def _assert_providers_registered(self):
- if not self._initialized:
- self._register_providers()
- self._change_lists_to_tupes(self._annotators)
- self._change_lists_to_tupes(self._serializers)
- self._initialized = True
- def _register_providers(self):
- for namespace in settings.MISAGO_ACL_EXTENSIONS:
- self._providers.append((namespace, import_module(namespace)))
- self._providers_dict[namespace] = import_module(namespace)
- if hasattr(self._providers_dict[namespace], 'register_with'):
- self._providers_dict[namespace].register_with(self)
- def _change_lists_to_tupes(self, types_dict):
- for hashType in types_dict.keys():
- types_dict[hashType] = tuple(types_dict[hashType])
- def acl_annotator(self, hashable_type, func):
- """
- registers ACL annotator for specified types
- """
- self._annotators.setdefault(hashable_type, []).append(func)
- def acl_serializer(self, hashable_type, func):
- """
- registers ACL serializer for specified types
- """
- self._serializers.setdefault(hashable_type, []).append(func)
- def get_type_annotators(self, obj):
- self._assert_providers_registered()
- return self._annotators.get(obj.__class__, [])
- def get_type_serializers(self, obj):
- self._assert_providers_registered()
- return self._serializers.get(obj.__class__, [])
- def list(self):
- self._assert_providers_registered()
- return self._providers
- def dict(self):
- self._assert_providers_registered()
- return self._providers_dict
- providers = PermissionProviders()
|