Add builds and build_logs tables to invirt-database for tracking build
[invirt/packages/invirt-database.git] / python / database / record.py
index b1b46bb..bcf3d45 100755 (executable)
@@ -1,31 +1,42 @@
 class Record(object):
     _identity_field = None
+    _default = {}
+    _format = {}
+
     def get(self, field):
-        try:
-            return self.__getattribute__(field)
-        except:
-            return None
+        v = getattr(self, field, None)
+        if v is None:
+            return self._default.get(field)
+        return v
+
     def _formatField(self, field):
         v = self.get(field)
+        func = self._format.get(field)
+        if func:
+            return func(v)
         if callable(v):
             v = v()
-        if hasattr(v, '__iter__'):
-            if len(v) == 0:
-                return '[]'
-            else:
-                return '[%d x %s]'%(len(v), type(v[0]))
-        else:
+        if not hasattr(v, '__iter__'):
             return repr(v)
+        if len(v) == 0:
+            return '[]'
+        return '[%d x %s]'%(len(v), type(v[0]).__name__)
+
+    @classmethod
+    def _ignore(cls):
+        return [cls._identity_field]
+
     def _fields(self):
         ignore = self._ignore()
-        keys = sorted(self.__class__.__dict__.keys())
-        return [(k,self._formatField(k)) for k in keys if k[0]!="_" and k not in ignore]
+        keys = sorted(self.c.keys())
+        return [(k,self._formatField(k)) for k in keys if k not in ignore]
+
     def __repr__(self):
         classname = self.__class__.__name__
 
         if self._identity_field:
             identity = self.__dict__.get(self._identity_field)
-            identity = ' ' + (identity and repr(identity) or 'hash=%d'%hash(self))
+            identity = ' ' + (identity and repr(identity) or 'hash=%X'%hash(self))
         else:
             identity = ''
 
@@ -34,23 +45,3 @@ class Record(object):
             payload = ": "+payload
 
         return "<%s%s%s>" % (classname, identity, payload)
-    def _ignore(self):
-        return [self._identity_field, 'c', 'query', 'get']
-
-class FormattableRecord(Record):
-    _format = {}
-    def _formatField(self, field):
-        func = self._format.get(field)
-        if func:
-            return func(self.get(field))
-        else:
-            return super(FormattableRecord, self)._formatField(field)
-
-class NullableRecord(FormattableRecord):
-    _default = {}
-    def get(self, field):
-        v = self.__dict__.get(field)
-        if v != None:
-            return v
-        else:
-            return self._default.get(field)