merge 3.15.x into 3.16.x stable
authorPierre-Yves David <pierre-yves.david@logilab.fr>
Thu, 28 Mar 2013 12:32:26 +0100
branchstable
changeset 8821 c4aa23af0baa
parent 8758 3a0d91237e2c (current diff)
parent 8820 dbffb6959564 (diff)
child 8822 064231ce93d5
child 8827 0d81a474c0fe
merge 3.15.x into 3.16.x
hooks/syncschema.py
selectors.py
server/sources/native.py
server/test/unittest_repository.py
--- a/hooks/syncschema.py	Thu Mar 21 16:52:13 2013 +0100
+++ b/hooks/syncschema.py	Thu Mar 28 12:32:26 2013 +0100
@@ -507,6 +507,8 @@
 
     def revertprecommit_event(self):
         # revert changes on in memory schema
+        if getattr(self, 'rdefdef', None) is None:
+            return
         self.session.vreg.schema.del_relation_def(
             self.rdefdef.subject, self.rdefdef.name, self.rdefdef.object)
         # XXX revert changes on database
--- a/server/sources/native.py	Thu Mar 21 16:52:13 2013 +0100
+++ b/server/sources/native.py	Thu Mar 28 12:32:26 2013 +0100
@@ -756,13 +756,17 @@
                     mo = re.search('unique_cw_[^ ]+_idx', arg)
                     if mo is not None:
                         index_name = mo.group(0)
-                        elements = index_name.rstrip('_idx').split('_cw_')[1:]
+                        # right-chop '_idx' postfix
+                        # (garanteed to be there, see regexp above)
+                        elements = index_name[:-4].split('_cw_')[1:]
                         etype = elements[0]
                         rtypes = elements[1:]
                         raise UniqueTogetherError(etype, rtypes)
                     mo = re.search('columns (.*) are not unique', arg)
                     if mo is not None: # sqlite in use
-                        rtypes = [c.strip().lstrip('cw_') for c in mo.group(1).split(',')]
+                        # we left chop the 'cw_' prefix of attribute names
+                        rtypes = [c.strip()[3:]
+                                  for c in mo.group(1).split(',')]
                         etype = '???'
                         raise UniqueTogetherError(etype, rtypes)
             raise
--- a/server/test/data/schema.py	Thu Mar 21 16:52:13 2013 +0100
+++ b/server/test/data/schema.py	Thu Mar 28 12:32:26 2013 +0100
@@ -52,6 +52,7 @@
 
 
 class Societe(EntityType):
+    __unique_together__ = [('nom', 'type', 'cp')]
     __permissions__ = {
         'read': ('managers', 'users', 'guests'),
         'update': ('managers', 'owners', ERQLExpression('U login L, X nom L')),
--- a/server/test/unittest_repository.py	Thu Mar 21 16:52:13 2013 +0100
+++ b/server/test/unittest_repository.py	Thu Mar 28 12:32:26 2013 +0100
@@ -51,6 +51,15 @@
     and relation
     """
 
+    def test_uniquetogether(self):
+        self.execute('INSERT Societe S: S nom "Logilab", S type "SSLL", S cp "75013"')
+        with self.assertRaises(ValidationError) as wraperr:
+            self.execute('INSERT Societe S: S nom "Logilab", S type "SSLL", S cp "75013"')
+        self.assertEqual({'nom': u'violates unique_together constraints (cp, nom, type)',
+                          'cp': u'violates unique_together constraints (cp, nom, type)',
+                          'type': u'violates unique_together constraints (cp, nom, type)'},
+                     wraperr.exception.args[1])
+
     def test_fill_schema(self):
         origshema = self.repo.schema
         try: