]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/dbconn.py
ORMObject: make validation more robust.
[dak.git] / daklib / dbconn.py
index 2f18343e974bd459fce862cddf9c89acdd0b2ea2..6317b5844467a260865d5c7c67996eda537d7822 100755 (executable)
@@ -204,7 +204,9 @@ class ORMObject(object):
                     # list
                     value = len(value)
                 elif hasattr(value, 'count'):
-                    # query
+                    # query (but not during validation)
+                    if self.in_validation:
+                        continue
                     value = value.count()
                 else:
                     raise KeyError('Do not understand property %s.' % property)
@@ -258,6 +260,8 @@ class ORMObject(object):
     validation_message = \
         "Validation failed because property '%s' must not be empty in object\n%s"
 
+    in_validation = False
+
     def validate(self):
         '''
         This function validates the not NULL constraints as returned by
@@ -272,8 +276,11 @@ class ORMObject(object):
                 getattr(self, property + '_id') is not None:
                 continue
             if not hasattr(self, property) or getattr(self, property) is None:
-                raise DBUpdateError(self.validation_message % \
-                    (property, str(self)))
+                # str() might lead to races due to a 2nd flush
+                self.in_validation = True
+                message = self.validation_message % (property, str(self))
+                self.in_validation = False
+                raise DBUpdateError(message)
 
     @classmethod
     @session_wrapper
@@ -346,11 +353,11 @@ class Validator(MapperExtension):
     '''
 
     def before_update(self, mapper, connection, instance):
-        #instance.validate()
+        instance.validate()
         return EXT_CONTINUE
 
     def before_insert(self, mapper, connection, instance):
-        #instance.validate()
+        instance.validate()
         return EXT_CONTINUE
 
 validator = Validator()
@@ -2692,7 +2699,7 @@ class Suite(ORMObject):
             'overrides_count']
 
     def not_null_constraints(self):
-        return ['suite_name', 'version']
+        return ['suite_name']
 
     def __eq__(self, val):
         if isinstance(val, str):