Improved the error reporting for invalid xml file submissions.

- Legacy-Id: 9916
This commit is contained in:
Henrik Levkowetz 2015-07-30 11:44:54 +00:00
parent cfb7dc3dc8
commit cdb0d24aed

View file

@ -136,7 +136,8 @@ class SubmissionUploadForm(forms.Form):
if self.cleaned_data.get('xml'):
#if not self.cleaned_data.get('txt'):
xml_file = self.cleaned_data.get('xml')
tfh, tfn = tempfile.mkstemp(suffix='.xml')
name, ext = os.path.splitext(os.path.basename(xml_file.name))
tfh, tfn = tempfile.mkstemp(prefix=name+'-', suffix='.xml')
try:
# We need to write the xml file to disk in order to hand it
# over to the xml parser. XXX FIXME: investigate updating
@ -149,8 +150,21 @@ class SubmissionUploadForm(forms.Form):
parser = xml2rfc.XmlRfcParser(tfn, quiet=True)
self.xmltree = parser.parse()
ok, errors = self.xmltree.validate()
debug.type('errors')
if not ok:
raise forms.ValidationError(errors)
# Each error has properties:
#
# message: the message text
# domain: the domain ID (see lxml.etree.ErrorDomains)
# type: the message type ID (see lxml.etree.ErrorTypes)
# level: the log level ID (see lxml.etree.ErrorLevels)
# line: the line at which the message originated (if applicable)
# column: the character column at which the message originated (if applicable)
# filename: the name of the file in which the message originated (if applicable)
raise forms.ValidationError(
[ forms.ValidationError("One or more XML validation errors occurred when processing the XML file:") ] +
[ forms.ValidationError("%s: Line %s: %s" % (xml_file.name, e.line, e.message), code="%s"%e.type) for e in errors ]
)
self.xmlroot = self.xmltree.getroot()
draftname = self.xmlroot.attrib.get('docName')
revmatch = re.search("-[0-9][0-9]$", draftname)
@ -174,8 +188,10 @@ class SubmissionUploadForm(forms.Form):
self.author_list.append(author_dict)
line = "%(full_name)s <%(email)s>" % author_dict
self.authors.append(line)
except forms.ValidationError:
raise
except Exception as e:
raise forms.ValidationError("Exception: %s" % e)
raise forms.ValidationError("Exception when trying to process the XML file: %s" % e)
finally:
os.close(tfh)
os.unlink(tfn)