Пример #1
0
 def test_active_model_json_renderer(self):
     parents = [ParentModel.objects.create() for x in range(3)]
     children = [
         ChildModel.objects.create(parent=parents[1],
                                   old_parent=parents[2]),
         ChildModel.objects.create(parent=parents[1],
                                   old_parent=parents[2]),
         ChildModel.objects.create(parent=parents[0], old_parent=parents[1])
     ]
     obj = ChildSideloadSerializer(children, many=True).data
     expected = {
         'child_models': [
             OrderedDict([('id', c.id), ('parent_id', c.parent.id),
                          ('old_parent_id', c.old_parent.id)])
             for c in children
         ],
         'parent_models': [
             OrderedDict([('id', p.id), ('text', p.text),
                          ('child_ids', p.child_ids),
                          ('old_child_ids', p.old_child_ids)])
             for p in parents
         ]
     }
     result = convert_to_active_model_json(obj)
     assert result == expected
Пример #2
0
    def to_internal_value(self, data):
        """
        Dict of native values <- Dict of primitive datatypes.
        """
        ret = OrderedDict()
        errors = OrderedDict()
        fields = [
            field for field in self.fields.values()
            if (not field.read_only) or (field.default is not empty)
        ]

        for field in fields:
            validate_method = getattr(self, 'validate_' + field.field_name, None)
            primitive_value = field.get_value(data)
            try:
                validated_value = field.run_validation(primitive_value)
                if validate_method is not None:
                    validated_value = validate_method(validated_value)
            except ValidationError as exc:
                errors[field.field_name] = exc.detail
            except SkipField:
                pass
            else:
                set_value(ret, field.source_attrs, validated_value)

        if errors:
            raise ValidationError(errors)

        return ret
    def get_initial(self):
        if self._initial_data is not None:
            return OrderedDict([
                (field_name, field.get_value(self._initial_data))
                for field_name, field in self.fields.items()
                if field.get_value(self._initial_data) is not empty
                and not field.read_only
            ])

        return OrderedDict([(field.field_name, field.get_initial())
                            for field in self.fields.values()
                            if not field.read_only])
def _merge_fields_and_pk(pk, fields):
    fields_and_pk = OrderedDict()
    fields_and_pk['pk'] = pk
    fields_and_pk[pk.name] = pk
    fields_and_pk.update(fields)

    return fields_and_pk
Пример #5
0
    def get_field_info(self, field):
        """
        Given an instance of a serializer field, return a dictionary
        of metadata about it.
        """
        field_info = OrderedDict()
        field_info['type'] = self.label_lookup[field]
        field_info['required'] = getattr(field, 'required', False)

        attrs = [
            'read_only', 'label', 'help_text', 'min_length', 'max_length',
            'min_value', 'max_value'
        ]

        for attr in attrs:
            value = getattr(field, attr, None)
            if value is not None and value != '':
                field_info[attr] = force_text(value, strings_only=True)

        if not field_info.get('read_only') and hasattr(field, 'choices'):
            field_info['choices'] = [{
                'value':
                choice_value,
                'display_name':
                force_text(choice_name, strings_only=True)
            } for choice_value, choice_name in field.choices.items()]

        return field_info
Пример #6
0
    def get_meta(self):
        pagination = {
            'pages': self.page.paginator.num_pages,
            'first': None,
            'previous': None,
            'next': None,
            'last': None,
            'before': 0,
            'more': 0,
        }

        if self.page.has_previous():
            pagination['first'] = 1
            if self.page.previous_page_number() > 1:
                pagination['previous'] = self.page.previous_page_number()

        if self.page.has_next():
            pagination['last'] = self.page.paginator.num_pages
            if self.page.next_page_number() < self.page.paginator.num_pages:
                pagination['next'] = self.page.next_page_number()

        if self.page.start_index():
            pagination['before'] = self.page.start_index() - 1
        pagination['more'] = self.page.paginator.count - self.page.end_index()

        return OrderedDict([('count', self.page.paginator.count),
                            ('pages', pagination['pages']),
                            ('first', pagination['first']),
                            ('previous', pagination['previous']),
                            ('next', pagination['next']),
                            ('last', pagination['last']),
                            ('before', pagination['before']),
                            ('more', pagination['more'])])
