Simplifying raw data renderering support

This commit is contained in:
Tom Christie 2013-08-28 21:52:56 +01:00
parent 8d590ebfde
commit 18007d6846
4 changed files with 12 additions and 12 deletions

View File

@ -12,7 +12,7 @@ from django.http.multipartparser import MultiPartParser as DjangoMultiPartParser
from django.http.multipartparser import MultiPartParserError, parse_header, ChunkIter from django.http.multipartparser import MultiPartParserError, parse_header, ChunkIter
from rest_framework.compat import etree, six, yaml from rest_framework.compat import etree, six, yaml
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from rest_framework.renderers import UnicodeJSONRenderer from rest_framework import renderers
import json import json
import datetime import datetime
import decimal import decimal
@ -32,8 +32,6 @@ class BaseParser(object):
media_type = None media_type = None
supports_html_forms = False
def parse(self, stream, media_type=None, parser_context=None): def parse(self, stream, media_type=None, parser_context=None):
""" """
Given a stream to read from, return the parsed representation. Given a stream to read from, return the parsed representation.
@ -49,7 +47,7 @@ class JSONParser(BaseParser):
""" """
media_type = 'application/json' media_type = 'application/json'
renderer_class = UnicodeJSONRenderer renderer_class = renderers.UnicodeJSONRenderer
def parse(self, stream, media_type=None, parser_context=None): def parse(self, stream, media_type=None, parser_context=None):
""" """
@ -94,7 +92,6 @@ class FormParser(BaseParser):
""" """
media_type = 'application/x-www-form-urlencoded' media_type = 'application/x-www-form-urlencoded'
supports_html_forms = True
def parse(self, stream, media_type=None, parser_context=None): def parse(self, stream, media_type=None, parser_context=None):
""" """
@ -113,7 +110,6 @@ class MultiPartParser(BaseParser):
""" """
media_type = 'multipart/form-data' media_type = 'multipart/form-data'
supports_html_forms = True
def parse(self, stream, media_type=None, parser_context=None): def parse(self, stream, media_type=None, parser_context=None):
""" """
@ -134,7 +130,7 @@ class MultiPartParser(BaseParser):
data, files = parser.parse() data, files = parser.parse()
return DataAndFiles(data, files) return DataAndFiles(data, files)
except MultiPartParserError as exc: except MultiPartParserError as exc:
raise ParseError('Multipart form parse error - %s' % six.u(exc)) raise ParseError('Multipart form parse error - %s' % six.u(exc.strerror))
class XMLParser(BaseParser): class XMLParser(BaseParser):

View File

@ -21,7 +21,7 @@ from rest_framework.compat import six
from rest_framework.compat import smart_text from rest_framework.compat import smart_text
from rest_framework.compat import yaml from rest_framework.compat import yaml
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
from rest_framework.request import clone_request from rest_framework.request import clone_request, is_form_media_type
from rest_framework.utils import encoders from rest_framework.utils import encoders
from rest_framework.utils.breadcrumbs import get_breadcrumbs from rest_framework.utils.breadcrumbs import get_breadcrumbs
from rest_framework import exceptions, status, VERSION from rest_framework import exceptions, status, VERSION
@ -482,7 +482,7 @@ class BrowsableAPIRenderer(BaseRenderer):
if method in ('DELETE', 'OPTIONS'): if method in ('DELETE', 'OPTIONS'):
return True # Don't actually need to return a form return True # Don't actually need to return a form
if not getattr(view, 'get_serializer', None) or not any(parser.supports_html_forms for parser in view.parser_classes): if not getattr(view, 'get_serializer', None) or not any(is_form_media_type(parser.media_type) for parser in view.parser_classes):
return return
serializer = view.get_serializer(instance=obj) serializer = view.get_serializer(instance=obj)
@ -565,11 +565,16 @@ class BrowsableAPIRenderer(BaseRenderer):
obj = getattr(view, 'object', None) obj = getattr(view, 'object', None)
if getattr(view, 'get_serializer', None): if getattr(view, 'get_serializer', None):
serializer = view.get_serializer(instance=obj) serializer = view.get_serializer(instance=obj)
for field_name, field in serializer.fields.items():
if field.read_only:
del serializer.fields[field_name]
else: else:
serializer = None serializer = None
parsers = [] parsers = []
for parser_class in view.parser_classes: for parser_class in view.parser_classes:
if is_form_media_type(parser_class.media_type):
continue
content = None content = None
renderer_class = getattr(parser_class, 'renderer_class', None) renderer_class = getattr(parser_class, 'renderer_class', None)
if renderer_class and serializer: if renderer_class and serializer:
@ -650,3 +655,4 @@ class MultiPartRenderer(BaseRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None): def render(self, data, accepted_media_type=None, renderer_context=None):
return encode_multipart(self.BOUNDARY, data) return encode_multipart(self.BOUNDARY, data)

View File

@ -304,8 +304,6 @@ class BaseSerializer(WritableField):
ret.empty = obj is None ret.empty = obj is None
for field_name, field in self.fields.items(): for field_name, field in self.fields.items():
if obj is None and field.read_only:
continue
field.initialize(parent=self, field_name=field_name) field.initialize(parent=self, field_name=field_name)
key = self.get_field_key(field_name) key = self.get_field_key(field_name)
value = field.field_to_native(obj, field_name) value = field.field_to_native(obj, field_name)

View File

@ -158,7 +158,7 @@ class BasicTests(TestCase):
'email': '', 'email': '',
'content': '', 'content': '',
'created': None, 'created': None,
#'sub_comment': '' 'sub_comment': ''
} }
self.assertEqual(serializer.data, expected) self.assertEqual(serializer.data, expected)