providers.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from importlib import import_module
  2. from misago.conf import settings
  3. class PermissionProviders(object):
  4. """manager for permission providers"""
  5. def __init__(self):
  6. self._initialized = False
  7. self._providers = []
  8. self._providers_dict = {}
  9. self._annotators = {}
  10. self._serializers = {}
  11. def _assert_providers_registered(self):
  12. if not self._initialized:
  13. self._register_providers()
  14. self._change_lists_to_tupes(self._annotators)
  15. self._change_lists_to_tupes(self._serializers)
  16. self._initialized = True
  17. def _register_providers(self):
  18. for namespace in settings.MISAGO_ACL_EXTENSIONS:
  19. self._providers.append((namespace, import_module(namespace)))
  20. self._providers_dict[namespace] = import_module(namespace)
  21. if hasattr(self._providers_dict[namespace], 'register_with'):
  22. self._providers_dict[namespace].register_with(self)
  23. def _change_lists_to_tupes(self, types_dict):
  24. for hashType in types_dict.keys():
  25. types_dict[hashType] = tuple(types_dict[hashType])
  26. def acl_annotator(self, hashable_type, func):
  27. """registers ACL annotator for specified types"""
  28. self._annotators.setdefault(hashable_type, []).append(func)
  29. def acl_serializer(self, hashable_type, func):
  30. """registers ACL serializer for specified types"""
  31. self._serializers.setdefault(hashable_type, []).append(func)
  32. def get_type_annotators(self, obj):
  33. self._assert_providers_registered()
  34. return self._annotators.get(obj.__class__, [])
  35. def get_type_serializers(self, obj):
  36. self._assert_providers_registered()
  37. return self._serializers.get(obj.__class__, [])
  38. def list(self):
  39. self._assert_providers_registered()
  40. return self._providers
  41. def dict(self):
  42. self._assert_providers_registered()
  43. return self._providers_dict
  44. providers = PermissionProviders()