mirror of
https://github.com/Hopiu/wagtail.git
synced 2026-05-15 02:33:13 +00:00
Moved responsibility of getting fields for request to endpoint
This commit is contained in:
parent
2d691cd6e7
commit
32d0170882
2 changed files with 25 additions and 22 deletions
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Reference in a new issue