245 'Any X,AA,AB,AC,AD ORDERBY AA ' |
245 'Any X,AA,AB,AC,AD ORDERBY AA ' |
246 'WHERE X is_instance_of Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD') |
246 'WHERE X is_instance_of Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD') |
247 # testing two non final relations |
247 # testing two non final relations |
248 Personne.fetch_attrs = ('nom', 'prenom', 'travaille', 'evaluee') |
248 Personne.fetch_attrs = ('nom', 'prenom', 'travaille', 'evaluee') |
249 self.assertEqual(Personne.fetch_rql(user), |
249 self.assertEqual(Personne.fetch_rql(user), |
250 'Any X,AA,AB,AC,AD,AE ORDERBY AA ' |
250 'Any X,AA,AB,AC,AD,AE ORDERBY AB ' |
251 'WHERE X is_instance_of Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD, ' |
251 'WHERE X is_instance_of Personne, X evaluee AA?, X nom AB, X prenom AC, X travaille AD?, ' |
252 'X evaluee AE?') |
252 'AD nom AE') |
253 # testing one non final relation with recursion |
253 # testing one non final relation with recursion |
254 Personne.fetch_attrs = ('nom', 'prenom', 'travaille') |
254 Personne.fetch_attrs = ('nom', 'prenom', 'travaille') |
255 Societe.fetch_attrs = ('nom', 'evaluee') |
255 Societe.fetch_attrs = ('nom', 'evaluee') |
256 self.assertEqual(Personne.fetch_rql(user), |
256 self.assertEqual(Personne.fetch_rql(user), |
257 'Any X,AA,AB,AC,AD,AE,AF ORDERBY AA,AF DESC ' |
257 'Any X,AA,AB,AC,AD,AE,AF ORDERBY AA,AE DESC ' |
258 'WHERE X is_instance_of Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD, ' |
258 'WHERE X is_instance_of Personne, X nom AA, X prenom AB, X travaille AC?, ' |
259 'AC evaluee AE?, AE modification_date AF' |
259 'AC evaluee AD?, AD modification_date AE, AC nom AF') |
260 ) |
|
261 # testing symmetric relation |
260 # testing symmetric relation |
262 Personne.fetch_attrs = ('nom', 'connait') |
261 Personne.fetch_attrs = ('nom', 'connait') |
263 self.assertEqual(Personne.fetch_rql(user), 'Any X,AA,AB ORDERBY AA ' |
262 self.assertEqual(Personne.fetch_rql(user), 'Any X,AA,AB ORDERBY AB ' |
264 'WHERE X is_instance_of Personne, X nom AA, X connait AB?') |
263 'WHERE X is_instance_of Personne, X connait AA?, X nom AB') |
265 # testing optional relation |
264 # testing optional relation |
266 peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '?*' |
265 peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '?*' |
267 Personne.fetch_attrs = ('nom', 'prenom', 'travaille') |
266 Personne.fetch_attrs = ('nom', 'prenom', 'travaille') |
268 Societe.fetch_attrs = ('nom',) |
267 Societe.fetch_attrs = ('nom',) |
269 self.assertEqual(Personne.fetch_rql(user), |
268 self.assertEqual(Personne.fetch_rql(user), |
287 Note.fetch_attrs, Note.cw_fetch_order = fetch_config(('type',)) |
286 Note.fetch_attrs, Note.cw_fetch_order = fetch_config(('type',)) |
288 SubNote.fetch_attrs, SubNote.cw_fetch_order = fetch_config(('type',)) |
287 SubNote.fetch_attrs, SubNote.cw_fetch_order = fetch_config(('type',)) |
289 with self.admin_access.web_request() as req: |
288 with self.admin_access.web_request() as req: |
290 p = req.create_entity('Personne', nom=u'pouet') |
289 p = req.create_entity('Personne', nom=u'pouet') |
291 self.assertEqual(p.cw_related_rql('evaluee'), |
290 self.assertEqual(p.cw_related_rql('evaluee'), |
292 'Any X,AA,AB ORDERBY AA WHERE E eid %(x)s, E evaluee X, ' |
291 'Any X,AA,AB ORDERBY AB WHERE E eid %(x)s, E evaluee X, ' |
293 'X type AA, X modification_date AB') |
292 'X modification_date AA, X type AB') |
294 n = req.create_entity('Note') |
293 n = req.create_entity('Note') |
295 self.assertEqual(n.cw_related_rql('evaluee', role='object', |
294 self.assertEqual(n.cw_related_rql('evaluee', role='object', |
296 targettypes=('Societe', 'Personne')), |
295 targettypes=('Societe', 'Personne')), |
297 "Any X,AA ORDERBY AB DESC WHERE E eid %(x)s, X evaluee E, " |
296 "Any X,AA ORDERBY AB DESC WHERE E eid %(x)s, X evaluee E, " |
298 "X is IN(Personne, Societe), X nom AA, " |
297 "X is IN(Personne, Societe), X nom AA, " |
372 |
371 |
373 def test_unrelated_rql_security_2(self): |
372 def test_unrelated_rql_security_2(self): |
374 with self.admin_access.web_request() as req: |
373 with self.admin_access.web_request() as req: |
375 email = req.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0) |
374 email = req.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0) |
376 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
375 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
377 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ' |
376 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AB ' |
378 'WHERE NOT S use_email O, O eid %(x)s, S is_instance_of CWUser, ' |
377 'WHERE NOT S use_email O, O eid %(x)s, S is_instance_of CWUser, ' |
379 'S login AA, S firstname AB, S surname AC, S modification_date AD') |
378 'S firstname AA, S login AB, S modification_date AC, S surname AD') |
380 req.cnx.commit() |
379 req.cnx.commit() |
381 rperms = self.schema['EmailAddress'].permissions['read'] |
380 rperms = self.schema['EmailAddress'].permissions['read'] |
382 clear_cache(self.schema['EmailAddress'], 'get_groups') |
381 clear_cache(self.schema['EmailAddress'], 'get_groups') |
383 clear_cache(self.schema['EmailAddress'], 'get_rqlexprs') |
382 clear_cache(self.schema['EmailAddress'], 'get_rqlexprs') |
384 self.schema['EmailAddress'].permissions['read'] = ('managers', 'users', 'guests',) |
383 self.schema['EmailAddress'].permissions['read'] = ('managers', 'users', 'guests',) |
385 try: |
384 try: |
386 with self.new_access('anon').web_request() as req: |
385 with self.new_access('anon').web_request() as req: |
387 email = req.execute('Any X WHERE X eid %(x)s', {'x': email.eid}).get_entity(0, 0) |
386 email = req.execute('Any X WHERE X eid %(x)s', {'x': email.eid}).get_entity(0, 0) |
388 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
387 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
389 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ' |
388 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AB ' |
390 'WHERE NOT S use_email O, O eid %(x)s, S is CWUser, ' |
389 'WHERE NOT S use_email O, O eid %(x)s, S is CWUser, ' |
391 'S login AA, S firstname AB, S surname AC, S modification_date AD, ' |
390 'S firstname AA, S login AB, S modification_date AC, S surname AD, ' |
392 'AE eid %(AF)s, EXISTS(S identity AE, NOT AE in_group AG, AG name "guests", AG is CWGroup)') |
391 'AE eid %(AF)s, EXISTS(S identity AE, NOT AE in_group AG, AG name "guests", AG is CWGroup)') |
393 finally: |
392 finally: |
394 clear_cache(self.schema['EmailAddress'], 'get_groups') |
393 clear_cache(self.schema['EmailAddress'], 'get_groups') |
395 clear_cache(self.schema['EmailAddress'], 'get_rqlexprs') |
394 clear_cache(self.schema['EmailAddress'], 'get_rqlexprs') |
396 self.schema['EmailAddress'].permissions['read'] = rperms |
395 self.schema['EmailAddress'].permissions['read'] = rperms |
397 |
396 |
398 def test_cw_linkable_rql(self): |
397 def test_cw_linkable_rql(self): |
399 with self.admin_access.web_request() as req: |
398 with self.admin_access.web_request() as req: |
400 email = req.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0) |
399 email = req.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0) |
401 rql = email.cw_linkable_rql('use_email', 'CWUser', 'object')[0] |
400 rql = email.cw_linkable_rql('use_email', 'CWUser', 'object')[0] |
402 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ' |
401 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AB ' |
403 'WHERE O eid %(x)s, S is_instance_of CWUser, ' |
402 'WHERE O eid %(x)s, S is_instance_of CWUser, ' |
404 'S login AA, S firstname AB, S surname AC, S modification_date AD') |
403 'S firstname AA, S login AB, S modification_date AC, S surname AD') |
405 |
404 |
406 def test_unrelated_rql_security_nonexistant(self): |
405 def test_unrelated_rql_security_nonexistant(self): |
407 with self.new_access('anon').web_request() as req: |
406 with self.new_access('anon').web_request() as req: |
408 email = self.vreg['etypes'].etype_class('EmailAddress')(req) |
407 email = self.vreg['etypes'].etype_class('EmailAddress')(req) |
409 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
408 rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0] |
410 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ' |
409 self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AB ' |
411 'WHERE S is CWUser, ' |
410 'WHERE S is CWUser, ' |
412 'S login AA, S firstname AB, S surname AC, S modification_date AD, ' |
411 'S firstname AA, S login AB, S modification_date AC, S surname AD, ' |
413 'AE eid %(AF)s, EXISTS(S identity AE, NOT AE in_group AG, AG name "guests", AG is CWGroup)') |
412 'AE eid %(AF)s, EXISTS(S identity AE, NOT AE in_group AG, AG name "guests", AG is CWGroup)') |
414 |
413 |
415 def test_unrelated_rql_constraints_creation_subject(self): |
414 def test_unrelated_rql_constraints_creation_subject(self): |
416 with self.admin_access.web_request() as req: |
415 with self.admin_access.web_request() as req: |
417 person = self.vreg['etypes'].etype_class('Personne')(req) |
416 person = self.vreg['etypes'].etype_class('Personne')(req) |
418 rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0] |
417 rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0] |
419 self.assertEqual( |
418 self.assertEqual( |
420 rql, 'Any O,AA,AB,AC ORDERBY AC DESC WHERE ' |
419 rql, 'Any O,AA,AB,AC ORDERBY AA DESC WHERE ' |
421 'O is_instance_of Personne, O nom AA, O prenom AB, O modification_date AC') |
420 'O is_instance_of Personne, O modification_date AA, O nom AB, O prenom AC') |
422 |
421 |
423 def test_unrelated_rql_constraints_creation_object(self): |
422 def test_unrelated_rql_constraints_creation_object(self): |
424 with self.admin_access.web_request() as req: |
423 with self.admin_access.web_request() as req: |
425 person = self.vreg['etypes'].etype_class('Personne')(req) |
424 person = self.vreg['etypes'].etype_class('Personne')(req) |
426 rql = person.cw_unrelated_rql('connait', 'Personne', 'object')[0] |
425 rql = person.cw_unrelated_rql('connait', 'Personne', 'object')[0] |
427 self.assertEqual( |
426 self.assertEqual( |
428 rql, 'Any S,AA,AB,AC ORDERBY AC DESC WHERE ' |
427 rql, 'Any S,AA,AB,AC ORDERBY AA DESC WHERE ' |
429 'S is Personne, S nom AA, S prenom AB, S modification_date AC, ' |
428 'S is Personne, S modification_date AA, S nom AB, S prenom AC, ' |
430 'NOT (S connait AD, AD nom "toto"), AD is Personne, ' |
429 'NOT (S connait AD, AD nom "toto"), AD is Personne, ' |
431 'EXISTS(S travaille AE, AE nom "tutu")') |
430 'EXISTS(S travaille AE, AE nom "tutu")') |
432 |
431 |
433 def test_unrelated_rql_security_rel_perms(self): |
432 def test_unrelated_rql_security_rel_perms(self): |
434 '''check `connait` add permission has no effect for a new entity on the |
433 '''check `connait` add permission has no effect for a new entity on the |
437 perm_rrqle = RRQLExpression('U has_update_permission S') |
436 perm_rrqle = RRQLExpression('U has_update_permission S') |
438 with self.temporary_permissions((rdef, {'add': (perm_rrqle,)})): |
437 with self.temporary_permissions((rdef, {'add': (perm_rrqle,)})): |
439 with self.admin_access.web_request() as req: |
438 with self.admin_access.web_request() as req: |
440 person = self.vreg['etypes'].etype_class('Personne')(req) |
439 person = self.vreg['etypes'].etype_class('Personne')(req) |
441 rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0] |
440 rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0] |
442 self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC WHERE ' |
441 self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AA DESC WHERE ' |
443 'O is_instance_of Personne, O nom AA, O prenom AB, ' |
442 'O is_instance_of Personne, O modification_date AA, O nom AB, ' |
444 'O modification_date AC') |
443 'O prenom AC') |
445 |
444 |
446 def test_unrelated_rql_constraints_edition_subject(self): |
445 def test_unrelated_rql_constraints_edition_subject(self): |
447 with self.admin_access.web_request() as req: |
446 with self.admin_access.web_request() as req: |
448 person = req.create_entity('Personne', nom=u'sylvain') |
447 person = req.create_entity('Personne', nom=u'sylvain') |
449 rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0] |
448 rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0] |
450 self.assertEqual( |
449 self.assertEqual( |
451 rql, 'Any O,AA,AB,AC ORDERBY AC DESC WHERE ' |
450 rql, 'Any O,AA,AB,AC ORDERBY AA DESC WHERE ' |
452 'NOT S connait O, S eid %(x)s, O is Personne, ' |
451 'NOT S connait O, S eid %(x)s, O is Personne, ' |
453 'O nom AA, O prenom AB, O modification_date AC, ' |
452 'O modification_date AA, O nom AB, O prenom AC, ' |
454 'NOT S identity O') |
453 'NOT S identity O') |
455 |
454 |
456 def test_unrelated_rql_constraints_edition_object(self): |
455 def test_unrelated_rql_constraints_edition_object(self): |
457 with self.admin_access.web_request() as req: |
456 with self.admin_access.web_request() as req: |
458 person = req.create_entity('Personne', nom=u'sylvain') |
457 person = req.create_entity('Personne', nom=u'sylvain') |
459 rql = person.cw_unrelated_rql('connait', 'Personne', 'object')[0] |
458 rql = person.cw_unrelated_rql('connait', 'Personne', 'object')[0] |
460 self.assertEqual( |
459 self.assertEqual( |
461 rql, 'Any S,AA,AB,AC ORDERBY AC DESC WHERE ' |
460 rql, 'Any S,AA,AB,AC ORDERBY AA DESC WHERE ' |
462 'NOT S connait O, O eid %(x)s, S is Personne, ' |
461 'NOT S connait O, O eid %(x)s, S is Personne, ' |
463 'S nom AA, S prenom AB, S modification_date AC, ' |
462 'S modification_date AA, S nom AB, S prenom AC, ' |
464 'NOT S identity O, NOT (S connait AD, AD nom "toto"), ' |
463 'NOT S identity O, NOT (S connait AD, AD nom "toto"), ' |
465 'EXISTS(S travaille AE, AE nom "tutu")') |
464 'EXISTS(S travaille AE, AE nom "tutu")') |
466 |
465 |
467 def test_unrelated_rql_s_linkto_s(self): |
466 def test_unrelated_rql_s_linkto_s(self): |
468 with self.admin_access.web_request() as req: |
467 with self.admin_access.web_request() as req: |