From 32d0170882b2c00f2111291c6b320a324188a9be Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Mon, 3 Aug 2015 19:08:24 +0100 Subject: [PATCH] Moved responsibility of getting fields for request to endpoint --- wagtail/contrib/wagtailapi/endpoints.py | 22 +++++++++++++++++++- wagtail/contrib/wagtailapi/serializers.py | 25 ++++------------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/wagtail/contrib/wagtailapi/endpoints.py b/wagtail/contrib/wagtailapi/endpoints.py index a2cd7931b..b9bf96a9a 100644 --- a/wagtail/contrib/wagtailapi/endpoints.py +++ b/wagtail/contrib/wagtailapi/endpoints.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +from collections import OrderedDict + from django.conf.urls import url from django.http import Http404 @@ -90,23 +92,41 @@ class BaseAPIEndpoint(GenericViewSet): The serialization context differs between listing and detail views. """ request = self.request + if self.action == 'listing_view': + model = self.get_queryset().model + + all_fields = self.get_api_fields(model) + all_fields = list(OrderedDict.fromkeys(all_fields)) # Removes any duplicates in case the developer put "title" in api_fields if 'fields' in request.GET: fields = set(request.GET['fields'].split(',')) else: fields = {'title'} + unknown_fields = fields - set(all_fields) + + if unknown_fields: + raise BadRequestError("unknown fields: %s" % ', '.join(sorted(unknown_fields))) + + # Reorder fields so it matches the order of all_fields + fields = [field for field in all_fields if field in fields] + return { 'request': request, 'view': self, 'fields': fields } + model = type(self.get_object()) + + all_fields = self.get_api_fields(model) + all_fields = list(OrderedDict.fromkeys(all_fields)) # Removes any duplicates in case the developer put "title" in api_fields + return { 'request': request, 'view': self, - 'all_fields': True, + 'fields': all_fields, 'show_details': True } diff --git a/wagtail/contrib/wagtailapi/serializers.py b/wagtail/contrib/wagtailapi/serializers.py index 5a7c712f0..1a07bd525 100644 --- a/wagtail/contrib/wagtailapi/serializers.py +++ b/wagtail/contrib/wagtailapi/serializers.py @@ -101,12 +101,10 @@ def get_serializer_class(model_, fields_): class WagtailSerializer(serializers.BaseSerializer): def to_representation(self, instance): - fields = self.context.get('fields', frozenset()) - all_fields = self.context.get('all_fields', False) + fields = self.context.get('fields') return self.serialize_object( instance, fields=fields, - all_fields=all_fields, ) def serialize_object_metadata(self, obj): @@ -122,7 +120,7 @@ class WagtailSerializer(serializers.BaseSerializer): return data - def serialize_object(self, obj, fields=frozenset(), extra_data=(), all_fields=False): + def serialize_object(self, obj, fields, extra_data=()): """ This converts an object into JSON-serialisable dict so it can be used in the API. @@ -139,21 +137,6 @@ class WagtailSerializer(serializers.BaseSerializer): # Add extra data data.extend(extra_data) - # Add other fields - api_fields = self.context['view'].get_api_fields(type(obj)) - api_fields = list(OrderedDict.fromkeys(api_fields)) # Removes any duplicates in case the user put "title" in api_fields - - if all_fields: - fields = api_fields - else: - unknown_fields = fields - set(api_fields) - - if unknown_fields: - raise BadRequestError("unknown fields: %s" % ', '.join(sorted(unknown_fields))) - - # Reorder fields so it matches the order of api_fields - fields = [field for field in api_fields if field in fields] - # Serialize the fields serializer_class = get_serializer_class(type(obj), fields) serializer = serializer_class() @@ -171,7 +154,7 @@ class PageSerializer(WagtailSerializer): return data - def serialize_object(self, page, fields=frozenset(), extra_data=(), all_fields=False): + def serialize_object(self, page, fields, extra_data=()): # Add parent if self.context.get('show_details', False): parent = page.get_parent() @@ -190,7 +173,7 @@ class PageSerializer(WagtailSerializer): ])), ) - return super(PageSerializer, self).serialize_object(page, fields=fields, extra_data=extra_data, all_fields=all_fields) + return super(PageSerializer, self).serialize_object(page, fields, extra_data=extra_data) class DocumentSerializer(WagtailSerializer):