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) |