selectors.py
branchtls-sprint
changeset 640 8e64f12be69c
parent 634 0badd061ce0f
child 649 e5956e9ebef1
equal deleted inserted replaced
635:305da8d6aa2d 640:8e64f12be69c
   322         if row is None:
   322         if row is None:
   323             for row, rowvalue in enumerate(rset.rows):
   323             for row, rowvalue in enumerate(rset.rows):
   324                 if rowvalue[col] is None: # outer join
   324                 if rowvalue[col] is None: # outer join
   325                     continue
   325                     continue
   326                 try:
   326                 try:
   327                     escore = self.score_entity(rset.get_entity(row, col))
   327                     escore = self.score(req, rset, row, col))
   328                 except NotAnEntity:
   328                 except NotAnEntity:
   329                     return 0
   329                     return 0
   330                 if not escore:
   330                 if not escore:
   331                     return 0
   331                     return 0
   332                 score += escore
   332                 score += escore
   333         else:
   333         else:
   334             etype = rset.description[row][col]
   334             etype = rset.description[row][col]
   335             if etype is not None: # outer join
   335             if etype is not None: # outer join
   336                 try:
   336                 score = self.score(req, rset, row, col)
   337                     score = self.score_entity(rset.get_entity(row, col))
       
   338                 except NotAnEntity:
       
   339                     return 0
       
   340         return score and (score + 1)
   337         return score and (score + 1)
   341 
   338 
       
   339     def score(self, req, rset, row, col):
       
   340         try:
       
   341             return self.score_entity(rset.get_entity(row, col))
       
   342         except NotAnEntity:
       
   343             return 0
       
   344                                  
   342     def score_entity(self, entity):
   345     def score_entity(self, entity):
   343         raise NotImplementedError()
   346         raise NotImplementedError()
   344 
   347 
   345 # not so basic selectors ######################################################
   348 # not so basic selectors ######################################################
   346 
   349 
   610     col (if row is not specified). Return 0 at the first entity scoring to zero.
   613     col (if row is not specified). Return 0 at the first entity scoring to zero.
   611     """
   614     """
   612     def __init__(self, scorefunc):
   615     def __init__(self, scorefunc):
   613         self.score_entity = scorefunc
   616         self.score_entity = scorefunc
   614 
   617 
   615     
   618 
       
   619 class rql_condition(EntitySelector):
       
   620     def __init__(self, expression):
       
   621         if 'U' in frozenset(split_expression(cls.condition)):
       
   622             rql = 'Any X WHERE X eid %%(x)s, U eid %%(u)s, %s' % expression
       
   623         else:
       
   624             rql = 'Any X WHERE X eid %%(x)s, %s' % expression
       
   625         self.rql = rql
       
   626         
       
   627     def score(self, req, rset, row, col):
       
   628         try:
       
   629             return len(req.execute(self.rql, {'x': eid, 'u': req.user.eid}, 'x'))
       
   630         except Unauthorized:
       
   631             return 0
       
   632         
       
   633         
   616 # XXX not so basic selectors ######################################################
   634 # XXX not so basic selectors ######################################################
   617 
       
   618 @lltrace
       
   619 def _rql_condition(cls, req, rset, row=None, col=0, **kwargs):
       
   620     """accept single entity result set if the entity match an rql condition
       
   621     """
       
   622     if cls.condition:
       
   623         eid = rset[row or 0][col or 0]
       
   624         if 'U' in frozenset(split_expression(cls.condition)):
       
   625             rql = 'Any X WHERE X eid %%(x)s, U eid %%(u)s, %s' % cls.condition
       
   626         else:
       
   627             rql = 'Any X WHERE X eid %%(x)s, %s' % cls.condition
       
   628         try:
       
   629             return len(req.execute(rql, {'x': eid, 'u': req.user.eid}, 'x'))
       
   630         except Unauthorized:
       
   631             return 0
       
   632         
       
   633     return 1
       
   634 _rqlcondition_selector = deprecated_function(_rql_condition)
       
   635         
   635         
   636 @lltrace
   636 @lltrace
   637 def but_etype(cls, req, rset, row=None, col=0, **kwargs):
   637 def but_etype(cls, req, rset, row=None, col=0, **kwargs):
   638     """restrict the searchstate_accept_one_selector to exclude entity's type
   638     """restrict the searchstate_accept_one_selector to exclude entity's type
   639     refered by the .etype attribute
   639     refered by the .etype attribute
   755 
   755 
   756 accept = chainall(non_final_entity(), accept_rset, name='accept')
   756 accept = chainall(non_final_entity(), accept_rset, name='accept')
   757 accept_selector = deprecated_function(accept)
   757 accept_selector = deprecated_function(accept)
   758 accept = deprecated_function(accept, 'use implements selector')
   758 accept = deprecated_function(accept, 'use implements selector')
   759 
   759 
   760 # compound selectors ##########################################################
       
   761 
       
   762 accept_one = deprecated_function(chainall(one_line_rset, accept,
   760 accept_one = deprecated_function(chainall(one_line_rset, accept,
   763                                           name='accept_one'))
   761                                           name='accept_one'))
   764 accept_one_selector = deprecated_function(accept_one)
   762 accept_one_selector = deprecated_function(accept_one)
   765 
   763 
   766 rql_condition = chainall(non_final_entity(), one_line_rset, _rql_condition,
   764 
   767                          name='rql_condition')
   765 @lltrace
   768 rqlcondition_selector = deprecated_function(rql_condition)
   766 def _rql_condition(cls, req, rset, row=None, col=0, **kwargs):
   769 
   767     if cls.condition:
       
   768         return rql_condition(cls.condition)(cls, req, rset, row, col)
       
   769     return 1
       
   770 _rqlcondition_selector = deprecated_function(_rql_condition)
       
   771 
       
   772 rqlcondition_selector = deprecated_function(chainall(non_final_entity(), one_line_rset, _rql_condition,
       
   773                          name='rql_condition'))
       
   774 
       
   775 #req_form_params_selector = deprecated_function(match_form_params) # form_params
       
   776 #kwargs_selector = deprecated_function(match_kwargs) # expected_kwargs
       
   777 
       
   778 # compound selectors ##########################################################
   770 
   779 
   771 searchstate_accept = chainall(nonempty_rset, match_search_state, accept,
   780 searchstate_accept = chainall(nonempty_rset, match_search_state, accept,
   772                               name='searchstate_accept')
   781                               name='searchstate_accept')
   773 searchstate_accept_selector = deprecated_function(searchstate_accept)
   782 searchstate_accept_selector = deprecated_function(searchstate_accept)
   774 
   783 
   779 
   788 
   780 searchstate_accept_one_but_etype = chainall(searchstate_accept_one, but_etype,
   789 searchstate_accept_one_but_etype = chainall(searchstate_accept_one, but_etype,
   781                                             name='searchstate_accept_one_but_etype')
   790                                             name='searchstate_accept_one_but_etype')
   782 searchstate_accept_one_but_etype_selector = deprecated_function(
   791 searchstate_accept_one_but_etype_selector = deprecated_function(
   783     searchstate_accept_one_but_etype)
   792     searchstate_accept_one_but_etype)
   784 
       
   785 #req_form_params_selector = deprecated_function(match_form_params) # form_params
       
   786 #kwargs_selector = deprecated_function(match_kwargs) # expected_kwargs
       
   787 
   793 
   788 
   794 
   789 def require_group_compat(registered):
   795 def require_group_compat(registered):
   790     def plug_selector(cls, vreg):
   796     def plug_selector(cls, vreg):
   791         cls = registered(cls, vreg)
   797         cls = registered(cls, vreg)
   803             warn('use "use match_user_groups(group1, group2)" instead of using require_groups',
   809             warn('use "use match_user_groups(group1, group2)" instead of using require_groups',
   804                  DeprecationWarning)
   810                  DeprecationWarning)
   805             cls.__selectors__ += (implements(*cls.accepts),)
   811             cls.__selectors__ += (implements(*cls.accepts),)
   806         return cls
   812         return cls
   807     return classmethod(plug_selector)
   813     return classmethod(plug_selector)
       
   814 
       
   815 def condition_compat(registered):
       
   816     def plug_selector(cls, vreg):
       
   817         cls = registered(cls, vreg)
       
   818         if getattr(cls, 'condition', None):
       
   819             warn('use "use rql_condition(expression)" instead of using condition',
       
   820                  DeprecationWarning)
       
   821             cls.__selectors__ += (rql_condition(cls.condition),)
       
   822         return cls
       
   823     return classmethod(plug_selector)