133 if not callable(func): |
133 if not callable(func): |
134 return False |
134 return False |
135 |
135 |
136 return func |
136 return func |
137 |
137 |
138 ## |
|
139 ## Core code |
|
140 ## |
|
141 |
|
142 def startNewRequest(self, request): |
|
143 """Prepares core to handle a new request. |
|
144 |
|
145 Args: |
|
146 request: a Django HttpRequest object |
|
147 """ |
|
148 |
|
149 self.in_request = True |
|
150 self.per_request_value = {} |
|
151 self.setRequestValue('request', request) |
|
152 |
|
153 def endRequest(self, request, optional): |
|
154 """Performs cleanup after current request. |
|
155 |
|
156 Args: |
|
157 request: a Django HttpRequest object |
|
158 optional: whether to noop when not in a request |
|
159 """ |
|
160 |
|
161 # already cleaned up, as expected |
|
162 if optional and not self.in_request: |
|
163 return |
|
164 |
|
165 old_request = self.getRequestValue('request') |
|
166 self.per_request_value = {} |
|
167 self.in_request = False |
|
168 |
|
169 if id(old_request) != id(request): |
|
170 logging.error("ending request: \n'%s'\n != \n'%s'\n" % ( |
|
171 old_request, request)) |
|
172 |
|
173 def getRequestValue(self, key, default=None): |
|
174 """Gets a per-request value. |
|
175 |
|
176 Args: |
|
177 key: the key of the to be retrieved value |
|
178 default: the default value (returned if no value is set) |
|
179 """ |
|
180 |
|
181 assert self.in_request |
|
182 return self.per_request_value.get(key, default) |
|
183 |
|
184 def setRequestValue(self, key, value): |
|
185 """Sets a per-request value. |
|
186 |
|
187 Args: |
|
188 key: the key of the to be set value |
|
189 value: the value that should be set |
|
190 """ |
|
191 |
|
192 assert self.in_request |
|
193 self.per_request_value[key] = value |
|
194 |
|
195 def getPatterns(self): |
|
196 """Returns the Django patterns for this site. |
|
197 """ |
|
198 |
|
199 self.callService('registerWithSitemap', True) |
|
200 return defaults.patterns(None, *self.sitemap) |
|
201 |
|
202 @soc.cache.sidebar.cache |
|
203 def getSidebar(self, id, user): |
|
204 """Constructs a sidebar for the current user. |
|
205 """ |
|
206 |
|
207 self.callService('registerWithSidebar', True) |
|
208 |
|
209 sidebar = [] |
|
210 |
|
211 for i in self.sidebar: |
|
212 menus = i(id, user) |
|
213 |
|
214 for menu in (menus if menus else []): |
|
215 sidebar.append(menu) |
|
216 |
|
217 return sorted(sidebar, key=lambda x: x.get('group')) |
|
218 |
|
219 def callService(self, service, unique, *args, **kwargs): |
138 def callService(self, service, unique, *args, **kwargs): |
220 """Calls the specified service on all callbacks. |
139 """Calls the specified service on all callbacks. |
221 """ |
140 """ |
222 |
141 |
223 if unique and (service in self.services): |
142 if unique and (service in self.services): |
234 results.append(result) |
153 results.append(result) |
235 |
154 |
236 self.services.append(service) |
155 self.services.append(service) |
237 return results |
156 return results |
238 |
157 |
|
158 ## |
|
159 ## Core code |
|
160 ## |
|
161 |
|
162 def getRequestValue(self, key, default=None): |
|
163 """Gets a per-request value. |
|
164 |
|
165 Args: |
|
166 key: the key of the to be retrieved value |
|
167 default: the default value (returned if no value is set) |
|
168 """ |
|
169 |
|
170 assert self.in_request |
|
171 return self.per_request_value.get(key, default) |
|
172 |
|
173 def setRequestValue(self, key, value): |
|
174 """Sets a per-request value. |
|
175 |
|
176 Args: |
|
177 key: the key of the to be set value |
|
178 value: the value that should be set |
|
179 """ |
|
180 |
|
181 assert self.in_request |
|
182 self.per_request_value[key] = value |
|
183 |
|
184 def getPatterns(self): |
|
185 """Returns the Django patterns for this site. |
|
186 """ |
|
187 |
|
188 self.callService('registerWithSitemap', True) |
|
189 return defaults.patterns(None, *self.sitemap) |
|
190 |
|
191 @soc.cache.sidebar.cache |
|
192 def getSidebar(self, id, user): |
|
193 """Constructs a sidebar for the current user. |
|
194 """ |
|
195 |
|
196 self.callService('registerWithSidebar', True) |
|
197 |
|
198 sidebar = [] |
|
199 |
|
200 for i in self.sidebar: |
|
201 menus = i(id, user) |
|
202 |
|
203 for menu in (menus if menus else []): |
|
204 sidebar.append(menu) |
|
205 |
|
206 return sorted(sidebar, key=lambda x: x.get('group')) |
|
207 |
|
208 ### |
|
209 ### Core control code |
|
210 ### |
|
211 ### Called by other setup code to get the Core in a desired state. |
|
212 ### |
|
213 |
|
214 def startNewRequest(self, request): |
|
215 """Prepares core to handle a new request. |
|
216 |
|
217 Args: |
|
218 request: a Django HttpRequest object |
|
219 """ |
|
220 |
|
221 self.in_request = True |
|
222 self.per_request_value = {} |
|
223 self.setRequestValue('request', request) |
|
224 |
|
225 def endRequest(self, request, optional): |
|
226 """Performs cleanup after current request. |
|
227 |
|
228 Args: |
|
229 request: a Django HttpRequest object |
|
230 optional: whether to noop when not in a request |
|
231 """ |
|
232 |
|
233 # already cleaned up, as expected |
|
234 if optional and not self.in_request: |
|
235 return |
|
236 |
|
237 old_request = self.getRequestValue('request') |
|
238 self.per_request_value = {} |
|
239 self.in_request = False |
|
240 |
|
241 if id(old_request) != id(request): |
|
242 logging.error("ending request: \n'%s'\n != \n'%s'\n" % ( |
|
243 old_request, request)) |
|
244 |
239 def registerModuleCallbacks(self): |
245 def registerModuleCallbacks(self): |
240 """Retrieves all callbacks for the modules of this site. |
246 """Retrieves all callbacks for the modules of this site. |
241 |
247 |
242 Callbacks for modules without a version number or the wrong API_VERSION |
248 Callbacks for modules without a version number or the wrong API_VERSION |
243 number are dropped. They won't be called. |
249 number are dropped. They won't be called. |