Пример #7
0
def format_keys(obj, format_type=None):
    """
    Takes either a dict or list and returns it with camelized keys only if
    REST_EMBER_FORMAT_KEYS is set.

    :format_type: Either 'camelize' or 'underscore'
    """
    if (getattr(settings, 'REST_EMBER_FORMAT_KEYS', False)
            and format_type in ('camelize', 'underscore')):

        if isinstance(obj, dict):
            formatted = OrderedDict()
            for key, value in obj.items():
                if format_type == 'camelize':
                    formatted[inflection.camelize(key, False)]\
                        = format_keys(value, format_type)
                elif format_type == 'underscore':
                    formatted[inflection.underscore(key)]\
                        = format_keys(value, format_type)
            return formatted
        if isinstance(obj, list):
            return [format_keys(item, format_type) for item in obj]
        else:
            return obj
    else:
        return obj
Пример #8
0
def _get_forward_relationships(opts):
    """
    Returns an `OrderedDict` of field names to `RelationInfo`.
    """
    forward_relations = OrderedDict()
    for field in [field for field in opts.fields if field.serialize and field.rel]:
        forward_relations[field.name] = RelationInfo(
            model_field=field,
            related_model=_resolve_model(field.rel.to),
            to_many=False,
            has_through_model=False
        )

    # Deal with forward many-to-many relationships.
    for field in [field for field in opts.many_to_many if field.serialize]:
        forward_relations[field.name] = RelationInfo(
            model_field=field,
            related_model=_resolve_model(field.rel.to),
            to_many=True,
            has_through_model=(
                not field.rel.through._meta.auto_created
            )
        )

    return forward_relations
Пример #9
0
    def get_api_root_view(self):
        """
        Return a view to use as the API root.
        """
        api_root_dict = OrderedDict()
        list_name = self.routes[0].name
        for prefix, viewset, basename in self.registry:
            api_root_dict[prefix] = list_name.format(basename=basename)

        class APIRoot(views.APIView):
            _ignore_model_permissions = True

            def get(self, request, *args, **kwargs):
                ret = OrderedDict()
                namespace = get_resolver_match(request).namespace
                for key, url_name in api_root_dict.items():
                    if namespace:
                        url_name = namespace + ':' + url_name
                    try:
                        ret[key] = reverse(url_name,
                                           args=args,
                                           kwargs=kwargs,
                                           request=request,
                                           format=kwargs.get('format', None))
                    except NoReverseMatch:
                        # Don't bail out if eg. no list routes exist, only detail routes.
                        continue

                return Response(ret)

        return APIRoot.as_view()
Пример #10
0
 def test_compact(self):
     renderer = JSONRenderer()
     data = OrderedDict([('a', 1), ('b', 2)])
     context = {'indent': 4}
     assert (renderer.render(
         data,
         renderer_context=context) == b'{\n    "a": 1,\n    "b": 2\n}')
Пример #11
0
    def to_representation(self, obj):
        answer = {}

        self.tryKeysOnDict(answer, 'guid', obj, ['guid'])
        self.tryKeysOnDict(answer, 'title', obj, ['title'])
        self.tryKeysOnDict(answer, 'description', obj, ['description'])
        self.tryKeysOnDict(answer, 'user', obj, ['author', 'owner_nick'])
        self.tryKeysOnDict(answer, 'tags', obj, ['tags'])
        self.tryKeysOnDict(answer, 'created_at', obj, ['created_at'])
        self.tryKeysOnDict(answer, 'endpoint', obj, ['endpoint', 'end_point'])
        self.tryKeysOnDict(answer, 'link', obj, ['permalink'])
        self.tryKeysOnDict(answer, 'category_name', obj, ['category_name'])
        self.tryKeysOnDict(answer, 'parameters', obj, ['parameters'])
        self.tryKeysOnDict(answer, 'result', obj, ['result'])
        self.tryKeysOnDict(answer, 'timestamp', obj, ['timestamp'])
        self.tryKeysOnDict(answer, 'category_id', obj, ['category', 'category_id'])

        try:
            if 'format' in obj and obj['format'].startswith('application/json'):
                answer['result'] = json.loads(answer['result']) 
        except AttributeError:
            # TODO: ver esto, plis
            pass

        if answer['tags']:
            answer['tags'] = map(lambda x: x['tag__name'] if type(x) == dict else x, answer['tags'])

        if answer['link']:
            domain = self.context['request'].auth['microsite_domain']
            answer['link'] = domain + answer['link']
        return OrderedDict(answer)
