21 # import local interfaces |
21 # import local interfaces |
22 |
22 |
23 # import Zope3 packages |
23 # import Zope3 packages |
24 |
24 |
25 # import local packages |
25 # import local packages |
|
26 from ztfy.utils.request import queryRequest, getRequestData, setRequestData |
|
27 from ztfy.utils.session import getSessionData, setSessionData |
26 |
28 |
27 |
29 |
28 class cached(object): |
30 class cached(object): |
29 """Custom property decorator to define a property or function |
31 """Custom property decorator to define a property or function |
30 which is calculated only once |
32 which is calculated only once |
61 def __get__(self, obj, cls): |
63 def __get__(self, obj, cls): |
62 if obj is None: |
64 if obj is None: |
63 return self |
65 return self |
64 obj.__dict__[self.__name__] = result = self.fget(obj) |
66 obj.__dict__[self.__name__] = result = self.fget(obj) |
65 return result |
67 return result |
|
68 |
|
69 |
|
70 _marker = object() |
|
71 |
|
72 class request_property(object): |
|
73 """Define a request cached property""" |
|
74 |
|
75 def __init__(self, fget, key=None): |
|
76 self.fget = fget |
|
77 if key is None: |
|
78 key = "%s.%s" % (fget.__module__, fget.__name__) |
|
79 self.key = key |
|
80 |
|
81 def __get__(self, obj, cls): |
|
82 if obj is None: |
|
83 return self |
|
84 request = queryRequest() |
|
85 data = getRequestData(self.key, request, _marker) |
|
86 if data is _marker: |
|
87 data = self.fget(obj) |
|
88 setRequestData(self.key, data, request) |
|
89 return data |
|
90 |
|
91 |
|
92 class session_property(object): |
|
93 """Define a property for which computed value is stored into session""" |
|
94 |
|
95 def __init__(self, fget, app, key=None): |
|
96 self.fget = fget |
|
97 self.app = app |
|
98 if key is None: |
|
99 key = "%s.%s" % (fget.__module__, fget.__name__) |
|
100 self.key = key |
|
101 |
|
102 def __get__(self, obj, cls): |
|
103 if obj is None: |
|
104 return self |
|
105 request = queryRequest() |
|
106 data = getSessionData(request, self.app, self.key, _marker) |
|
107 if data is _marker: |
|
108 data = self.fget(obj) |
|
109 setSessionData(request, self.app, self.key, data) |
|
110 return data |