# HG changeset patch # User Alexandre Fayolle # Date 1303311352 -7200 # Node ID 576abb8c4626707eacfd1db3992d29ae0b003513 # Parent 9f619715665b55a6958430e6248e110ccc7155c5 fix implementation of repository.glob_add_relations (closes ##1625257) the internal data structure had changed during implementation and the code had not been updated... diff -r 9f619715665b -r 576abb8c4626 server/repository.py --- a/server/repository.py Fri Apr 15 15:42:17 2011 +0200 +++ b/server/repository.py Wed Apr 20 16:55:52 2011 +0200 @@ -1389,23 +1389,31 @@ print 'ADD relation', subject, rtype, object for subject, object in eids_subj_obj: source = self.locate_relation_source(session, subject, rtype, object) - if source in sources: - sources[source][1].append((subject, object)) + if source not in sources: + relations_by_rtype = {} + sources[source] = relations_by_rtype + else: + relations_by_rtype = sources[source] + if rtype in relations_by_rtype: + relations_by_rtype[rtype].append((subject, object)) else: - sources[source] = rtype, [(subject, object)] - for source, (rtype, source_relations) in sources.iteritems(): + relations_by_rtype[rtype] = [(subject, object)] + for source, relations_by_rtype in sources.iteritems(): if source.should_call_hooks: + for rtype, source_relations in relations_by_rtype.iteritems(): + for subject, object in source_relations: + del_existing_rel_if_needed(session, subject, rtype, object) + self.hm.call_hooks('before_add_relation', session, + rtype=rtype, eids_from_to=source_relations) + for rtype, source_relations in relations_by_rtype.iteritems(): + source.add_relations(session, rtype, source_relations) + rschema = self.schema.rschema(rtype) for subject, object in source_relations: - del_existing_rel_if_needed(session, subject, rtype, object) - self.hm.call_hooks('before_add_relation', session, - rtype=rtype, eids_from_to=source_relations) - source.add_relations(session, rtype, source_relations) - rschema = self.schema.rschema(rtype) - for subject, object in source_relations: - session.update_rel_cache_add(subject, rtype, object, rschema.symmetric) + session.update_rel_cache_add(subject, rtype, object, rschema.symmetric) if source.should_call_hooks: - self.hm.call_hooks('after_add_relation', session, - rtype=rtype, eids_from_to=source_relations) + for rtype, source_relations in relations_by_rtype.iteritems(): + self.hm.call_hooks('after_add_relation', session, + rtype=rtype, eids_from_to=source_relations) def glob_delete_relation(self, session, subject, rtype, object): """delete a relation from the repository""" diff -r 9f619715665b -r 576abb8c4626 server/test/data/schema.py --- a/server/test/data/schema.py Fri Apr 15 15:42:17 2011 +0200 +++ b/server/test/data/schema.py Wed Apr 20 16:55:52 2011 +0200 @@ -232,3 +232,8 @@ cardinality='?*' inlined=True + +class login_user(RelationDefinition): + subject = 'Personne' + object = 'CWUser' + cardinality = '??' diff -r 9f619715665b -r 576abb8c4626 server/test/unittest_repository.py --- a/server/test/unittest_repository.py Fri Apr 15 15:42:17 2011 +0200 +++ b/server/test/unittest_repository.py Wed Apr 20 16:55:52 2011 +0200 @@ -685,6 +685,19 @@ req.cnx.commit() self.assertEqual(cm.exception.errors, {'inline1-subject': u'RQLUniqueConstraint S type T, S inline1 A1, A1 todo_by C, Y type T, Y inline1 A2, A2 todo_by C failed'}) + def test_add_relations_at_creation_with_del_existing_rel(self): + req = self.request() + person = req.create_entity('Personne', nom=u'Toto', prenom=u'Lanturlu', sexe=u'M') + users_rql = 'Any U WHERE U is CWGroup, U name "users"' + users = self.execute(users_rql).get_entity(0, 0) + req.create_entity('CWUser', + login=u'Toto', + upassword=u'firstname', + firstname=u'firstname', + surname=u'surname', + reverse_login_user=person, + in_group=users) + self.commit() class PerformanceTest(CubicWebTC): @@ -825,5 +838,7 @@ t1 = time.time() self.info('add relations (inlined): %.2gs', t1-t0) + + if __name__ == '__main__': unittest_main()