Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

No clear error message on form with bad character in name column #1999

Open
MappingKat opened this issue Feb 21, 2018 · 1 comment
Open

No clear error message on form with bad character in name column #1999

MappingKat opened this issue Feb 21, 2018 · 1 comment

Comments

@MappingKat
Copy link

  1. Upload form. Have success.
    bad_character_form.xlsx

  2. open up ODK and try to download form. Get 500 error.

@MappingKat MappingKat changed the title No clear error message with form with character in name column No clear error message on form with bad character in name column Feb 21, 2018
@alukach
Copy link
Contributor

alukach commented Feb 21, 2018

Error from the server:

2018-02-21 17:00:07,346 ERROR Internal Server Error: /collect/formList/dxgjn97c5cwtjzfrx77qyqhu/
Traceback (most recent call last):
  File "/opt/cadasta/env/lib/python3.5/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/opt/cadasta/env/lib/python3.5/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/opt/cadasta/env/lib/python3.5/site-packages/django/core/handlers/base.py", line 217, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/opt/cadasta/env/lib/python3.5/site-packages/django/core/handlers/base.py", line 215, in _get_response
    response = response.render()
  File "/opt/cadasta/env/lib/python3.5/site-packages/django/template/response.py", line 107, in render
    self.content = self.rendered_content
  File "/opt/cadasta/env/lib/python3.5/site-packages/rest_framework/response.py", line 72, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "./xforms/renderers.py", line 202, in render
    data.get('version'))
  File "./xforms/renderers.py", line 146, in insert_version_attribute
    root = etree.fromstring(xform)
  File "src/lxml/lxml.etree.pyx", line 3213, in lxml.etree.fromstring (src/lxml/lxml.etree.c:82934)
  File "src/lxml/parser.pxi", line 1819, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:124533)
  File "src/lxml/parser.pxi", line 1700, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:122964)
  File "src/lxml/parser.pxi", line 1040, in lxml.etree._BaseParser._parseUnicodeDoc (src/lxml/lxml.etree.c:116705)
  File "src/lxml/parser.pxi", line 573, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:110510)
  File "src/lxml/parser.pxi", line 683, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:112276)
  File "src/lxml/parser.pxi", line 613, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:111124)
  File "<string>", line None
lxml.etree.XMLSyntaxError: Failed to parse QName 'sda_date:', line 1, column 1038

The error occurs in the renderer when we attempt to generate an XML object from a string:

def insert_version_attribute(self, xform, root_node, version):
ns = {'xf': 'http://www.w3.org/2002/xforms'}
root = etree.fromstring(xform)

This is a bit strange because it seems that we are constructing that xml string ourselves:

json = self.transform_to_xform_json(data)
survey = create_survey_element_from_dict(json)
xml = survey.xml()
fix_languages(xml)
xml = xml.toxml()
xml = self.insert_version_attribute(xml,

This is called by the XFormDownloadView view:

class XFormDownloadView(APIPermissionRequiredMixin, generics.RetrieveAPIView):
authentication_classes = (BasicAuthentication,)
permission_classes = (IsAuthenticated,)
renderer_classes = (XFormRenderer,)
serializer_class = QuestionnaireSerializer
permission_required = 'questionnaire.view'
def get_perms_objects(self):
return [self.get_object().project]
def get_object(self):
if not hasattr(self, '_object'):
self._object = get_object_or_404(
Questionnaire, id=self.kwargs['questionnaire'])
return self._object

This is likely far too late to be catching errors. This is a problem with our validation within the serializer that accepts an uploaded Questionnaire. Ideally, we should be validating the Questionnaire for its capabilities to be returned with this renderer at time of upload.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants