use relation_possible from within has_relation, fix another bug tls-sprint
authorsylvain.thenault@logilab.fr
Fri, 20 Feb 2009 01:14:15 +0100
branchtls-sprint
changeset 876 f652660ae9a6
parent 875 dd83bd56deae
child 877 decb67772c92
use relation_possible from within has_relation, fix another bug
selectors.py
--- a/selectors.py	Fri Feb 20 01:13:50 2009 +0100
+++ b/selectors.py	Fri Feb 20 01:14:15 2009 +0100
@@ -620,6 +620,7 @@
                 return 0
         return 1
 
+
 class partial_relation_possible(PartialSelectorMixIn, relation_possible):
     """partial version of the relation_possible selector
 
@@ -693,6 +694,7 @@
             return 0
         return 1
 
+
 class partial_may_add_relation(PartialSelectorMixIn, may_add_relation):
     """partial version of the may_add_relation selector
 
@@ -720,7 +722,7 @@
 class has_related_entities(EntitySelector):
     """accept if entity found in the result set has some linked entities using
     the specified relation (optionaly filtered according to the specified target
-    type).
+    type). Checks first if the relation is possible.
     
     See `EntitySelector` documentation for behaviour when row is not specified.
 
@@ -738,6 +740,9 @@
         self.target_etype = target_etype
     
     def score_entity(self, entity):
+        relpossel = relation_possible(self.rtype, self.role, self.target_etype)
+        if not relpossel.score_class(entity.__class__, entity.req):
+            return 0
         rset = entity.related(self.rtype, self.role)
         if self.target_etype:
             return any(x for x, in rset.description if x == self.target_etype)
@@ -821,7 +826,7 @@
                         return 0
                 score += 1
             return score
-        return self.score(req, rset, i, col)
+        return self.score(req, rset, row, col)
     
     def score_entity(self, entity):
         if entity.has_perm(self.action):