38 """return a description for a result set""" |
38 """return a description for a result set""" |
39 description = [] |
39 description = [] |
40 for term in selected: |
40 for term in selected: |
41 description.append(term.get_type(solution, args)) |
41 description.append(term.get_type(solution, args)) |
42 return description |
42 return description |
|
43 |
|
44 |
|
45 class hooks_control(object): |
|
46 """context manager to control activated hooks categories. |
|
47 |
|
48 If mode is session.`HOOKS_DENY_ALL`, given hooks categories will |
|
49 be enabled. |
|
50 |
|
51 If mode is session.`HOOKS_ALLOW_ALL`, given hooks categories will |
|
52 be disabled. |
|
53 """ |
|
54 def __init__(self, session, mode, *categories): |
|
55 self.session = session |
|
56 self.mode = mode |
|
57 self.categories = categories |
|
58 |
|
59 def __enter__(self): |
|
60 self.oldmode = self.session.set_hooks_mode(self.mode) |
|
61 if self.mode is self.session.HOOKS_DENY_ALL: |
|
62 self.changes = self.session.enable_hooks_category(*self.categories) |
|
63 else: |
|
64 self.changes = self.session.disable_hooks_category(*self.categories) |
|
65 |
|
66 def __exit__(self, exctype, exc, traceback): |
|
67 if self.changes: |
|
68 if self.mode is self.session.HOOKS_DENY_ALL: |
|
69 self.session.disable_hooks_category(*self.changes) |
|
70 else: |
|
71 self.session.enable_hooks_category(*self.changes) |
|
72 self.session.set_hooks_mode(self.oldmode) |
|
73 |
43 |
74 |
44 |
75 |
45 class Session(RequestSessionBase): |
76 class Session(RequestSessionBase): |
46 """tie session id, user, connections pool and other session data all |
77 """tie session id, user, connections pool and other session data all |
47 together |
78 together |
242 rschema = self.repo.schema[rtype] |
273 rschema = self.repo.schema[rtype] |
243 subjtype = self.describe(eidfrom)[0] |
274 subjtype = self.describe(eidfrom)[0] |
244 objtype = self.describe(eidto)[0] |
275 objtype = self.describe(eidto)[0] |
245 rdef = rschema.rdef(subjtype, objtype) |
276 rdef = rschema.rdef(subjtype, objtype) |
246 return rdef.get(rprop) |
277 return rdef.get(rprop) |
|
278 |
|
279 # hooks activation control ################################################# |
|
280 # all hooks should be activated during normal execution |
|
281 |
|
282 HOOKS_ALLOW_ALL = object() |
|
283 HOOKS_DENY_ALL = object() |
|
284 |
|
285 @property |
|
286 def hooks_mode(self): |
|
287 return getattr(self._threaddata, 'hooks_mode', self.HOOKS_ALLOW_ALL) |
|
288 |
|
289 def set_hooks_mode(self, mode): |
|
290 assert mode is self.HOOKS_ALLOW_ALL or mode is self.HOOKS_DENY_ALL |
|
291 oldmode = getattr(self._threaddata, 'hooks_mode', self.HOOKS_ALLOW_ALL) |
|
292 self._threaddata.hooks_mode = mode |
|
293 return oldmode |
|
294 |
|
295 @property |
|
296 def disabled_hooks_categories(self): |
|
297 try: |
|
298 return getattr(self._threaddata, 'disabled_hooks_cats') |
|
299 except AttributeError: |
|
300 cats = self._threaddata.disabled_hooks_cats = set() |
|
301 return cats |
|
302 |
|
303 @property |
|
304 def enabled_hooks_categories(self): |
|
305 try: |
|
306 return getattr(self._threaddata, 'enabled_hooks_cats') |
|
307 except AttributeError: |
|
308 cats = self._threaddata.enabled_hooks_cats = set() |
|
309 return cats |
|
310 |
|
311 def disable_hooks_category(self, *categories): |
|
312 changes = set() |
|
313 if self.hooks_mode is self.HOOKS_DENY_ALL: |
|
314 enablecats = self.enabled_hooks_categories |
|
315 for category in categories: |
|
316 if category in enablecats: |
|
317 enablecats.remove(category) |
|
318 changes.add(category) |
|
319 else: |
|
320 disablecats = self.disabled_hooks_categories |
|
321 for category in categories: |
|
322 if category not in disablecats: |
|
323 disablecats.add(category) |
|
324 changes.add(category) |
|
325 return tuple(changes) |
|
326 |
|
327 def enable_hooks_category(self, *categories): |
|
328 changes = set() |
|
329 if self.hooks_mode is self.HOOKS_DENY_ALL: |
|
330 enablecats = self.enabled_hooks_categories |
|
331 for category in categories: |
|
332 if category not in enablecats: |
|
333 enablecats.add(category) |
|
334 changes.add(category) |
|
335 else: |
|
336 disablecats = self.disabled_hooks_categories |
|
337 for category in categories: |
|
338 if category in self.disabled_hooks_categories: |
|
339 disablecats.remove(category) |
|
340 changes.add(category) |
|
341 return tuple(changes) |
|
342 |
|
343 def is_hooks_category_activated(self, category): |
|
344 if self.hooks_mode is self.HOOKS_DENY_ALL: |
|
345 return category in self.enabled_hooks_categories |
|
346 return category not in self.disabled_hooks_categories |
|
347 |
|
348 def is_hook_activated(self, hook): |
|
349 return self.is_hooks_category_activated(hook.category) |
247 |
350 |
248 # connection management ################################################### |
351 # connection management ################################################### |
249 |
352 |
250 def keep_pool_mode(self, mode): |
353 def keep_pool_mode(self, mode): |
251 """set pool_mode, e.g. how the session will keep its pool: |
354 """set pool_mode, e.g. how the session will keep its pool: |
714 |
817 |
715 @property |
818 @property |
716 def super_session(self): |
819 def super_session(self): |
717 return self |
820 return self |
718 |
821 |
|
822 @property |
|
823 def hooks_mode(self): |
|
824 return self.parent_session.hooks_mode |
|
825 def set_hooks_mode(self, mode): |
|
826 return self.parent_session.set_hooks_mode(mode) |
|
827 |
|
828 @property |
|
829 def disabled_hooks_categories(self): |
|
830 return self.parent_session.disabled_hooks_categories |
|
831 |
|
832 @property |
|
833 def enabled_hooks_categories(self): |
|
834 return self.parent_session.enabled_hooks_categories |
|
835 |
|
836 |
719 def get_mode(self): |
837 def get_mode(self): |
720 return self.parent_session.mode |
838 return self.parent_session.mode |
721 def set_mode(self, value): |
839 def set_mode(self, value): |
722 self.parent_session.set_mode(value) |
840 self.parent_session.set_mode(value) |
723 mode = property(get_mode, set_mode) |
841 mode = property(get_mode, set_mode) |