diff options
| author | Tom Christie | 2014-12-03 23:08:42 +0000 | 
|---|---|---|
| committer | Tom Christie | 2014-12-03 23:08:42 +0000 | 
| commit | 9680329cb0648fbf559d6d935e4220d5b4d3b87c (patch) | |
| tree | 45b8e34c802f57d28ded3c355f16ae4ebc0ffba0 /rest_framework | |
| parent | 3a5b3772fefc3c2f2c0899947cbc07bfe6e6b5d2 (diff) | |
| parent | 7f9dc736728baf92a3198a7f90bd302fff240373 (diff) | |
| download | django-rest-framework-9680329cb0648fbf559d6d935e4220d5b4d3b87c.tar.bz2 | |
Merge pull request #2160 from jpadilla/xml
Remove XML support from core
Diffstat (limited to 'rest_framework')
| -rw-r--r-- | rest_framework/compat.py | 7 | ||||
| -rw-r--r-- | rest_framework/parsers.py | 76 | ||||
| -rw-r--r-- | rest_framework/renderers.py | 54 | 
3 files changed, 2 insertions, 135 deletions
| diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 5bd85e74..899dd2b4 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -244,13 +244,6 @@ except ImportError:      yaml = None -# XML is optional -try: -    import defusedxml.ElementTree as etree -except ImportError: -    etree = None - -  # OAuth2 is optional  try:      # Note: The `oauth2` package actually provides oauth1.0a support.  Urg. diff --git a/rest_framework/parsers.py b/rest_framework/parsers.py index ccb82f03..6d0e932b 100644 --- a/rest_framework/parsers.py +++ b/rest_framework/parsers.py @@ -12,12 +12,10 @@ from django.http import QueryDict  from django.http.multipartparser import MultiPartParser as DjangoMultiPartParser  from django.http.multipartparser import MultiPartParserError, parse_header, ChunkIter  from django.utils import six -from rest_framework.compat import etree, yaml, force_text, urlparse +from rest_framework.compat import yaml, force_text, urlparse  from rest_framework.exceptions import ParseError  from rest_framework import renderers  import json -import datetime -import decimal  class DataAndFiles(object): @@ -136,78 +134,6 @@ class MultiPartParser(BaseParser):              raise ParseError('Multipart form parse error - %s' % six.text_type(exc)) -class XMLParser(BaseParser): -    """ -    XML parser. -    """ - -    media_type = 'application/xml' - -    def parse(self, stream, media_type=None, parser_context=None): -        """ -        Parses the incoming bytestream as XML and returns the resulting data. -        """ -        assert etree, 'XMLParser requires defusedxml to be installed' - -        parser_context = parser_context or {} -        encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) -        parser = etree.DefusedXMLParser(encoding=encoding) -        try: -            tree = etree.parse(stream, parser=parser, forbid_dtd=True) -        except (etree.ParseError, ValueError) as exc: -            raise ParseError('XML parse error - %s' % six.text_type(exc)) -        data = self._xml_convert(tree.getroot()) - -        return data - -    def _xml_convert(self, element): -        """ -        convert the xml `element` into the corresponding python object -        """ - -        children = list(element) - -        if len(children) == 0: -            return self._type_convert(element.text) -        else: -            # if the fist child tag is list-item means all children are list-item -            if children[0].tag == "list-item": -                data = [] -                for child in children: -                    data.append(self._xml_convert(child)) -            else: -                data = {} -                for child in children: -                    data[child.tag] = self._xml_convert(child) - -            return data - -    def _type_convert(self, value): -        """ -        Converts the value returned by the XMl parse into the equivalent -        Python type -        """ -        if value is None: -            return value - -        try: -            return datetime.datetime.strptime(value, '%Y-%m-%d %H:%M:%S') -        except ValueError: -            pass - -        try: -            return int(value) -        except ValueError: -            pass - -        try: -            return decimal.Decimal(value) -        except decimal.InvalidOperation: -            pass - -        return value - -  class FileUploadParser(BaseParser):      """      Parser for file upload data. diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index e87d16d0..dd49ae82 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -16,11 +16,8 @@ from django.http.multipartparser import parse_header  from django.template import Context, RequestContext, loader, Template  from django.test.client import encode_multipart  from django.utils import six -from django.utils.xmlutils import SimplerXMLGenerator  from rest_framework import exceptions, serializers, status, VERSION -from rest_framework.compat import ( -    SHORT_SEPARATORS, LONG_SEPARATORS, StringIO, smart_text, yaml -) +from rest_framework.compat import SHORT_SEPARATORS, LONG_SEPARATORS, yaml  from rest_framework.exceptions import ParseError  from rest_framework.settings import api_settings  from rest_framework.request import is_form_media_type, override_method @@ -140,55 +137,6 @@ class JSONPRenderer(JSONRenderer):          return callback.encode(self.charset) + b'(' + json + b');' -class XMLRenderer(BaseRenderer): -    """ -    Renderer which serializes to XML. -    """ - -    media_type = 'application/xml' -    format = 'xml' -    charset = 'utf-8' - -    def render(self, data, accepted_media_type=None, renderer_context=None): -        """ -        Renders `data` into serialized XML. -        """ -        if data is None: -            return '' - -        stream = StringIO() - -        xml = SimplerXMLGenerator(stream, self.charset) -        xml.startDocument() -        xml.startElement("root", {}) - -        self._to_xml(xml, data) - -        xml.endElement("root") -        xml.endDocument() -        return stream.getvalue() - -    def _to_xml(self, xml, data): -        if isinstance(data, (list, tuple)): -            for item in data: -                xml.startElement("list-item", {}) -                self._to_xml(xml, item) -                xml.endElement("list-item") - -        elif isinstance(data, dict): -            for key, value in six.iteritems(data): -                xml.startElement(key, {}) -                self._to_xml(xml, value) -                xml.endElement(key) - -        elif data is None: -            # Don't output any value -            pass - -        else: -            xml.characters(smart_text(data)) - -  class YAMLRenderer(BaseRenderer):      """      Renderer which serializes to YAML. | 
