fix for {"text":} dictionaries in record fields
[sfa.git] / sfa / util / record.py
index de221fc..424f419 100644 (file)
@@ -1,25 +1,21 @@
 ##
-# Implements support for geni records
+# Implements support for SFA records
 #
 # TODO: Use existing PLC database methods? or keep this separate?
 ##
 
-### $Id$
-### $URL$
-
 from types import StringTypes
 
-from sfa.trust.gid import *
+from sfa.trust.gid import GID
 
-import sfa.util.report
-from sfa.util.rspec import *
-from sfa.util.parameter import *
-from sfa.util.namespace import *
+from sfa.util.parameter import Parameter
+from sfa.util.xrn import get_authority
 from sfa.util.row import Row
+from sfa.util.xml import XML 
 
-class GeniRecord(Row):
+class SfaRecord(Row):
     """ 
-    The GeniRecord class implements a Geni Record. A GeniRecord is a tuple
+    The SfaRecord class implements an SFA Record. A SfaRecord is a tuple
     (Hrn, GID, Type, Info).
  
     Hrn specifies the Human Readable Name of the object
@@ -58,7 +54,7 @@ class GeniRecord(Row):
     }
     all_fields = dict(fields.items() + internal_fields.items())
     ##
-    # Create a Geni Record
+    # Create an SFA Record
     #
     # @param name if !=None, assign the name of the record
     # @param gid if !=None, assign the gid of the record
@@ -208,6 +204,22 @@ class GeniRecord(Row):
         """
         return GID(string=self.gid)
 
+    ##
+    # Returns the value of a field
+
+    def get_field(self, fieldname, default=None):
+        # sometimes records act like classes, and sometimes they act like dicts
+        try:
+            return getattr(self, fieldname)
+        except AttributeError:
+            try:
+                 return self[fieldname]
+            except KeyError:
+                 if default != None:
+                     return default
+                 else:
+                     raise
+
     ##
     # Returns a list of field names in this record. 
 
@@ -267,6 +279,7 @@ class GeniRecord(Row):
         """
         Load the record from a dictionary 
         """
+
         self.set_name(dict['hrn'])
         gidstr = dict.get("gid", None)
         if gidstr:
@@ -289,10 +302,9 @@ class GeniRecord(Row):
         """
         recorddict = self.as_dict()
         filteredDict = dict([(key, val) for (key, val) in recorddict.iteritems() if key in self.fields.keys()])
-        record = RecordSpec()
-        record.parseDict(filteredDict)
+        record = XML('<record/>')
+        record.parse_dict(filteredDict)
         str = record.toxml()
-        #str = xmlrpclib.dumps((dict,), allow_none=True)
         return str
 
     ##
@@ -305,12 +317,9 @@ class GeniRecord(Row):
         representation of the record.
         """
         #dict = xmlrpclib.loads(str)[0][0]
-        
-        record = RecordSpec()
-        record.parseString(str)
-        record_dict = record.toDict()
-        geni_dict = record_dict['record']
-        self.load_from_dict(geni_dict)
+
+        record = XML(str)
+        self.load_from_dict(record.todict2())
 
     ##
     # Dump the record to stdout
@@ -331,7 +340,7 @@ class GeniRecord(Row):
         #    self.get_gid_object().dump(8, dump_parents)
         #print "    pointer:", self.pointer
        
-        order = GeniRecord.fields.keys() 
+        order = SfaRecord.fields.keys() 
         for key in self.keys():
             if key not in order:
                 order.append(key)
@@ -348,30 +357,31 @@ class GeniRecord(Row):
         return dict(self)
     
 
-class UserRecord(GeniRecord):
+class UserRecord(SfaRecord):
 
     fields = {
         'email': Parameter(str, 'email'),
         'first_name': Parameter(str, 'First name'),
         'last_name': Parameter(str, 'Last name'),
         'phone': Parameter(str, 'Phone Number'),
-        'key': Parameter(str, 'Public key'),
+        'keys': Parameter(str, 'Public key'),
         'slices': Parameter([str], 'List of slices this user belongs to'),
         }
-    fields.update(GeniRecord.fields)
+    fields.update(SfaRecord.fields)
     
-class SliceRecord(GeniRecord):
+class SliceRecord(SfaRecord):
     fields = {
         'name': Parameter(str, 'Slice name'),
         'url': Parameter(str, 'Slice url'),
         'expires': Parameter(int, 'Date and time this slice exipres'),
         'researcher': Parameter([str], 'List of users for this slice'),
+        'PI': Parameter([str], 'List of PIs responsible for this slice'),
         'description': Parameter([str], 'Description of this slice'), 
         }
-    fields.update(GeniRecord.fields)
+    fields.update(SfaRecord.fields)
 
  
-class NodeRecord(GeniRecord):
+class NodeRecord(SfaRecord):
     fields = {
         'hostname': Parameter(str, 'This nodes dns name'),
         'node_type': Parameter(str, 'Type of node this is'),
@@ -379,10 +389,10 @@ class NodeRecord(GeniRecord):
         'latitude': Parameter(str, 'latitude'),
         'longitude': Parameter(str, 'longitude'),
         }
-    fields.update(GeniRecord.fields)
+    fields.update(SfaRecord.fields)
 
 
-class AuthorityRecord(GeniRecord):
+class AuthorityRecord(SfaRecord):
     fields =  {
         'name': Parameter(str, 'Name'),
         'login_base': Parameter(str, 'login base'),
@@ -393,6 +403,6 @@ class AuthorityRecord(GeniRecord):
         'researcher': Parameter([str], 'List of researchers'),
         'PI': Parameter([str], 'List of Principal Investigators'),
         }
-    fields.update(GeniRecord.fields)
+    fields.update(SfaRecord.fields)