merge
authorSylvain <syt@logilab.fr>
Wed, 14 Jan 2009 17:16:33 +0100
changeset 412 5b3fd2f2ce9b
parent 411 c3d08d95693b (current diff)
parent 408 a8814ff6824e (diff)
child 413 a7366dd3c33c
merge
--- a/web/facet.py	Wed Jan 14 17:16:15 2009 +0100
+++ b/web/facet.py	Wed Jan 14 17:16:33 2009 +0100
@@ -2,7 +2,7 @@
 a search
 
 :organization: Logilab
-:copyright: 2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+:copyright: 2008-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
 """
 __docformat__ = "restructuredtext en"
@@ -19,7 +19,7 @@
 from rql import parse, nodes
 
 from cubicweb import Unauthorized, typed_eid
-from cubicweb.common.selectors import contextprop_selector, one_has_relation_selector
+from cubicweb.common.selectors import match_context_prop, one_has_relation
 from cubicweb.common.registerers import priority_registerer
 from cubicweb.common.appobject import AppRsetObject
 from cubicweb.common.utils import AcceptMixIn
@@ -226,6 +226,8 @@
         # we can also remove all variables which are linked to this variable
         # and have no path to the main variable
         for ovarname in linkedvars:
+            if ovarname == mainvar.name:
+                continue
             if not has_path(vargraph, ovarname, mainvar.name):
                 toremove.add(rqlst.defined_vars[ovarname])            
 
@@ -332,7 +334,7 @@
         
 
 class RelationFacet(VocabularyFacet):
-    __selectors__ = (one_has_relation_selector, contextprop_selector)
+    __selectors__ = (one_has_relation, match_context_prop)
     # class attributes to configure the relation facet
     rtype = None
     role = 'subject'
--- a/web/test/unittest_views_searchrestriction.py	Wed Jan 14 17:16:15 2009 +0100
+++ b/web/test/unittest_views_searchrestriction.py	Wed Jan 14 17:16:33 2009 +0100
@@ -1,40 +1,20 @@
 from cubicweb.devtools.apptest import EnvBasedTC
-from cubicweb.web.views.searchrestriction import insert_attr_select_relation
-
-class ExtractFilterFieldsTC(EnvBasedTC):
-    def test_relations_cleanup(self):
-        self.skip('test needs to be updated (facet API changed)')
-        # removing relation should be done in the table filter form but not
-        # from the facets box
-        rset = self.execute('Any X, S WHERE X in_state S')
-        afielddefs, baserql, groupby, orderby = extract_filter_fields(rset, 0)
-        afielddefs = [(getattr(r, 'r_type', r), role, type) for r, role, type, values in afielddefs]
-        self.assertEquals(afielddefs, [('has_text', 'subject', 'rstring'),
-                                       ('in_state', 'subject', 'eid')])
-        self.assertEquals(baserql, 'DISTINCT Any X,S')
-        self.assertEquals(groupby, '')
-        self.assertEquals(orderby, '')
-        # test rql st state
-        self.assertEquals(rset.syntax_tree().as_string(), 'Any X,S WHERE X in_state S')
-        afielddefs, baserql, groupby, orderby = extract_filter_fields(rset, 0, removerels=False)
-        afielddefs = [(getattr(r, 'r_type', r), role, type) for r, role, type, values in afielddefs]
-        self.assertEquals(afielddefs, [('has_text', 'subject', 'rstring'),
-                                       ('in_state', 'subject', 'eid')])
-        self.assertEquals(baserql, 'DISTINCT Any X,S WHERE X in_state S')
+from cubicweb.web.facet import insert_attr_select_relation, prepare_facets_rqlst
 
 
 class InsertAttrRelationTC(EnvBasedTC):
-    def setUp(self):
-        self.skip('test needs to be updated (facet API changed)')
 
     def parse(self, query):
         rqlst = self.vreg.parse(self.session, query)
         select = rqlst.children[0]
+        # XXX done in real life?
         select.remove_groups()
-        return select
+        return rqlst
 
-    def _generate(self, select, rel, var, attr):
-        return insert_attr_select_relation(select, select.defined_vars[var], 'subject', rel, attr)
+    def _generate(self, rqlst, rel, role, attr):
+        mainvar = prepare_facets_rqlst(rqlst)[0]
+        insert_attr_select_relation(rqlst.children[0], mainvar, rel, role, attr)
+        return rqlst.as_string()
         
     @property
     def select(self):
@@ -46,26 +26,34 @@
                           'B in_group P, P name "managers"')
     
     def test_1(self):
-        self.assertEquals(self._generate(self.select, 'in_state', 'S', 'name'),
-                          "DISTINCT Any S,A ORDERBY A WHERE B in_state S, B in_group P, "
-                          "P name 'managers', S name A, B is EUser")
+        self.assertEquals(self._generate(self.select, 'in_state', 'subject', 'name'),
+                          "DISTINCT Any A,C ORDERBY C WHERE B in_group P, P name 'managers', "
+                          "B in_state A, A name C, B is EUser")
         
     def test_2(self):
-        self.assertEquals(self._generate(self.select, 'tags', 'T', 'name'),
-                          "DISTINCT Any T,TN ORDERBY TN WHERE T tags B, T name TN, "
-                          "B in_group P, P name 'managers', B is EUser")
+        self.assertEquals(self._generate(self.select, 'tags', 'object', 'name'),
+                          "DISTINCT Any A,C ORDERBY C WHERE B in_group P, P name 'managers', "
+                          "A tags B, A name C, B is EUser")
         
     def test_3(self):
-        self.assertEquals(self._generate(self.select, 'created_by', 'U', 'login'),
-                          "DISTINCT Any U,A ORDERBY A WHERE B created_by U, B in_group P, "
-                          "P name 'managers', U login A, B is EUser")
+        self.assertEquals(self._generate(self.select, 'created_by', 'subject', 'login'),
+                          "DISTINCT Any A,C ORDERBY C WHERE B in_group P, P name 'managers', "
+                          "B created_by A, A login C, B is EUser")
+        
+    def test_4(self):
+        self.assertEquals(self._generate(self.parse('Any X WHERE X is EUser'), 'created_by', 'subject', 'login'),
+                          "DISTINCT Any A,B ORDERBY B WHERE X is EUser, X created_by A, A login B")
+        
+    def test_5(self):
+        self.assertEquals(self._generate(self.parse('Any X,L WHERE X is EUser, X login L'), 'created_by', 'subject', 'login'),
+                          "DISTINCT Any A,B ORDERBY B WHERE X is EUser, X created_by A, A login B")
         
     def test_nonregr1(self):
         select = self.parse('Any T,V WHERE T bookmarked_by V?, '
                             'V in_state VS, VS name "published", T created_by U')
-        self.assertEquals(self._generate(select, 'created_by', 'U', 'login'),
-                          'DISTINCT Any U,A ORDERBY A WHERE T created_by U, U login A, '
-                          'T is Bookmark')
+        self.assertEquals(self._generate(select, 'created_by', 'subject', 'login'),
+                          "DISTINCT Any A,B ORDERBY B WHERE T created_by U, "
+                          "T created_by A, A login B, T is Bookmark")
 
     def test_nonregr2(self):
         #'DISTINCT Any X,TMP,N WHERE P name TMP, X version_of P, P is Project, X is Version, not X in_state S,S name "published", X num N ORDERBY TMP,N'
@@ -75,8 +63,10 @@
         for s, o in rschema.iter_rdefs():
             rschema.set_rproperty(s, o, 'cardinality', '++')
         try:
-            self.assertEquals(self._generate(select, 'in_state', 'VS', 'name'),
-                              "DISTINCT Any VS,A ORDERBY A WHERE V is EUser, NOT V in_state VS, VS name 'published', VS name A")
+            self.assertEquals(self._generate(select, 'in_state', 'subject', 'name'),
+                              "DISTINCT Any A,B ORDERBY B WHERE V is EUser, "
+                              "NOT V in_state VS, VS name 'published', "
+                              "V in_state A, A name B")
         finally:
             for s, o in rschema.iter_rdefs():
                 rschema.set_rproperty(s, o, 'cardinality', '**')
@@ -84,8 +74,8 @@
     def test_nonregr3(self):
         #'DISTINCT Any X,TMP,N WHERE P name TMP, X version_of P, P is Project, X is Version, not X in_state S,S name "published", X num N ORDERBY TMP,N'
         select = self.parse('DISTINCT Any X, MAX(Y) GROUPBY X WHERE X is EUser, Y is Bookmark, X in_group A')
-        self.assertEquals(self._generate(select, 'in_group', 'A', 'name'),
-                          "DISTINCT Any A,B ORDERBY B WHERE X is EUser, X in_group A, A name B")
+        self.assertEquals(self._generate(select, 'in_group', 'subject', 'name'),
+                          "DISTINCT Any B,C ORDERBY C WHERE X is EUser, X in_group B, B name C")
 
         
 if __name__ == '__main__':
--- a/web/views/basecontrollers.py	Wed Jan 14 17:16:15 2009 +0100
+++ b/web/views/basecontrollers.py	Wed Jan 14 17:16:33 2009 +0100
@@ -4,7 +4,7 @@
 
 
 :organization: Logilab
-:copyright: 2001-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
 """
 __docformat__ = "restructuredtext en"
@@ -27,7 +27,7 @@
 from cubicweb.web.views import vid_from_rset
 try:
     from cubicweb.web.facet import (FilterRQLBuilder, get_facet,
-                                 prepare_facets_rqlst)
+                                    prepare_facets_rqlst)
     HAS_SEARCH_RESTRICTION = True
 except ImportError: # gae
     HAS_SEARCH_RESTRICTION = False