providers.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from importlib import import_module
  2. from misago.conf import settings
  3. # Manager for permission providers
  4. class PermissionProviders(object):
  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. """
  28. registers ACL annotator for specified types
  29. """
  30. self._annotators.setdefault(hashable_type, []).append(func)
  31. def acl_serializer(self, hashable_type, func):
  32. """
  33. registers ACL serializer for specified types
  34. """
  35. self._serializers.setdefault(hashable_type, []).append(func)
  36. def get_type_annotators(self, obj):
  37. self._assert_providers_registered()
  38. return self._annotators.get(obj.__class__, [])
  39. def get_type_serializers(self, obj):
  40. self._assert_providers_registered()
  41. return self._serializers.get(obj.__class__, [])
  42. def list(self):
  43. self._assert_providers_registered()
  44. return self._providers
  45. def dict(self):
  46. self._assert_providers_registered()
  47. return self._providers_dict
  48. providers = PermissionProviders()