67 return result |
67 return result |
68 |
68 |
69 |
69 |
70 _marker = object() |
70 _marker = object() |
71 |
71 |
72 class request_property(object): |
72 def request_property(key): |
73 """Define a request cached property""" |
73 """Define a method decorator used to store result into request's annotations |
74 |
74 |
75 def __init__(self, fget, key=None): |
75 `key` is a required argument; if None, the key will be the method's object |
76 self.fget = fget |
76 """ |
77 if key is None: |
|
78 key = "%s.%s" % (fget.__module__, fget.__name__) |
|
79 self.key = key |
|
80 |
77 |
81 def __get__(self, obj, cls): |
78 def request_decorator(func): |
82 if obj is None: |
79 def wrapper(obj, key, *args, **kwargs): |
83 return self |
80 request = queryRequest() |
84 request = queryRequest() |
81 if callable(key): |
85 data = getRequestData(self.key, request, _marker) |
82 key = key(obj) |
86 if data is _marker: |
83 if not key: |
87 data = self.fget(obj) |
84 key = '{0!r}'.format(obj) |
88 setRequestData(self.key, data, request) |
85 data = getRequestData(key, request, _marker) |
89 return data |
86 if data is _marker: |
|
87 data = func |
|
88 if callable(data): |
|
89 data = data(obj, *args, **kwargs) |
|
90 setRequestData(key, data, request) |
|
91 return data |
|
92 return lambda x: wrapper(x, key=key) |
|
93 |
|
94 return request_decorator |
90 |
95 |
91 |
96 |
92 class session_property(object): |
97 class session_property(object): |
93 """Define a property for which computed value is stored into session""" |
98 """Define a property for which computed value is stored into session""" |
94 |
99 |