Пример #12
0
def _get_reverse_relationships(opts):
    """
    Returns an `OrderedDict` of field names to `RelationInfo`.
    """
    reverse_relations = OrderedDict()
    for relation in opts.get_all_related_objects():
        accessor_name = relation.get_accessor_name()
        reverse_relations[accessor_name] = RelationInfo(
            model_field=None,
            related=relation.model,
            to_many=relation.field.rel.multiple,
            has_through_model=False
        )

    # Deal with reverse many-to-many relationships.
    for relation in opts.get_all_related_many_to_many_objects():
        accessor_name = relation.get_accessor_name()
        reverse_relations[accessor_name] = RelationInfo(
            model_field=None,
            related=relation.model,
            to_many=True,
            has_through_model=(
                (getattr(relation.field.rel, 'through', None) is not None)
                and not relation.field.rel.through._meta.auto_created
            )
        )

    return reverse_relations
Пример #13
0
def _get_reverse_relationships(opts):
    """
    Returns an `OrderedDict` of field names to `RelationInfo`.
    """
    # Note that we have a hack here to handle internal API differences for
    # this internal API across Django 1.7 -> Django 1.8.
    # See: https://code.djangoproject.com/ticket/24208

    reverse_relations = OrderedDict()
    for relation in opts.get_all_related_objects():
        accessor_name = relation.get_accessor_name()
        related = getattr(relation, 'related_model', relation.model)
        reverse_relations[accessor_name] = RelationInfo(
            model_field=None,
            related_model=related,
            to_many=relation.field.rel.multiple,
            has_through_model=False)

    # Deal with reverse many-to-many relationships.
    for relation in opts.get_all_related_many_to_many_objects():
        accessor_name = relation.get_accessor_name()
        related = getattr(relation, 'related_model', relation.model)
        reverse_relations[accessor_name] = RelationInfo(
            model_field=None,
            related_model=related,
            to_many=True,
            has_through_model=(
                (getattr(relation.field.rel, 'through', None) is not None)
                and not relation.field.rel.through._meta.auto_created))

    return reverse_relations
Пример #14
0
 def get_paginated_response(self, data):
     return Response(OrderedDict([
         ('count', self.count),
         ('next', self.get_next_link()),
         ('previous', self.get_previous_link()),
         ('results', data)
     ]))
Пример #15
0
 def get_paginated_response(self, data):
     print "Entra en paginado"
     return Response(OrderedDict([
         ('total', self.count),
         ('next', self.get_next_link()),
         ('previous', self.get_previous_link()),
         ('items', data )
     ]))
    def test_default_display_value(self):
        class TestSerializer(serializers.ModelSerializer):
            class Meta:
                model = DisplayValueModel

        serializer = TestSerializer()
        expected = OrderedDict([('1', 'Red Color'), ('2', 'Yellow Color'), ('3', 'Green Color')])
        self.assertEqual(serializer.fields['color'].choices, expected)
Пример #17
0
 def get_paginated_response(self, data):
     return Response(
         OrderedDict([('count', self.page.paginator.count),
                      ('next', self.get_next_link()),
                      ('previous', self.get_previous_link()),
                      ('facets', self.facets),
                      ('suggestions', self.suggestions),
                      ('results', data)]))
Пример #18
0
def _get_fields(opts):
    fields = OrderedDict()
    for field in [
            field for field in opts.fields if field.serialize and not field.rel
    ]:
        fields[field.name] = field

    return fields
