Exemplo n.º 1
0
        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
Exemplo n.º 2
0
        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
Exemplo n.º 3
0
        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
Exemplo n.º 4
0
        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
Exemplo n.º 5
0
        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
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
        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
Exemplo n.º 8
0
        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