parse timestamps correctly
[sfa.git] / sfa / storage / record.py
index b1f0b6b..1174fe1 100644 (file)
@@ -11,6 +11,7 @@ from sfa.util.xrn import get_authority
 from sfa.storage.row import Row
 from sfa.util.xml import XML 
 from sfa.util.sfalogging import logger
+from sfa.util.sfatime import utcparse, datetime_to_string
 
 class SfaRecord(Row):
     """ 
@@ -32,14 +33,13 @@ class SfaRecord(Row):
     of different types.
     """
 
-    table_name = 'sfa'
-    
-    primary_key = 'record_id'
+#    table_name = 'sfa'
+#    primary_key = 'record_id'
 
     ### the wsdl generator assumes this is named 'fields'
     internal_fields = {
-        'record_id': Parameter(int, 'An id that uniquely identifies this record', ro=True),
-        'pointer': Parameter(int, 'An id that uniquely identifies this record in an external database ')
+        'record_id': Parameter(int, "An id that uniquely identifies this record", ro=True),
+        'pointer': Parameter(int, "An id that uniquely identifies this record in an external database")
     }
 
     fields = {
@@ -48,8 +48,8 @@ class SfaRecord(Row):
         'hrn': Parameter(str, "Human readable name of object"),
         'gid': Parameter(str, "GID of the object"),
         'type': Parameter(str, "Record type"),
-        'last_updated': Parameter(int, 'Date and time of last update', ro=True),
-        'date_created': Parameter(int, 'Date and time this record was created', ro=True),
+        'last_updated': Parameter(int, "Date and time of last update", ro=True),
+        'date_created': Parameter(int, "Date and time this record was created", ro=True),
     }
     all_fields = dict(fields.items() + internal_fields.items())
     ##
@@ -61,7 +61,8 @@ class SfaRecord(Row):
     # @param pointer is a pointer to a PLC record
     # @param dict if !=None, then fill in this record from the dictionary
 
-    def __init__(self, hrn=None, gid=None, type=None, pointer=None, authority=None, peer_authority=None, dict=None, string=None):
+    def __init__(self, hrn=None, gid=None, type=None, pointer=None, authority=None, 
+                 peer_authority=None, dict=None, string=None):
         self.dirty = True
         self.hrn = None
         self.gid = None
@@ -313,9 +314,9 @@ class SfaRecord(Row):
         """
         recorddict = self.as_dict()
         filteredDict = dict([(key, val) for (key, val) in recorddict.iteritems() if key in self.fields.keys()])
-        record = XML('<record/>')
-        record.parse_dict(filteredDict)
-        str = record.toxml()
+        xml_record = XML('<record/>')
+        xml_record.parse_dict(filteredDict)
+        str = xml_record.toxml()
         return str
 
     ##
@@ -329,44 +330,59 @@ class SfaRecord(Row):
         """
         #dict = xmlrpclib.loads(str)[0][0]
 
-        record = XML(str)
-        self.load_from_dict(record.todict())
+        xml_record = XML(str)
+        self.load_from_dict(xml_record.todict())
 
     ##
     # Dump the record to stdout
     #
     # @param dump_parents if true, then the parents of the GID will be dumped
 
-    def dump(self, dump_parents=False):
+    def dump_text(self, dump_parents=False):
         """
         Walk tree and dump records.
         """
-        #print "RECORD", self.name
-        #print "        hrn:", self.name
-        #print "       type:", self.type
-        #print "        gid:"
-        #if (not self.gid):
-        #    print "        None"
-        #else:
-        #    self.get_gid_object().dump(8, dump_parents)
-        #print "    pointer:", self.pointer
+        # print core fields in this order 
+        print "".join(['=' for i in range(40)])
+        print "RECORD"
+        print "    hrn:", self.get('hrn')
+        print "    type:", self.get('type')
+        print "    authority:", self.get('authority')
+        date_created = datetime_to_string(utcparse(self.get('date_created')))    
+        print "    date created:", date_created
+        last_updated = datetime_to_string(utcparse(self.get('last_updated')))    
+        print "    last updated:", last_updated
+        print "    gid:"
+        print "\t\t", self.get_gid_object().dump_string(8, dump_parents)
        
-        order = SfaRecord.fields.keys() 
-        for key in self.keys():
-            if key not in order:
-                order.append(key)
-        for key in order:
-            if key in self and key in self.fields:
-                if key in 'gid' and self[key]:
-                    gid = GID(string=self[key])
-                    print "     %s:" % key
-                    gid.dump(8, dump_parents)
-                else:    
-                    print "     %s: %s" % (key, self[key])
-    
+        # print remaining fields
+        all_fields = set(UserRecord.fields.keys() + 
+                         AuthorityRecord.fields.keys() + 
+                         SliceRecord.fields.keys() + 
+                         NodeRecord.fields.keys())                   
+        for field in self:
+            # dont print core fields
+            if field in all_fields and field not in SfaRecord.fields:    
+                print "     %s: %s" % (field, self[field])
+
+    def dump(self, format=None, dump_parents=False):
+        if not format:
+            format = 'text'
+        else:
+            format = format.lower()
+
+        if format == 'text': 
+            self.dump_text(dump_parents)            
+        elif format == 'xml':
+            print self.save_to_string()    
+        elif format == 'summary':
+            print self.summary_string()
+        else:
+            raise Exception, "Invalid format %s" % format 
+              
     def summary_string(self):
-        return "Record(record_id=%s, hrn=%s, type=%s, auth=%s, pointer=%s)" % \
-                (self.get('record_id'), self.get('hrn'), self.get('type'), self.get('auth'), \
+        return "Record(record_id=%s, hrn=%s, type=%s, authority=%s, pointer=%s)" % \
+                (self.get('record_id'), self.get('hrn'), self.get('type'), self.get('authority'), \
                  self.get('pointer'))
 
     def getdict(self):
@@ -400,6 +416,7 @@ class SfaRecord(Row):
         """
         from sfa.storage.table import SfaTable
         table = SfaTable()
+        filter = {}
         if self.get('record_id'):
             filter['record_id'] = self.get('record_id')
         if self.get('hrn') and self.get('type'):
@@ -407,9 +424,10 @@ class SfaRecord(Row):
             filter['type'] = self.get('type')
             if self.get('pointer'):
                 filter['pointer'] = self.get('pointer')
-        existing_records = table.find(filter)
-        for record in existing_records:
-            table.remove(record)
+        if filter:
+            existing_records = table.find(filter)
+            for record in existing_records:
+                table.remove(record)
 
 class UserRecord(SfaRecord):
 
@@ -439,7 +457,6 @@ class NodeRecord(SfaRecord):
     fields = {
         'hostname': Parameter(str, 'This nodes dns name'),
         'node_type': Parameter(str, 'Type of node this is'),
-        'node_type': Parameter(str, 'Type of node this is'),
         'latitude': Parameter(str, 'latitude'),
         'longitude': Parameter(str, 'longitude'),
         }