Пример #19
0
    def choices(self):
        queryset = self.get_queryset()
        if queryset is None:
            # Ensure that field.choices returns something sensible
            # even when accessed with a read-only field.
            return {}

        return OrderedDict([(six.text_type(self.to_representation(item)),
                             six.text_type(item)) for item in queryset])
Пример #20
0
 def get_paginated_response(self, data):
     return Response(OrderedDict([
         ('count', self.page.paginator.count),
         ('next', self.get_next_link()),
         ('previous', self.get_previous_link()),
         ('current_page', self.page.number),
         ('total_pages', self.page.paginator.num_pages),
         ('results', data)
     ]))
Пример #21
0
 def get_paginated_response(self, data):
     return OrderedDict([('start_index', self.page.start_index()),
                         ('end_index', self.page.end_index()),
                         ('num_pages', self.page.paginator.num_pages),
                         ('current_page', self.page.number),
                         ('count', self.page.paginator.count),
                         ('next', self.get_next_link()),
                         ('previous', self.get_previous_link()),
                         ('results', data)])
Пример #22
0
    def get_fields(self):
        """
        Get the required fields for serializing the result.
        """

        fields = getattr(self.Meta, "fields", [])
        exclude = getattr(self.Meta, "exclude", [])

        if fields and exclude:
            raise ImproperlyConfigured(
                "Cannot set both `fields` and `exclude`.")

        ignore_fields = getattr(self.Meta, "ignore_fields", [])
        indices = getattr(self.Meta, "index_classes")

        declared_fields = copy.deepcopy(self._declared_fields)
        prefix_field_names = len(indices) > 1
        field_mapping = OrderedDict()

        # overlapping fields on multiple indices is supported by internally prefixing the field
        # names with the index class to which they belong or, optionally, a user-provided alias
        # for the index.
        for index_cls in self.Meta.index_classes:
            prefix = ""
            if prefix_field_names:
                prefix = "_%s__" % self._get_index_class_name(index_cls)
            for field_name, field_type in six.iteritems(index_cls.fields):
                orig_name = field_name
                field_name = "%s%s" % (prefix, field_name)

                # This has become a little more complex, but provides convenient flexibility for users
                if not exclude:
                    if orig_name not in fields and field_name not in fields:
                        continue
                elif orig_name in exclude or field_name in exclude or orig_name in ignore_fields or field_name in ignore_fields:
                    continue

                # Look up the field attributes on the current index model,
                # in order to correctly instantiate the serializer field.
                model = index_cls().get_model()
                kwargs = self._get_default_field_kwargs(model, field_type)
                kwargs['prefix_field_names'] = prefix_field_names
                field_mapping[field_name] = self._field_mapping[field_type](
                    **kwargs)

        # Add any explicitly declared fields. They *will* override any index fields
        # in case of naming collision!.
        if declared_fields:
            for field_name in declared_fields:
                if field_name in field_mapping:
                    warnings.warn(
                        "Field '{field}' already exists in the field list. This *will* "
                        "overwrite existing field '{field}'".format(
                            field=field_name))
                field_mapping[field_name] = declared_fields[field_name]
        return field_mapping
Пример #23
0
 def determine_metadata(self, request, view):
     metadata = OrderedDict()
     metadata['name'] = view.get_view_name()
     metadata['description'] = view.get_view_description()
     metadata['renders'] = [renderer.media_type for renderer in view.renderer_classes]
     metadata['parses'] = [parser.media_type for parser in view.parser_classes]
     if hasattr(view, 'get_serializer'):
         actions = self.determine_actions(request, view)
         if actions:
             metadata['actions'] = actions
     return metadata
