X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fstorage%2Frecord.py;h=ac391a177e7bfec2048a7d8d78126bad772f1b85;hb=4a9e6751f9f396f463932133b9d62fc925a99ef6;hp=3a9c315976af0c3b562c23752395fec89eb39cf3;hpb=fad16c7d54b658b37a9b42fbee47b0d4f51cb8ec;p=sfa.git diff --git a/sfa/storage/record.py b/sfa/storage/record.py index 3a9c3159..ac391a17 100644 --- a/sfa/storage/record.py +++ b/sfa/storage/record.py @@ -1,12 +1,13 @@ -from __future__ import print_function + from sfa.util.sfatime import utcparse, datetime_to_string -from types import StringTypes from datetime import datetime from sfa.util.xml import XML from sfa.trust.gid import GID from sfa.util.sfalogging import logger +from sfa.util.py23 import StringType + class Record: @@ -16,7 +17,7 @@ class Record: elif xml_str: xml = XML(xml_str) xml_dict = xml.todict() - self.load_from_dict(xml_dict) + self.load_from_dict(xml_dict) def get_field(self, field): return self.__dict__.get(field, None) @@ -25,53 +26,55 @@ class Record: # 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): + 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 datetime_to_string (value) - elif isinstance (value,(int,float)): + value = getattr(self, field, None) + if isinstance(value, datetime): + return datetime_to_string(value) + elif isinstance(value, (int, float)): return datetime_to_string(utcparse(value)) # fallback return "** undef_datetime **" - + # # need to filter out results, esp. wrt relationships # exclude_types must be a tuple so we can use isinstance - # - def record_to_dict (self, exclude_types=None): + # + def record_to_dict(self, exclude_types=None): if exclude_types is None: exclude_types = () d = self.__dict__ - def exclude (k, v): - return k.startswith('_') or isinstance (v, exclude_types) - keys = [ k for k, v in d.items() if not exclude(k, v) ] - return { k : d[k] for k in keys } - + + def exclude(k, v): + return k.startswith('_') or isinstance(v, exclude_types) + keys = [k for k, v in list(d.items()) if not exclude(k, v)] + return {k: d[k] for k in keys} + def toxml(self): return self.save_as_xml() - def load_from_dict (self, d): - for (k,v) in d.iteritems(): + def load_from_dict(self, d): + for (k, v) in d.items(): # experimental - if isinstance(v, StringTypes) and v.lower() in ['true']: + if isinstance(v, StringType) and v.lower() in ['true']: v = True - if isinstance(v, StringTypes) and v.lower() in ['false']: + if isinstance(v, StringType) and v.lower() in ['false']: v = False setattr(self, k, v) # in addition we provide convenience for converting to and from xml records # for this purpose only, we need the subclasses to define 'fields' as either # a list or a dictionary - def fields (self): - fields = self.__dict__.keys() + def fields(self): + fields = list(self.__dict__.keys()) return fields - def save_as_xml (self): + def save_as_xml(self): # xxx not sure about the scope here - input_dict = dict( [ (key, getattr(self,key)) for key in self.fields() if getattr(self,key,None) ] ) + input_dict = dict([(key, getattr(self, key)) + for key in self.fields() if getattr(self, key, None)]) xml_record = XML("") xml_record.parse_dict(input_dict) return xml_record.toxml() @@ -82,29 +85,32 @@ class Record: else: format = format.lower() if format == 'text': - self.dump_text(dump_parents,sort=sort) + self.dump_text(dump_parents, sort=sort) elif format == 'xml': print(self.save_as_xml()) elif format == 'simple': print(self.dump_simple()) else: - raise Exception, "Invalid format %s" % format + raise Exception("Invalid format %s" % format) def dump_text(self, dump_parents=False, sort=False): - print(40*'=') + print(40 * '=') print("RECORD") # print remaining fields fields = self.fields() - if sort: fields.sort() + if sort: + fields.sort() for attrib_name in fields: attrib = getattr(self, attrib_name) # skip internals - if attrib_name.startswith('_'): continue + if attrib_name.startswith('_'): + continue # skip callables - if callable (attrib): continue - # handle gid + if callable(attrib): + continue + # handle gid if attrib_name == 'gid': - print(" gid:") + print(" gid:") print(GID(string=attrib).dump_string(8, dump_parents)) elif attrib_name in ['date created', 'last updated']: print(" %s: %s" % (attrib_name, self.date_repr(attrib_name))) @@ -112,4 +118,4 @@ class Record: print(" %s: %s" % (attrib_name, attrib)) def dump_simple(self): - return "%s"%self + return "%s" % self