/
providers.py
61 lines (44 loc) · 1.97 KB
/
providers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from importlib import import_module
from misago.conf import settings
class PermissionProviders(object):
"""manager for permission providers"""
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()