# HG changeset patch # User Sylvain Thénault # Date 1249659724 -7200 # Node ID 0dafa29ace1fa392d0c53f114588d63bf13ebc05 # Parent 66048c669933a4b4e2583ebf47b177b897cc020e [schema migration] test reproducing pb when deleting a relation definition with mandatory card and without removing the associated rtype + fix diff -r 66048c669933 -r 0dafa29ace1f server/hooks.py --- a/server/hooks.py Fri Aug 07 17:40:52 2009 +0200 +++ b/server/hooks.py Fri Aug 07 17:42:04 2009 +0200 @@ -313,6 +313,9 @@ if rtype in DONT_CHECK_RTYPES_ON_DEL: return card = rproperty(session, rtype, eidfrom, eidto, 'cardinality') + pendingrdefs = session.transaction_data.get('pendingrdefs', ()) + if (session.describe(eidfrom)[0], rtype, session.describe(eidto)[0]) in pendingrdefs: + return pendingeids = session.transaction_data.get('pendingeids', ()) if card[0] in '1+' and not eidfrom in pendingeids: checkrel_if_necessary(session, CheckSRelationOp, rtype, eidfrom) diff -r 66048c669933 -r 0dafa29ace1f server/schemahooks.py --- a/server/schemahooks.py Fri Aug 07 17:40:52 2009 +0200 +++ b/server/schemahooks.py Fri Aug 07 17:42:04 2009 +0200 @@ -772,6 +772,8 @@ else: rdeftype = 'CWRelation' if not (subjschema.eid in pendings or objschema.eid in pendings): + pending = session.transaction_data.setdefault('pendingrdefs', set()) + pending.add((subjschema, rschema, objschema)) session.execute('DELETE X %s Y WHERE X is %s, Y is %s' % (rschema, subjschema, objschema)) execute = session.unsafe_execute diff -r 66048c669933 -r 0dafa29ace1f server/test/data/migratedapp/schema.py --- a/server/test/data/migratedapp/schema.py Fri Aug 07 17:40:52 2009 +0200 +++ b/server/test/data/migratedapp/schema.py Fri Aug 07 17:42:04 2009 +0200 @@ -90,7 +90,7 @@ travaille = SubjectRelation('Societe') concerne = SubjectRelation('Affaire') - concerne2 = SubjectRelation('Affaire') + concerne2 = SubjectRelation(('Affaire', 'Note'), cardinality='1*') connait = SubjectRelation('Personne', symetric=True) class Societe(EntityType): diff -r 66048c669933 -r 0dafa29ace1f server/test/unittest_migractions.py --- a/server/test/unittest_migractions.py Fri Aug 07 17:40:52 2009 +0200 +++ b/server/test/unittest_migractions.py Fri Aug 07 17:42:04 2009 +0200 @@ -177,8 +177,19 @@ self.mh.cmd_add_relation_definition('Personne', 'concerne2', 'Affaire') self.assertEquals(self.schema['concerne2'].subjects(), ('Personne',)) - self.assertEquals(self.schema['concerne2'].objects(), ('Affaire',)) + self.assertEquals(self.schema['concerne2'].objects(), + ('Affaire', )) + self.assertEquals(self.schema['concerne2'].rproperty('Personne', 'Affaire', 'cardinality'), + '1*') + self.mh.cmd_add_relation_definition('Personne', 'concerne2', 'Note') + self.assertEquals(sorted(self.schema['concerne2'].objects()), ['Affaire', 'Note']) + self.mh.add_entity('Personne', nom=u'tot') + self.mh.add_entity('Affaire') + self.mh.rqlexec('SET X concerne2 Y WHERE X is Personne, Y is Affaire') + self.commit() self.mh.cmd_drop_relation_definition('Personne', 'concerne2', 'Affaire') + self.failUnless('concerne2' in self.schema) + self.mh.cmd_drop_relation_definition('Personne', 'concerne2', 'Note') self.failIf('concerne2' in self.schema) def test_drop_relation_definition_existant_rtype(self):