server/session.py
changeset 4834 b718626a0e60
parent 4767 74b8e39d4825
child 4835 13b0b96d7982
equal deleted inserted replaced
4833:41a78fb4107c 4834:b718626a0e60
    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)