checking in new files
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Fri, 28 Sep 2012 00:40:51 +0000 (20:40 -0400)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Fri, 28 Sep 2012 00:40:51 +0000 (20:40 -0400)
PLC/Storage/Record.py [new file with mode: 0644]

diff --git a/PLC/Storage/Record.py b/PLC/Storage/Record.py
new file mode 100644 (file)
index 0000000..eca606e
--- /dev/null
@@ -0,0 +1,66 @@
+from PLC.Timestamp import Timestamp
+from types import StringTypes
+from datetime import datetime
+
+class Record(dict):
+
+    fields = {}
+    tags = {}
+    def __init__(self, dict=None, object=None):
+        self.object = object 
+        if dict:
+            self.update(dict)
+        if self.object:
+            self.update_fields()
+
+    def get_field(self, field):
+        return self.__dict__.get(field, None)
+
+    def update_fields(self):
+        for field in self.fields:
+            if hasattr(self.object, field):
+                self[field] = getattr(self.object, field)
+
+    # xxx fixme
+    # turns out the date_created field is received by the client as a 'created' int
+    # (and 'last_updated' does not make it at all)
+    # let's be flexible
+    def date_repr (self,fields):
+        if not isinstance(fields,list): fields=[fields]
+        for field in fields:
+            value=getattr(self,field,None)
+            if isinstance (value,datetime):
+                return Timestamp.string(value)
+            elif isinstance (value,(int,float)):
+                return Timestamp.string(value)
+        # fallback
+        return "** undef_datetime **"
+    
+    # it may be important to exclude relationships
+    def todict (self, exclude_type=None):
+        d=self.__dict__
+        def exclude (k,v):
+            if k.startswith('_'): return True
+            if exclude_type:
+                if isinstance (v,exclude_type): return True
+                if isinstance (v,list) and v and isinstance (v[0],exclude_type) : return True
+            return False
+        keys=[k for (k,v) in d.items() if not exclude(k,v)]
+        return dict ( [ (k,d[k]) for k in keys ] )
+    
+    def validate(self):
+        # Validate values before committing
+        for key, value in self.iteritems():
+            if value is not None and hasattr(self, 'validate_' + key):
+                validate = getattr(self, 'validate_' + key)
+                self[key] = validate(value)
+
+    def validate_timestamp (self, timestamp):
+        return Timestamp.sql_validate(timestamp) 
+
+    def sync(self, commit=True, validate=True):
+        # Validate all specified fields
+        if validate: self.validate()
+
+
+