5 |
5 |
6 def prepare_rqlst(self): |
6 def prepare_rqlst(self): |
7 req = self.request() |
7 req = self.request() |
8 rset = self.execute('CWUser X') |
8 rset = self.execute('CWUser X') |
9 rqlst = rset.syntax_tree().copy() |
9 rqlst = rset.syntax_tree().copy() |
10 req.vreg.rqlhelper.annotate(rqlst) |
10 filtered_variable, baserql = facet.init_facets(rset, rqlst.children[0]) |
11 mainvar, baserql = facet.prepare_facets_rqlst(rqlst, rset.args) |
11 self.assertEqual(filtered_variable.name, 'X') |
12 self.assertEqual(mainvar.name, 'X') |
|
13 self.assertEqual(baserql, 'Any X WHERE X is CWUser') |
12 self.assertEqual(baserql, 'Any X WHERE X is CWUser') |
14 self.assertEqual(rqlst.as_string(), 'DISTINCT Any WHERE X is CWUser') |
13 self.assertEqual(rqlst.as_string(), 'DISTINCT Any WHERE X is CWUser') |
15 return req, rset, rqlst, mainvar |
14 return req, rset, rqlst, filtered_variable |
16 |
15 |
17 def _in_group_facet(self, cls=facet.RelationFacet, no_relation=False): |
16 def _in_group_facet(self, cls=facet.RelationFacet, no_relation=False): |
18 req, rset, rqlst, mainvar = self.prepare_rqlst() |
17 req, rset, rqlst, filtered_variable = self.prepare_rqlst() |
19 cls.no_relation = no_relation |
18 cls.no_relation = no_relation |
20 f = cls(req, rset=rset, rqlst=rqlst.children[0], |
19 f = cls(req, rset=rset, select=rqlst.children[0], |
21 filtered_variable=mainvar) |
20 filtered_variable=filtered_variable) |
22 f.__regid__ = 'in_group' |
21 f.__regid__ = 'in_group' |
23 f.rtype = 'in_group' |
22 f.rtype = 'in_group' |
24 f.role = 'subject' |
23 f.role = 'subject' |
25 f.target_attr = 'name' |
24 f.target_attr = 'name' |
26 guests, managers = [eid for eid, in self.execute('CWGroup G ORDERBY GN ' |
25 guests, managers = [eid for eid, in self.execute('CWGroup G ORDERBY GN ' |
32 def test_relation_simple(self): |
31 def test_relation_simple(self): |
33 f, (guests, managers) = self._in_group_facet() |
32 f, (guests, managers) = self._in_group_facet() |
34 self.assertEqual(f.vocabulary(), |
33 self.assertEqual(f.vocabulary(), |
35 [(u'guests', guests), (u'managers', managers)]) |
34 [(u'guests', guests), (u'managers', managers)]) |
36 # ensure rqlst is left unmodified |
35 # ensure rqlst is left unmodified |
37 self.assertEqual(f.rqlst.as_string(), 'DISTINCT Any WHERE X is CWUser') |
36 self.assertEqual(f.select.as_string(), 'DISTINCT Any WHERE X is CWUser') |
38 #rqlst = rset.syntax_tree() |
37 #rqlst = rset.syntax_tree() |
39 self.assertEqual(f.possible_values(), |
38 self.assertEqual(f.possible_values(), |
40 [str(guests), str(managers)]) |
39 [str(guests), str(managers)]) |
41 # ensure rqlst is left unmodified |
40 # ensure rqlst is left unmodified |
42 self.assertEqual(f.rqlst.as_string(), 'DISTINCT Any WHERE X is CWUser') |
41 self.assertEqual(f.select.as_string(), 'DISTINCT Any WHERE X is CWUser') |
43 f._cw.form[f.__regid__] = str(guests) |
42 f._cw.form[f.__regid__] = str(guests) |
44 f.add_rql_restrictions() |
43 f.add_rql_restrictions() |
45 # selection is cluttered because rqlst has been prepared for facet (it |
44 # selection is cluttered because rqlst has been prepared for facet (it |
46 # is not in real life) |
45 # is not in real life) |
47 self.assertEqual(f.rqlst.as_string(), |
46 self.assertEqual(f.select.as_string(), |
48 'DISTINCT Any WHERE X is CWUser, X in_group D, D eid %s' % guests) |
47 'DISTINCT Any WHERE X is CWUser, X in_group D, D eid %s' % guests) |
49 |
48 |
50 def test_relation_optional_rel(self): |
49 def test_relation_optional_rel(self): |
51 req = self.request() |
50 req = self.request() |
52 rset = self.execute('Any X,GROUP_CONCAT(GN) GROUPBY X ' |
51 rset = self.execute('Any X,GROUP_CONCAT(GN) GROUPBY X ' |
53 'WHERE X in_group G?, G name GN, NOT G name "users"') |
52 'WHERE X in_group G?, G name GN, NOT G name "users"') |
54 rqlst = rset.syntax_tree().copy() |
53 rqlst = rset.syntax_tree().copy() |
55 req.vreg.rqlhelper.annotate(rqlst) |
54 select = rqlst.children[0] |
56 mainvar, baserql = facet.prepare_facets_rqlst(rqlst, rset.args) |
55 filtered_variable, baserql = facet.init_facets(rset, select) |
57 |
56 |
58 f = facet.RelationFacet(req, rset=rset, |
57 f = facet.RelationFacet(req, rset=rset, |
59 rqlst=rqlst.children[0], |
58 select=select, |
60 filtered_variable=mainvar) |
59 filtered_variable=filtered_variable) |
61 f.rtype = 'in_group' |
60 f.rtype = 'in_group' |
62 f.role = 'subject' |
61 f.role = 'subject' |
63 f.target_attr = 'name' |
62 f.target_attr = 'name' |
64 guests, managers = [eid for eid, in self.execute('CWGroup G ORDERBY GN ' |
63 guests, managers = [eid for eid, in self.execute('CWGroup G ORDERBY GN ' |
65 'WHERE G name GN, G name IN ("guests", "managers")')] |
64 'WHERE G name GN, G name IN ("guests", "managers")')] |
90 [(u'<no relation>', ''), (u'guests', guests), (u'managers', managers)]) |
89 [(u'<no relation>', ''), (u'guests', guests), (u'managers', managers)]) |
91 self.assertEqual(f.possible_values(), |
90 self.assertEqual(f.possible_values(), |
92 [str(guests), str(managers), '']) |
91 [str(guests), str(managers), '']) |
93 f._cw.form[f.__regid__] = '' |
92 f._cw.form[f.__regid__] = '' |
94 f.add_rql_restrictions() |
93 f.add_rql_restrictions() |
95 self.assertEqual(f.rqlst.as_string(), |
94 self.assertEqual(f.select.as_string(), |
96 'DISTINCT Any WHERE X is CWUser, NOT X in_group G') |
95 'DISTINCT Any WHERE X is CWUser, NOT X in_group G') |
97 |
96 |
98 def test_relation_no_relation_2(self): |
97 def test_relation_no_relation_2(self): |
99 f, (guests, managers) = self._in_group_facet(no_relation=True) |
98 f, (guests, managers) = self._in_group_facet(no_relation=True) |
100 f._cw.form[f.__regid__] = ['', guests] |
99 f._cw.form[f.__regid__] = ['', guests] |
101 f.rqlst.save_state() |
100 f.select.save_state() |
102 f.add_rql_restrictions() |
101 f.add_rql_restrictions() |
103 self.assertEqual(f.rqlst.as_string(), |
102 self.assertEqual(f.select.as_string(), |
104 'DISTINCT Any WHERE X is CWUser, (NOT X in_group B) OR (X in_group A, A eid %s)' % guests) |
103 'DISTINCT Any WHERE X is CWUser, (NOT X in_group B) OR (X in_group A, A eid %s)' % guests) |
105 f.rqlst.recover() |
104 f.select.recover() |
106 self.assertEqual(f.rqlst.as_string(), |
105 self.assertEqual(f.select.as_string(), |
107 'DISTINCT Any WHERE X is CWUser') |
106 'DISTINCT Any WHERE X is CWUser') |
108 |
107 |
109 |
108 |
110 |
109 |
111 def test_relationattribute(self): |
110 def test_relationattribute(self): |
112 f, (guests, managers) = self._in_group_facet(cls=facet.RelationAttributeFacet) |
111 f, (guests, managers) = self._in_group_facet(cls=facet.RelationAttributeFacet) |
113 self.assertEqual(f.vocabulary(), |
112 self.assertEqual(f.vocabulary(), |
114 [(u'guests', u'guests'), (u'managers', u'managers')]) |
113 [(u'guests', u'guests'), (u'managers', u'managers')]) |
115 # ensure rqlst is left unmodified |
114 # ensure rqlst is left unmodified |
116 self.assertEqual(f.rqlst.as_string(), 'DISTINCT Any WHERE X is CWUser') |
115 self.assertEqual(f.select.as_string(), 'DISTINCT Any WHERE X is CWUser') |
117 #rqlst = rset.syntax_tree() |
116 #rqlst = rset.syntax_tree() |
118 self.assertEqual(f.possible_values(), |
117 self.assertEqual(f.possible_values(), |
119 ['guests', 'managers']) |
118 ['guests', 'managers']) |
120 # ensure rqlst is left unmodified |
119 # ensure rqlst is left unmodified |
121 self.assertEqual(f.rqlst.as_string(), 'DISTINCT Any WHERE X is CWUser') |
120 self.assertEqual(f.select.as_string(), 'DISTINCT Any WHERE X is CWUser') |
122 f._cw.form[f.__regid__] = 'guests' |
121 f._cw.form[f.__regid__] = 'guests' |
123 f.add_rql_restrictions() |
122 f.add_rql_restrictions() |
124 # selection is cluttered because rqlst has been prepared for facet (it |
123 # selection is cluttered because rqlst has been prepared for facet (it |
125 # is not in real life) |
124 # is not in real life) |
126 self.assertEqual(f.rqlst.as_string(), |
125 self.assertEqual(f.select.as_string(), |
127 "DISTINCT Any WHERE X is CWUser, X in_group E, E name 'guests'") |
126 "DISTINCT Any WHERE X is CWUser, X in_group E, E name 'guests'") |
128 |
127 |
129 |
128 |
130 def test_attribute(self): |
129 def test_attribute(self): |
131 req, rset, rqlst, mainvar = self.prepare_rqlst() |
130 req, rset, rqlst, filtered_variable = self.prepare_rqlst() |
132 f = facet.AttributeFacet(req, rset=rset, |
131 f = facet.AttributeFacet(req, rset=rset, |
133 rqlst=rqlst.children[0], |
132 select=rqlst.children[0], |
134 filtered_variable=mainvar) |
133 filtered_variable=filtered_variable) |
135 f.rtype = 'login' |
134 f.rtype = 'login' |
136 self.assertEqual(f.vocabulary(), |
135 self.assertEqual(f.vocabulary(), |
137 [(u'admin', u'admin'), (u'anon', u'anon')]) |
136 [(u'admin', u'admin'), (u'anon', u'anon')]) |
138 # ensure rqlst is left unmodified |
137 # ensure rqlst is left unmodified |
139 self.assertEqual(rqlst.as_string(), 'DISTINCT Any WHERE X is CWUser') |
138 self.assertEqual(rqlst.as_string(), 'DISTINCT Any WHERE X is CWUser') |