Merge remote-tracking branch 'origin/pycurl' into planetlab-4_0-branch
[plcapi.git] / PLC / Table.py
index 60682ed..2362d61 100644 (file)
@@ -50,18 +50,57 @@ class Row(dict):
             if value is not None and hasattr(self, 'validate_' + key):
                 validate = getattr(self, 'validate_' + key)
                 self[key] = validate(value)
+       
+    def separate_types(self, items):
+       """
+       Separate a list of different typed objects. 
+       Return a list for each type (ints, strs and dicts)
+       """
+       
+       if isinstance(items, (list, tuple, set)):
+           ints = filter(lambda x: isinstance(x, (int, long)), items)
+           strs = filter(lambda x: isinstance(x, StringTypes), items)
+           dicts = filter(lambda x: isinstance(x, dict), items)
+           return (ints, strs, dicts)          
+       else:
+           raise PLCInvalidArgument, "Can only separate list types" 
+               
+
+    def associate(self, *args):
+       """
+       Provides a means for high lvl api calls to associate objects
+        using low lvl calls.
+       """
+
+       if len(args) < 3:
+           raise PLCInvalidArgumentCount, "auth, field, value must be specified"
+       elif hasattr(self, 'associate_' + args[1]):
+           associate = getattr(self, 'associate_'+args[1])
+           associate(*args)
+       else:
+           raise PLCInvalidArguemnt, "No such associate function associate_%s" % args[1]
+
+    def validate_timestamp(self, timestamp, check_future = False):
+        """
+        Validates the specified GMT timestamp string (must be in
+        %Y-%m-%d %H:%M:%S format) or number (seconds since UNIX epoch,
+        i.e., 1970-01-01 00:00:00 GMT). If check_future is True,
+        raises an exception if timestamp is not in the future. Returns
+        a GMT timestamp string.
+        """
+
+        time_format = "%Y-%m-%d %H:%M:%S"
 
-    time_format = "%Y-%m-%d %H:%M:%S"
-    def validate_timestamp (self, timestamp, check_future=False):
-       # in case we try to sync the same object twice
        if isinstance(timestamp, StringTypes):
-           # calendar.timegm is the inverse of time.gmtime, in that it computes in UTC
-           # surprisingly enough, no other method in the time module behaves this way
-            # this method is documented in the time module's documentation
-           timestamp = calendar.timegm (time.strptime (timestamp,Row.time_format))
-       human = time.strftime (Row.time_format, time.gmtime(timestamp))
-       if check_future and (timestamp < time.time()):
-            raise PLCInvalidArgument, "%s: date must be in the future"%human
+           # calendar.timegm() is the inverse of time.gmtime()
+           timestamp = calendar.timegm(time.strptime(timestamp, time_format))
+
+        # Human readable timestamp string
+       human = time.strftime(time_format, time.gmtime(timestamp))
+
+       if check_future and timestamp < time.time():
+            raise PLCInvalidArgument, "'%s' not in the future" % human
+
        return human
 
     def add_object(self, classobj, join_table, columns = None):
@@ -82,7 +121,7 @@ class Row(dict):
             assert isinstance(obj, classobj)
             assert isinstance(obj, Row)
             assert obj.primary_key in obj
-            assert join_table in obj.join_tables
+           assert join_table in obj.join_tables
 
             # By default, just insert the primary keys of each object
             # into the join table.