Пример #24
0
    def post(self, request, *args, **kwargs):
        lng, lat = request.data.get('longitude'), request.data.get('latitude')

        err = self._validate_lat_long(lat, lng)
        if err:
            return views.Response(err, status=400)

        try:
            point = Point(x=lng, y=lat)
        except TypeError:  # pragma: no cover
            # this is one wiered edgecase
            return views.Response(
                {
                    rest_settings.api_settings.NON_FIELD_ERRORS_KEY: [
                        "Invalid value given for longitude or latitude",
                    ],
                },
                status=400)

        try:
            data = WardBoundary.objects.values(
                'area',
                'area__name',
                'area__code',
                'area__constituency',
                'area__constituency__name',
                'area__constituency__code',
                'area__constituency__county',
                'area__constituency__county__name',
                'area__constituency__county__code',
            ).get(mpoly__contains=point)

            return views.Response(
                OrderedDict([
                    ('ward', data['area']),
                    ('ward_name', data['area__name']),
                    ('ward_code', data['area__code']),
                    ('constituency', data['area__constituency']),
                    ('constituency_name', data['area__constituency__name']),
                    ('constituency_code', data['area__constituency__code']),
                    ('county', data['area__constituency__county']),
                    ('county_name', data['area__constituency__county__name']),
                    ('county_code', data['area__constituency__county__code']),
                ]))
        except WardBoundary.DoesNotExist:
            return views.Response(
                {
                    rest_settings.api_settings.NON_FIELD_ERRORS_KEY: [
                        "No ward contains the coordinates ({}, {})".format(
                            lng, lat)
                    ]
                },
                status=400)
Пример #25
0
    def __init__(self, choices, **kwargs):
        # Allow either single or paired choices style:
        # choices = [1, 2, 3]
        # choices = [(1, 'First'), (2, 'Second'), (3, 'Third')]
        pairs = [
            isinstance(item, (list, tuple)) and len(item) == 2
            for item in choices
        ]
        if all(pairs):
            self.choices = OrderedDict([(key, display_value)
                                        for key, display_value in choices])
        else:
            self.choices = OrderedDict([(item, item) for item in choices])

        # Map the string representation of choices to the underlying value.
        # Allows us to deal with eg. integer choices while supporting either
        # integer or string input, but still get the correct datatype out.
        self.choice_strings_to_values = dict([(six.text_type(key), key)
                                              for key in self.choices.keys()])

        super(ChoiceField, self).__init__(**kwargs)
Пример #26
0
            def get(self, request, *args, **kwargs):
                ret = OrderedDict()
                for key, url_name in api_root_dict.items():
                    try:
                        ret[key] = reverse(url_name,
                                           request=request,
                                           format=kwargs.get('format', None))
                    except NoReverseMatch:
                        # Don't bail out if eg. no list routes exist, only detail routes.
                        continue

                return Response(ret)
Пример #27
0
 def get_serializer_info(self, serializer):
     """
     Given an instance of a serializer, return a dictionary of metadata
     about its fields.
     """
     if hasattr(serializer, 'child'):
         # If this is a `ListSerializer` then we want to examine the
         # underlying child serializer instance instead.
         serializer = serializer.child
     return OrderedDict([(field_name, self.get_field_info(field))
                         for field_name, field in serializer.fields.items()
                         ])
Пример #28
0
 def choices(self):
     queryset = self.child_relation.queryset
     iterable = queryset.all() if (hasattr(queryset, 'all')) else queryset
     items_and_representations = [
         (item, self.child_relation.to_representation(item))
         for item in iterable
     ]
     return OrderedDict([
         (six.text_type(item_representation),
          six.text_type(item) + ' - ' + six.text_type(item_representation))
         for item, item_representation in items_and_representations
     ])
Пример #29
0
    def to_representation(self, obj):
        answer = super(ResourceSerializer, self).to_representation(obj)
        for key, value in self.get_mapping_dict().items():
            if answer['resource_type'] in value:
                answer[key] = obj[value[answer['resource_type']]]
            else:
                answer[key] = None

        answer['status'] = self.get_status_name(obj['status'])
        answer['type'] = self.get_type(obj)
        answer['impl_details'] = self.get_impl_details(obj)

        return OrderedDict(answer)
Пример #30
0
 def get_paginated_response(self, data):
     response = Response(
         OrderedDict([
             ('count', len(data)),
             ('time-to-update-participant-number',
              Settings.manager.first().update_time_participant_number),
             ('next', None), ('previous', None), ('results', data)
         ]))
     if not self.show_all_elements():
         response.data.update(
             super(StandardResultsSetPagination,
                   self).get_paginated_response(data).data)
     return response