Moved responsibility of getting fields for request to endpoint

This commit is contained in:
Karl Hobley 2015-08-03 19:08:24 +01:00
parent 2d691cd6e7
commit 32d0170882
2 changed files with 25 additions and 22 deletions

View file

@ -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
}

View file

@ -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):