-
Notifications
You must be signed in to change notification settings - Fork 12
/
service.py
100 lines (77 loc) · 2.92 KB
/
service.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
from extend_me import ExtensibleByHashType
__all__ = ('get_service_class', 'ServiceBase', 'ServiceManager')
class ServiceManager(object):
""" Class to hold services related to specific proxy and to
automaticaly clean service cached on update of service classes
Usage:
services = ServiceManager(erp_proxy)
services.list # get list of registered services
services.object # returns service with name 'object'
services['common'] # returns service with name 'common'
services.get_service('report') # returns service with name 'report'
"""
__managers = []
@classmethod
def clean_caches(cls):
""" Cleans saved service instances, so on next access new service instances will be generated.
This usualy happens when new service extension enabled (new class inherited from ServiceBase created)
"""
for manager in cls.__managers:
manager.clean_cache()
def __new__(cls, *args, **kwargs):
inst = super(ServiceManager, cls).__new__(cls, *args, **kwargs)
cls.__managers.append(inst)
return inst
def __init__(self, erp_proxy):
self._erp_proxy = erp_proxy
self.__services = {}
def __dir__(self):
res = set(dir(super(ServiceManager, self)))
res.update(self.list)
return list(res)
@property
def list(self):
""" Returns list of all registered services
"""
return list(set(self.__services.keys() + ServiceType.get_registered_names()))
def get_service(self, name):
""" Returns instance of service with specified name
"""
service = self.__services.get(name, None)
if service is None:
cls = get_service_class(name)
srv = self._erp_proxy.connection.get_service(name)
service = cls(srv, self._erp_proxy)
self.__services[name] = service
return service
def clean_cache(self):
""" Cleans service cache
"""
self.__services = {}
def __getattr__(self, name):
return self.get_service(name)
def __getitem__(self, name):
return self.get_service(name)
ServiceType = ExtensibleByHashType._('Service', hashattr='name')
def get_service_class(name):
""" Return service class specified by it's name
"""
return ServiceType.get_class(name, default=True)
class ServiceBase(object):
""" Base class for all Services
"""
__metaclass__ = ServiceType
def __init__(self, service, erp_proxy):
self._erp_proxy = erp_proxy
self._service = service
@property
def proxy(self):
""" Related Client instance
"""
return self._erp_proxy
def __getattribute__(self, name):
try:
res = super(ServiceBase, self).__getattribute__(name)
except AttributeError:
res = getattr(self._service, name)
return res