X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FTable.py;h=2362d61a56e4e9db93e0dd568e1c0357b56157f0;hb=refs%2Fheads%2Fplanetlab-4_0-branch;hp=60682edcd62aad3e8987f8ca2a0b1b3e218ef00d;hpb=3a5113656ca6eae376c94c05405654c21575c126;p=plcapi.git diff --git a/PLC/Table.py b/PLC/Table.py index 60682ed..2362d61 100644 --- a/PLC/Table.py +++ b/PLC/Table.py @@ -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.