177 cm.__enter__() |
179 cm.__enter__() |
178 torestore.append(cm) |
180 torestore.append(cm) |
179 try: |
181 try: |
180 # testing basic fetch_attrs attribute |
182 # testing basic fetch_attrs attribute |
181 self.assertEqual(Personne.fetch_rql(user), |
183 self.assertEqual(Personne.fetch_rql(user), |
182 'Any X,AA,AB,AC ORDERBY AA ASC ' |
184 'Any X,AA,AB,AC ORDERBY AA ' |
183 'WHERE X is Personne, X nom AA, X prenom AB, X modification_date AC') |
185 'WHERE X is Personne, X nom AA, X prenom AB, X modification_date AC') |
184 # testing unknown attributes |
186 # testing unknown attributes |
185 Personne.fetch_attrs = ('bloug', 'beep') |
187 Personne.fetch_attrs = ('bloug', 'beep') |
186 self.assertEqual(Personne.fetch_rql(user), 'Any X WHERE X is Personne') |
188 self.assertEqual(Personne.fetch_rql(user), 'Any X WHERE X is Personne') |
187 # testing one non final relation |
189 # testing one non final relation |
188 Personne.fetch_attrs = ('nom', 'prenom', 'travaille') |
190 Personne.fetch_attrs = ('nom', 'prenom', 'travaille') |
189 self.assertEqual(Personne.fetch_rql(user), |
191 self.assertEqual(Personne.fetch_rql(user), |
190 'Any X,AA,AB,AC,AD ORDERBY AA ASC ' |
192 'Any X,AA,AB,AC,AD ORDERBY AA ' |
191 'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD') |
193 'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD') |
192 # testing two non final relations |
194 # testing two non final relations |
193 Personne.fetch_attrs = ('nom', 'prenom', 'travaille', 'evaluee') |
195 Personne.fetch_attrs = ('nom', 'prenom', 'travaille', 'evaluee') |
194 self.assertEqual(Personne.fetch_rql(user), |
196 self.assertEqual(Personne.fetch_rql(user), |
195 'Any X,AA,AB,AC,AD,AE ORDERBY AA ASC ' |
197 'Any X,AA,AB,AC,AD,AE ORDERBY AA ' |
196 'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD, ' |
198 'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD, ' |
197 'X evaluee AE?') |
199 'X evaluee AE?') |
198 # testing one non final relation with recursion |
200 # testing one non final relation with recursion |
199 Personne.fetch_attrs = ('nom', 'prenom', 'travaille') |
201 Personne.fetch_attrs = ('nom', 'prenom', 'travaille') |
200 Societe.fetch_attrs = ('nom', 'evaluee') |
202 Societe.fetch_attrs = ('nom', 'evaluee') |
201 self.assertEqual(Personne.fetch_rql(user), |
203 self.assertEqual(Personne.fetch_rql(user), |
202 'Any X,AA,AB,AC,AD,AE,AF ORDERBY AA ASC,AF DESC ' |
204 'Any X,AA,AB,AC,AD,AE,AF ORDERBY AA,AF DESC ' |
203 'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD, ' |
205 'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD, ' |
204 'AC evaluee AE?, AE modification_date AF' |
206 'AC evaluee AE?, AE modification_date AF' |
205 ) |
207 ) |
206 # testing symmetric relation |
208 # testing symmetric relation |
207 Personne.fetch_attrs = ('nom', 'connait') |
209 Personne.fetch_attrs = ('nom', 'connait') |
208 self.assertEqual(Personne.fetch_rql(user), 'Any X,AA,AB ORDERBY AA ASC ' |
210 self.assertEqual(Personne.fetch_rql(user), 'Any X,AA,AB ORDERBY AA ' |
209 'WHERE X is Personne, X nom AA, X connait AB?') |
211 'WHERE X is Personne, X nom AA, X connait AB?') |
210 # testing optional relation |
212 # testing optional relation |
211 peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '?*' |
213 peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '?*' |
212 Personne.fetch_attrs = ('nom', 'prenom', 'travaille') |
214 Personne.fetch_attrs = ('nom', 'prenom', 'travaille') |
213 Societe.fetch_attrs = ('nom',) |
215 Societe.fetch_attrs = ('nom',) |
214 self.assertEqual(Personne.fetch_rql(user), |
216 self.assertEqual(Personne.fetch_rql(user), |
215 'Any X,AA,AB,AC,AD ORDERBY AA ASC WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD') |
217 'Any X,AA,AB,AC,AD ORDERBY AA WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD') |
216 # testing relation with cardinality > 1 |
218 # testing relation with cardinality > 1 |
217 peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '**' |
219 peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '**' |
218 self.assertEqual(Personne.fetch_rql(user), |
220 self.assertEqual(Personne.fetch_rql(user), |
219 'Any X,AA,AB ORDERBY AA ASC WHERE X is Personne, X nom AA, X prenom AB') |
221 'Any X,AA,AB ORDERBY AA WHERE X is Personne, X nom AA, X prenom AB') |
220 # XXX test unauthorized attribute |
222 # XXX test unauthorized attribute |
221 finally: |
223 finally: |
222 # fetch_attrs restored by generic tearDown |
224 # fetch_attrs restored by generic tearDown |
223 for cm in torestore: |
225 for cm in torestore: |
224 cm.__exit__(None, None, None) |
226 cm.__exit__(None, None, None) |
225 |
227 |
226 def test_related_rql_base(self): |
228 def test_related_rql_base(self): |
227 Personne = self.vreg['etypes'].etype_class('Personne') |
229 Personne = self.vreg['etypes'].etype_class('Personne') |
228 Note = self.vreg['etypes'].etype_class('Note') |
230 Note = self.vreg['etypes'].etype_class('Note') |
229 SubNote = self.vreg['etypes'].etype_class('SubNote') |
231 SubNote = self.vreg['etypes'].etype_class('SubNote') |
230 self.failUnless(issubclass(self.vreg['etypes'].etype_class('SubNote'), Note)) |
232 self.assertTrue(issubclass(self.vreg['etypes'].etype_class('SubNote'), Note)) |
231 Personne.fetch_attrs, Personne.fetch_order = fetch_config(('nom', 'type')) |
233 Personne.fetch_attrs, Personne.cw_fetch_order = fetch_config(('nom', 'type')) |
232 Note.fetch_attrs, Note.fetch_order = fetch_config(('type',)) |
234 Note.fetch_attrs, Note.cw_fetch_order = fetch_config(('type',)) |
233 SubNote.fetch_attrs, SubNote.fetch_order = fetch_config(('type',)) |
235 SubNote.fetch_attrs, SubNote.cw_fetch_order = fetch_config(('type',)) |
234 p = self.request().create_entity('Personne', nom=u'pouet') |
236 p = self.request().create_entity('Personne', nom=u'pouet') |
235 self.assertEqual(p.cw_related_rql('evaluee'), |
237 self.assertEqual(p.cw_related_rql('evaluee'), |
236 'Any X,AA,AB ORDERBY AA ASC WHERE E eid %(x)s, E evaluee X, ' |
238 'Any X,AA,AB ORDERBY AA WHERE E eid %(x)s, E evaluee X, ' |
237 'X type AA, X modification_date AB') |
239 'X type AA, X modification_date AB') |
238 Personne.fetch_attrs, Personne.fetch_order = fetch_config(('nom', )) |
240 n = self.request().create_entity('Note') |
|
241 self.assertEqual(n.cw_related_rql('evaluee', role='object', |
|
242 targettypes=('Societe', 'Personne')), |
|
243 "Any X,AA ORDERBY AB DESC WHERE E eid %(x)s, X evaluee E, " |
|
244 "X is IN(Personne, Societe), X nom AA, " |
|
245 "X modification_date AB") |
|
246 Personne.fetch_attrs, Personne.cw_fetch_order = fetch_config(('nom', )) |
239 # XXX |
247 # XXX |
240 self.assertEqual(p.cw_related_rql('evaluee'), |
248 self.assertEqual(p.cw_related_rql('evaluee'), |
241 'Any X,AA ORDERBY AA DESC ' |
249 'Any X,AA ORDERBY AA DESC ' |
242 'WHERE E eid %(x)s, E evaluee X, X modification_date AA') |
250 'WHERE E eid %(x)s, E evaluee X, X modification_date AA') |
243 |
251 |
244 tag = self.vreg['etypes'].etype_class('Tag')(self.request()) |
252 tag = self.vreg['etypes'].etype_class('Tag')(self.request()) |
245 self.assertEqual(tag.cw_related_rql('tags', 'subject'), |
253 self.assertEqual(tag.cw_related_rql('tags', 'subject'), |
246 'Any X,AA ORDERBY AA DESC ' |
254 'Any X,AA ORDERBY AA DESC ' |
247 'WHERE E eid %(x)s, E tags X, X modification_date AA') |
255 'WHERE E eid %(x)s, E tags X, X modification_date AA') |
248 self.assertEqual(tag.cw_related_rql('tags', 'subject', ('Personne',)), |
256 self.assertEqual(tag.cw_related_rql('tags', 'subject', ('Personne',)), |
249 'Any X,AA,AB ORDERBY AA ASC ' |
257 'Any X,AA,AB ORDERBY AA ' |
250 'WHERE E eid %(x)s, E tags X, X is IN (Personne), X nom AA, ' |
258 'WHERE E eid %(x)s, E tags X, X is Personne, X nom AA, ' |
251 'X modification_date AB') |
259 'X modification_date AB') |
252 |
260 |
253 def test_related_rql_ambiguous_cant_use_fetch_order(self): |
261 def test_related_rql_ambiguous_cant_use_fetch_order(self): |
254 tag = self.vreg['etypes'].etype_class('Tag')(self.request()) |
262 tag = self.vreg['etypes'].etype_class('Tag')(self.request()) |
255 for ttype in self.schema['tags'].objects(): |
263 for ttype in self.schema['tags'].objects(): |
256 self.vreg['etypes'].etype_class(ttype).fetch_attrs = ('modification_date',) |
264 self.vreg['etypes'].etype_class(ttype).fetch_attrs = ('modification_date',) |
257 self.assertEqual(tag.cw_related_rql('tags', 'subject'), |
265 self.assertEqual(tag.cw_related_rql('tags', 'subject'), |
258 'Any X,AA ORDERBY AA DESC ' |
266 'Any X,AA ORDERBY AA DESC ' |
259 'WHERE E eid %(x)s, E tags X, X modification_date AA') |
267 'WHERE E eid %(x)s, E tags X, X modification_date AA') |
260 |
268 |
261 def test_related_rql_cant_fetch_ambiguous_rtype(self): |
269 def test_related_rql_fetch_ambiguous_rtype(self): |
262 soc_etype = self.vreg['etypes'].etype_class('Societe') |
270 soc_etype = self.vreg['etypes'].etype_class('Societe') |
263 soc = soc_etype(self.request()) |
271 soc = soc_etype(self.request()) |
264 soc_etype.fetch_attrs = ('fournit',) |
272 soc_etype.fetch_attrs = ('fournit',) |
265 self.vreg['etypes'].etype_class('Service').fetch_attrs = ('fabrique_par',) |
273 self.vreg['etypes'].etype_class('Service').fetch_attrs = ('fabrique_par',) |
266 self.vreg['etypes'].etype_class('Produit').fetch_attrs = ('fabrique_par',) |
274 self.vreg['etypes'].etype_class('Produit').fetch_attrs = ('fabrique_par',) |
267 self.vreg['etypes'].etype_class('Usine').fetch_attrs = ('lieu',) |
275 self.vreg['etypes'].etype_class('Usine').fetch_attrs = ('lieu',) |
268 self.vreg['etypes'].etype_class('Personne').fetch_attrs = ('nom',) |
276 self.vreg['etypes'].etype_class('Personne').fetch_attrs = ('nom',) |
269 # XXX should be improved: we could fetch fabrique_par object too |
|
270 self.assertEqual(soc.cw_related_rql('fournit', 'subject'), |
277 self.assertEqual(soc.cw_related_rql('fournit', 'subject'), |
271 'Any X WHERE E eid %(x)s, E fournit X') |
278 'Any X,A WHERE E eid %(x)s, E fournit X, X fabrique_par A') |
272 |
279 |
273 def test_unrelated_rql_security_1_manager(self): |
280 def test_unrelated_rql_security_1_manager(self): |
274 user = self.request().user |
281 user = self.request().user |
275 rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0] |
282 rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0] |
276 self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC ' |
283 self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC ' |
277 'WHERE NOT EXISTS(ZZ use_email O), S eid %(x)s, ' |
284 'WHERE NOT A use_email O, S eid %(x)s, ' |
278 'O is EmailAddress, O address AA, O alias AB, O modification_date AC') |
285 'O is EmailAddress, O address AA, O alias AB, O modification_date AC') |
279 |
286 |
280 def test_unrelated_rql_security_1_user(self): |
287 def test_unrelated_rql_security_1_user(self): |
281 req = self.request() |
288 req = self.request() |
282 self.create_user(req, 'toto') |
289 self.create_user(req, 'toto') |
283 self.login('toto') |
290 self.login('toto') |
284 user = req.user |
291 user = req.user |
285 rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0] |
292 rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0] |
286 self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC ' |
293 self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC ' |
287 'WHERE NOT EXISTS(ZZ use_email O), S eid %(x)s, ' |
294 'WHERE NOT A use_email O, S eid %(x)s, ' |
288 'O is EmailAddress, O address AA, O alias AB, O modification_date AC') |
295 'O is EmailAddress, O address AA, O alias AB, O modification_date AC') |
289 user = self.execute('Any X WHERE X login "admin"').get_entity(0, 0) |
296 user = self.execute('Any X WHERE X login "admin"').get_entity(0, 0) |
290 rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0] |
297 rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0] |
291 self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC ' |
298 self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC ' |
292 'WHERE NOT EXISTS(ZZ use_email O, ZZ is CWUser), S eid %(x)s, ' |
299 'WHERE NOT A use_email O, S eid %(x)s, ' |
293 'O is EmailAddress, O address AA, O alias AB, O modification_date AC, A eid %(B)s, ' |
300 'O is EmailAddress, O address AA, O alias AB, O modification_date AC, AD eid %(AE)s, ' |
294 'EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)') |
301 'EXISTS(S identity AD, NOT AD in_group AF, AF name "guests", AF is CWGroup), A is CWUser') |
295 |
302 |
296 def test_unrelated_rql_security_1_anon(self): |
303 def test_unrelated_rql_security_1_anon(self): |
297 self.login('anon') |
304 self.login('anon') |
298 user = self.request().user |
305 user = self.request().user |
299 rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0] |
306 rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0] |
300 self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC ' |
307 self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC ' |
301 'WHERE NOT EXISTS(ZZ use_email O, ZZ is CWUser), S eid %(x)s, ' |
308 'WHERE NOT A use_email O, S eid %(x)s, ' |
302 'O is EmailAddress, O address AA, O alias AB, O modification_date AC, A eid %(B)s, ' |
309 'O is EmailAddress, O address AA, O alias AB, O modification_date AC, AD eid %(AE)s, ' |
303 'EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)') |
310 'EXISTS(S identity AD, NOT AD in_group AF, AF name "guests", AF is CWGroup), A is CWUser') |
304 |
311 |
305 def test_unrelated_rql_security_2(self): |
312 def test_unrelated_rql_security_2(self): |
306 email = self.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0) |
313 email = self.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0) |
307 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
314 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
308 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ' |
315 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ' |
309 'WHERE NOT EXISTS(S use_email O), O eid %(x)s, S is CWUser, ' |
316 'WHERE NOT S use_email O, O eid %(x)s, S is CWUser, ' |
310 'S login AA, S firstname AB, S surname AC, S modification_date AD') |
317 'S login AA, S firstname AB, S surname AC, S modification_date AD') |
311 self.login('anon') |
318 self.login('anon') |
312 email = self.execute('Any X WHERE X eid %(x)s', {'x': email.eid}).get_entity(0, 0) |
319 email = self.execute('Any X WHERE X eid %(x)s', {'x': email.eid}).get_entity(0, 0) |
313 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
320 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
314 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ' |
321 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ' |
315 'WHERE NOT EXISTS(S use_email O), O eid %(x)s, S is CWUser, ' |
322 'WHERE NOT S use_email O, O eid %(x)s, S is CWUser, ' |
316 'S login AA, S firstname AB, S surname AC, S modification_date AD, ' |
323 'S login AA, S firstname AB, S surname AC, S modification_date AD, ' |
317 'A eid %(B)s, EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)') |
324 'AE eid %(AF)s, EXISTS(S identity AE, NOT AE in_group AG, AG name "guests", AG is CWGroup)') |
318 |
325 |
319 def test_unrelated_rql_security_nonexistant(self): |
326 def test_unrelated_rql_security_nonexistant(self): |
320 self.login('anon') |
327 self.login('anon') |
321 email = self.vreg['etypes'].etype_class('EmailAddress')(self.request()) |
328 email = self.vreg['etypes'].etype_class('EmailAddress')(self.request()) |
322 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
329 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
323 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ' |
330 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ' |
324 'WHERE S is CWUser, ' |
331 'WHERE S is CWUser, ' |
325 'S login AA, S firstname AB, S surname AC, S modification_date AD, ' |
332 'S login AA, S firstname AB, S surname AC, S modification_date AD, ' |
326 'A eid %(B)s, EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)') |
333 'AE eid %(AF)s, EXISTS(S identity AE, NOT AE in_group AG, AG name "guests", AG is CWGroup)') |
327 |
334 |
328 def test_unrelated_rql_constraints_creation_subject(self): |
335 def test_unrelated_rql_constraints_creation_subject(self): |
329 person = self.vreg['etypes'].etype_class('Personne')(self.request()) |
336 person = self.vreg['etypes'].etype_class('Personne')(self.request()) |
330 rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0] |
337 rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0] |
331 self.assertEqual( |
338 self.assertEqual( |
336 person = self.vreg['etypes'].etype_class('Personne')(self.request()) |
343 person = self.vreg['etypes'].etype_class('Personne')(self.request()) |
337 rql = person.cw_unrelated_rql('connait', 'Personne', 'object')[0] |
344 rql = person.cw_unrelated_rql('connait', 'Personne', 'object')[0] |
338 self.assertEqual( |
345 self.assertEqual( |
339 rql, 'Any S,AA,AB,AC ORDERBY AC DESC WHERE ' |
346 rql, 'Any S,AA,AB,AC ORDERBY AC DESC WHERE ' |
340 'S is Personne, S nom AA, S prenom AB, S modification_date AC, ' |
347 'S is Personne, S nom AA, S prenom AB, S modification_date AC, ' |
341 'NOT (S connait A, A nom "toto"), A is Personne, EXISTS(S travaille B, B nom "tutu")') |
348 'NOT (S connait AD, AD nom "toto"), AD is Personne, ' |
|
349 'EXISTS(S travaille AE, AE nom "tutu")') |
342 |
350 |
343 def test_unrelated_rql_constraints_edition_subject(self): |
351 def test_unrelated_rql_constraints_edition_subject(self): |
344 person = self.request().create_entity('Personne', nom=u'sylvain') |
352 person = self.request().create_entity('Personne', nom=u'sylvain') |
345 rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0] |
353 rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0] |
346 self.assertEqual( |
354 self.assertEqual( |
347 rql, 'Any O,AA,AB,AC ORDERBY AC DESC WHERE ' |
355 rql, 'Any O,AA,AB,AC ORDERBY AC DESC WHERE ' |
348 'NOT EXISTS(S connait O), S eid %(x)s, O is Personne, ' |
356 'NOT S connait O, S eid %(x)s, O is Personne, ' |
349 'O nom AA, O prenom AB, O modification_date AC, ' |
357 'O nom AA, O prenom AB, O modification_date AC, ' |
350 'NOT S identity O') |
358 'NOT S identity O') |
351 |
359 |
352 def test_unrelated_rql_constraints_edition_object(self): |
360 def test_unrelated_rql_constraints_edition_object(self): |
353 person = self.request().create_entity('Personne', nom=u'sylvain') |
361 person = self.request().create_entity('Personne', nom=u'sylvain') |
354 rql = person.cw_unrelated_rql('connait', 'Personne', 'object')[0] |
362 rql = person.cw_unrelated_rql('connait', 'Personne', 'object')[0] |
355 self.assertEqual( |
363 self.assertEqual( |
356 rql, 'Any S,AA,AB,AC ORDERBY AC DESC WHERE ' |
364 rql, 'Any S,AA,AB,AC ORDERBY AC DESC WHERE ' |
357 'NOT EXISTS(S connait O), O eid %(x)s, S is Personne, ' |
365 'NOT S connait O, O eid %(x)s, S is Personne, ' |
358 'S nom AA, S prenom AB, S modification_date AC, ' |
366 'S nom AA, S prenom AB, S modification_date AC, ' |
359 'NOT S identity O, NOT (S connait A, A nom "toto"), ' |
367 'NOT S identity O, NOT (S connait AD, AD nom "toto"), ' |
360 'EXISTS(S travaille B, B nom "tutu")') |
368 'EXISTS(S travaille AE, AE nom "tutu")') |
|
369 |
|
370 def test_unrelated_rql_s_linkto_s(self): |
|
371 req = self.request() |
|
372 person = self.vreg['etypes'].etype_class('Personne')(req) |
|
373 self.vreg['etypes'].etype_class('Personne').fetch_attrs = () |
|
374 soc = req.create_entity('Societe', nom=u'logilab') |
|
375 lt_infos = {('actionnaire', 'subject'): [soc.eid]} |
|
376 rql, args = person.cw_unrelated_rql('associe', 'Personne', 'subject', |
|
377 lt_infos=lt_infos) |
|
378 self.assertEqual(u'Any O ORDERBY O WHERE O is Personne, ' |
|
379 u'EXISTS(AA eid %(SOC)s, O actionnaire AA)', rql) |
|
380 self.assertEqual({'SOC': soc.eid}, args) |
|
381 |
|
382 def test_unrelated_rql_s_linkto_o(self): |
|
383 req = self.request() |
|
384 person = self.vreg['etypes'].etype_class('Personne')(req) |
|
385 self.vreg['etypes'].etype_class('Societe').fetch_attrs = () |
|
386 soc = req.create_entity('Societe', nom=u'logilab') |
|
387 lt_infos = {('contrat_exclusif', 'object'): [soc.eid]} |
|
388 rql, args = person.cw_unrelated_rql('actionnaire', 'Societe', 'subject', |
|
389 lt_infos=lt_infos) |
|
390 self.assertEqual(u'Any O ORDERBY O WHERE NOT A actionnaire O, ' |
|
391 u'O is Societe, NOT EXISTS(O eid %(O)s), ' |
|
392 u'A is Personne', rql) |
|
393 self.assertEqual({'O': soc.eid}, args) |
|
394 |
|
395 def test_unrelated_rql_o_linkto_s(self): |
|
396 req = self.request() |
|
397 soc = self.vreg['etypes'].etype_class('Societe')(req) |
|
398 self.vreg['etypes'].etype_class('Personne').fetch_attrs = () |
|
399 person = req.create_entity('Personne', nom=u'florent') |
|
400 lt_infos = {('contrat_exclusif', 'subject'): [person.eid]} |
|
401 rql, args = soc.cw_unrelated_rql('actionnaire', 'Personne', 'object', |
|
402 lt_infos=lt_infos) |
|
403 self.assertEqual(u'Any S ORDERBY S WHERE NOT S actionnaire A, ' |
|
404 u'S is Personne, NOT EXISTS(S eid %(S)s), ' |
|
405 u'A is Societe', rql) |
|
406 self.assertEqual({'S': person.eid}, args) |
|
407 |
|
408 def test_unrelated_rql_o_linkto_o(self): |
|
409 req = self.request() |
|
410 soc = self.vreg['etypes'].etype_class('Societe')(req) |
|
411 self.vreg['etypes'].etype_class('Personne').fetch_attrs = () |
|
412 person = req.create_entity('Personne', nom=u'florent') |
|
413 lt_infos = {('actionnaire', 'object'): [person.eid]} |
|
414 rql, args = soc.cw_unrelated_rql('dirige', 'Personne', 'object', |
|
415 lt_infos=lt_infos) |
|
416 self.assertEqual(u'Any S ORDERBY S WHERE NOT S dirige A, ' |
|
417 u'S is Personne, EXISTS(S eid %(S)s), ' |
|
418 u'A is Societe', rql) |
|
419 self.assertEqual({'S': person.eid}, args) |
|
420 |
|
421 def test_unrelated_rql_s_linkto_s_no_info(self): |
|
422 req = self.request() |
|
423 person = self.vreg['etypes'].etype_class('Personne')(req) |
|
424 self.vreg['etypes'].etype_class('Personne').fetch_attrs = () |
|
425 soc = req.create_entity('Societe', nom=u'logilab') |
|
426 rql, args = person.cw_unrelated_rql('associe', 'Personne', 'subject') |
|
427 self.assertEqual(u'Any O ORDERBY O WHERE O is Personne', rql) |
|
428 self.assertEqual({}, args) |
|
429 |
|
430 def test_unrelated_rql_s_linkto_s_unused_info(self): |
|
431 req = self.request() |
|
432 person = self.vreg['etypes'].etype_class('Personne')(req) |
|
433 self.vreg['etypes'].etype_class('Personne').fetch_attrs = () |
|
434 other_p = req.create_entity('Personne', nom=u'titi') |
|
435 lt_infos = {('dirige', 'subject'): [other_p.eid]} |
|
436 rql, args = person.cw_unrelated_rql('associe', 'Personne', 'subject', |
|
437 lt_infos=lt_infos) |
|
438 self.assertEqual(u'Any O ORDERBY O WHERE O is Personne', rql) |
361 |
439 |
362 def test_unrelated_base(self): |
440 def test_unrelated_base(self): |
363 req = self.request() |
441 req = self.request() |
364 p = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien') |
442 p = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien') |
365 e = req.create_entity('Tag', name=u'x') |
443 e = req.create_entity('Tag', name=u'x') |
366 related = [r.eid for r in e.tags] |
444 related = [r.eid for r in e.tags] |
367 self.failUnlessEqual(related, []) |
445 self.assertEqual(related, []) |
368 unrelated = [r[0] for r in e.unrelated('tags', 'Personne', 'subject')] |
446 unrelated = [r[0] for r in e.unrelated('tags', 'Personne', 'subject')] |
369 self.failUnless(p.eid in unrelated) |
447 self.assertTrue(p.eid in unrelated) |
370 self.execute('SET X tags Y WHERE X is Tag, Y is Personne') |
448 self.execute('SET X tags Y WHERE X is Tag, Y is Personne') |
371 e = self.execute('Any X WHERE X is Tag').get_entity(0, 0) |
449 e = self.execute('Any X WHERE X is Tag').get_entity(0, 0) |
372 unrelated = [r[0] for r in e.unrelated('tags', 'Personne', 'subject')] |
450 unrelated = [r[0] for r in e.unrelated('tags', 'Personne', 'subject')] |
373 self.failIf(p.eid in unrelated) |
451 self.assertFalse(p.eid in unrelated) |
374 |
452 |
375 def test_unrelated_limit(self): |
453 def test_unrelated_limit(self): |
376 req = self.request() |
454 req = self.request() |
377 e = req.create_entity('Tag', name=u'x') |
455 e = req.create_entity('Tag', name=u'x') |
378 req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien') |
456 req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien') |