def get(obj, field_name, field_instance=None): """ @TODO needs significant cleanup """ has_field_instance = bool(field_instance) field_instance = field_instance or self.document._fields.get(field_name, None) or getattr(self.document, field_name, None) if has_field_instance: field_value = obj elif isinstance(obj, dict): return obj[field_name] else: try: field_value = getattr(obj, field_name) except AttributeError: raise UnknownFieldError if isinstance(field_instance, (ReferenceField, GenericReferenceField, EmbeddedDocumentField)): if field_name in self._related_resources: return field_value and not isinstance(field_value, DBRef) and self._related_resources[field_name]().serialize_field(field_value, **kwargs) else: if isinstance(field_value, DocumentProxy): # Don't perform a DBRef isinstance check below since # it might trigger an extra query. return field_value.to_dbref() if isinstance(field_value, DBRef): return field_value return field_value and field_value.to_dbref() elif isinstance(field_instance, ListField): return [val for val in [get(elem, field_name, field_instance=field_instance.field) for elem in field_value] if val] elif isinstance(field_instance, DictField): if field_instance.field: return dict( (key, get(elem, field_name, field_instance=field_instance.field)) for (key, elem) in field_value.iteritems()) else: return field_value elif callable(field_instance): if isinstance(field_value, list): value = field_value else: if isbound(field_instance): value = field_instance() elif isbound(field_value): value = field_value() else: value = field_instance(obj) if field_name in self._related_resources: if isinstance(value, list): return [self._related_resources[field_name]().serialize_field(o, **kwargs) for o in value] elif value is None: return None else: return self._related_resources[field_name]().serialize_field(value, **kwargs) return value return field_value
def get(obj, field_name, field_instance=None): """ @TODO needs significant cleanup """ has_field_instance = bool(field_instance) field_instance = field_instance or self.document._fields.get(field_name, None) or getattr(self.document, field_name, None) if has_field_instance: field_value = obj elif isinstance(obj, dict): return obj[field_name] else: field_value = getattr(obj, field_name) if isinstance(field_instance, (ReferenceField, EmbeddedDocumentField)): if field_name in self._related_resources: return field_value and not isinstance(field_value, DBRef) and self._related_resources[field_name]().serialize_field(field_value, **kwargs) else: if isinstance(field_value, DBRef): return field_value return field_value and field_value.to_dbref() elif isinstance(field_instance, DateTimeField) and field_value and isinstance(field_value, datetime.datetime): field_value = field_value.isoformat() + 'Z' elif isinstance(field_instance, ListField): return [val for val in [get(elem, field_name, field_instance=field_instance.field) for elem in field_value] if val] elif isinstance(field_instance, FileField): # FileField support (Returns file ID) field_id = getattr(obj, field_name).grid_id if field_id != None: field_id = str(field_id) return field_id elif isinstance(field_instance, DictField): if field_instance.field: return dict( (key, get(elem, field_name, field_instance=field_instance.field)) for (key, elem) in field_value.iteritems()) else: return field_value elif callable(field_instance): if isinstance(field_value, list): value = field_value else: if isbound(field_instance): value = field_instance() elif isbound(field_value): value = field_value() else: value = field_instance(obj) if field_name in self._related_resources: return [self._related_resources[field_name]().serialize_field(o, **kwargs) for o in value] return value return field_value
def get(obj, field_name, field_instance=None): """ @TODO needs significant cleanup """ if related == True and isinstance( field_instance or getattr(self.document, field_name), ReferenceField): value = obj._data[field_name] if value and not isinstance(value, DBRef): value = value.to_dbref() return value field_value = obj if field_instance else getattr(obj, field_name) field_instance = field_instance or getattr(self.document, field_name) if isinstance(field_instance, (ReferenceField, EmbeddedDocumentField)): if field_name in self._related_resources: kwargs['related'] = True return field_value and not isinstance( field_value, DBRef ) and self._related_resources[field_name]().serialize( field_value, **kwargs) else: if isinstance(field_value, DBRef): return field_value return field_value and field_value.to_dbref() elif isinstance(field_instance, ListField): return [ val for val in [ get(elem, field_name, field_instance=field_instance.field) for elem in field_value ] if val ] elif callable(field_instance): if isinstance(field_value, list): value = field_value else: if isbound(field_instance): value = field_instance() elif isbound(field_value): value = field_value() else: value = field_instance(obj) if field_name in self._related_resources: kwargs['related'] = True return [ self._related_resources[field_name]().serialize( o, **kwargs) for o in value ] return value return field_value
def get(obj, field_name, field_instance=None): """ @TODO needs significant cleanup """ has_field_instance = bool(field_instance) field_instance = field_instance or getattr(self.document, field_name) if has_field_instance: field_value = obj elif isinstance(field_instance, (ReferenceField, EmbeddedDocumentField)) and field_name not in self._related_resources: # Don't dereference references if no related resource is specified. field_value = obj._data[field_name] elif isinstance(obj, dict): return obj[field_name] else: field_value = getattr(obj, field_name) if isinstance(field_instance, (ReferenceField, EmbeddedDocumentField)): if field_name in self._related_resources: return field_value and not isinstance(field_value, DBRef) and self._related_resources[field_name]().serialize_field(field_value, **kwargs) else: if isinstance(field_value, DBRef): return field_value return field_value and field_value.to_dbref() elif isinstance(field_instance, ListField): return [val for val in [get(elem, field_name, field_instance=field_instance.field) for elem in field_value] if val] elif isinstance(field_instance, DictField): if field_instance.field: return dict( (key, get(elem, field_name, field_instance=field_instance.field)) for (key, elem) in field_value.iteritems()) else: return field_value elif callable(field_instance): if isinstance(field_value, list): value = field_value else: if isbound(field_instance): value = field_instance() elif isbound(field_value): value = field_value() else: value = field_instance(obj) if field_name in self._related_resources: return [self._related_resources[field_name]().serialize_field(o, **kwargs) for o in value] return value return field_value
def get(obj, field_name, field_instance=None): """ @TODO needs significant cleanup """ if related == True and isinstance(field_instance or getattr(self.document, field_name), ReferenceField): value = obj._data[field_name] if value and not isinstance(value, DBRef): value = value.to_dbref() return value try: field_value = obj if field_instance else getattr(obj, field_name) except: if isinstance(obj, dict) and field_name in obj.keys(): field_value = obj[field_name] else: field_value = None # :( field_instance = field_instance or getattr(self.document, field_name) if isinstance(field_instance, (ReferenceField, EmbeddedDocumentField)): if field_name in self._related_resources: kwargs['related'] = True return field_value and self._related_resources[field_name]().serialize(field_value, **kwargs) else: if isinstance(field_value, DBRef): return field_value try: return field_value and field_value.to_dbref() except: return field_value elif isinstance(field_instance, ListField): return [get(elem, field_name, field_instance=field_instance.field) for elem in field_value] elif callable(field_instance): if isinstance(field_value, list): value = field_value else: if isbound(field_instance): value = field_instance() elif isbound(field_value): value = field_value() else: value = field_instance(obj) if field_name in self._related_resources: kwargs['related'] = True return [self._related_resources[field_name]().serialize(o, **kwargs) for o in value] return value return field_value
def get(obj, field_name, field_instance=None): """ @TODO needs significant cleanup """ has_field_instance = bool(field_instance) field_instance = field_instance or getattr(self.document, field_name, None) if has_field_instance: field_value = obj elif isinstance(field_instance, (ReferenceField, EmbeddedDocumentField )) and field_name not in self._related_resources: # Don't dereference references if no related resource is specified. field_value = obj._data[field_name] elif isinstance(obj, dict): return obj[field_name] else: field_value = getattr(obj, field_name) if isinstance(field_instance, (ReferenceField, EmbeddedDocumentField)): if field_name in self._related_resources: return field_value and not isinstance( field_value, DBRef) and self._related_resources[field_name]( ).serialize_field(field_value, **kwargs) else: if isinstance(field_value, DBRef): return field_value return field_value and field_value.to_dbref() elif isinstance(field_instance, ListField): return [ val for val in [ get(elem, field_name, field_instance=field_instance.field) for elem in field_value ] if val ] elif isinstance(field_instance, DictField): if field_instance.field: return dict((key, get(elem, field_name, field_instance=field_instance.field)) for (key, elem) in field_value.iteritems()) else: return field_value elif callable(field_instance): if isinstance(field_value, list): value = field_value else: if isbound(field_instance): value = field_instance() elif isbound(field_value): value = field_value() else: value = field_instance(obj) if field_name in self._related_resources: return [ self._related_resources[field_name]().serialize_field( o, **kwargs) for o in value ] return value return field_value
def get(obj, field_name, field_instance=None): """ @TODO needs significant cleanup """ has_field_instance = bool(field_instance) field_instance = field_instance or \ self.document._fields.get(field_name, None) or \ getattr(self.document, field_name, None) # Determine the field value if has_field_instance: field_value = obj elif isinstance(obj, dict): return obj[field_name] else: try: field_value = getattr(obj, field_name) except AttributeError: raise UnknownFieldError # If this field is a reference or an embedded document, either # return a DBRef or serialize it using a resource found in # `related_resources`. if isinstance(field_instance, (ReferenceField, GenericReferenceField, EmbeddedDocumentField)): if field_name in self._related_resources: return field_value and \ not isinstance(field_value, DBRef) and \ self._related_resources[field_name]().serialize_field(field_value, **kwargs) else: if isinstance(field_value, DBRef): return field_value return field_value and field_value.to_dbref() # If this field is a list, serialize each item in the list separately. elif isinstance(field_instance, ListField): return [val for val in [get(elem, field_name, field_instance=field_instance.field) for elem in field_value] if val] # If this field is a dict... elif isinstance(field_instance, DictField): # ... serialize each value based on an explicit field type # (e.g. if the schema defines a DictField(IntField), where all # the values in the dict should be ints). if field_instance.field: return { key: get(elem, field_name, field_instance=field_instance.field) for (key, elem) in field_value.items() } # ... or simply return the dict intact, if the field type # wasn't specified else: return field_value # If this field is callable, execute it and return it or serialize # it based on its related resource defined in the # `related_resources` map. elif isinstance(field_instance, collections.Callable): if isinstance(field_value, list): value = field_value else: if isbound(field_instance): value = field_instance() elif isbound(field_value): value = field_value() else: value = field_instance(obj) if field_name in self._related_resources: if isinstance(value, list): return [self._related_resources[field_name]().serialize_field(o, **kwargs) for o in value] elif value is None: return None else: return self._related_resources[field_name]().serialize_field(value, **kwargs) return value return field_value