diff --git a/beat/web/common/utils.py b/beat/web/common/utils.py index a2c5886e3123c01d0eb73e0d3d7e8e8531e85245..98ebfb76f575e5af491fd33ee2428934808ba769 100644 --- a/beat/web/common/utils.py +++ b/beat/web/common/utils.py @@ -32,21 +32,19 @@ from django.core.exceptions import ValidationError from django.utils.encoding import force_text from django.utils import six +from docutils import utils +from docutils.nodes import Element +from docutils.core import Publisher + from ..ui.templatetags.markup import restructuredtext + def validate_restructuredtext(value): """Validates a piece of restructuredtext for strict conformance""" - try: - from docutils import utils - from docutils.nodes import Element - from docutils.core import Publisher - except ImportError: - raise forms.ValidationError("Error in 'reStructuredText' validator: The Python docutils package isn't installed.") - # Generate a new parser (copying `rst2html.py` flow) pub = Publisher(None, None, None, settings=None) - pub.set_components('standalone', 'restructuredtext', 'pseudoxml') + pub.set_components("standalone", "restructuredtext", "pseudoxml") # Configure publisher settings = pub.get_settings(halt_level=5) @@ -63,12 +61,13 @@ def validate_restructuredtext(value): # Collect errors via an observer errors = [] + def error_collector(data): # Mutate the data since it was just generated - data.line = data['line'] - data.source = data['source'] - data.level = data['level'] - data.type = data['type'] + data.line = data["line"] + data.source = data["source"] + data.level = data["level"] + data.type = data["type"] data.message = Element.astext(data.children[0]) data.full_message = Element.astext(data) @@ -82,8 +81,8 @@ def validate_restructuredtext(value): # Apply transforms (and more collect errors) document.transformer.populate_from_components( - (pub.source, pub.reader, pub.reader.parser, pub.writer, - pub.destination)) + (pub.source, pub.reader, pub.reader.parser, pub.writer, pub.destination) + ) transformer = document.transformer while transformer.transforms: if not transformer.sorted: @@ -99,25 +98,33 @@ def validate_restructuredtext(value): # errors should be ready if errors: validation_list = [] - msg = 'Line %(line)d (severity %(level)d): %(message)s' + msg = "Line %(line)d (severity %(level)d): %(message)s" for error in errors: - #from docutils.parsers.rst module: - #debug(0), info(1), warning(2), error(3), severe(4) + # from docutils.parsers.rst module: + # debug(0), info(1), warning(2), error(3), severe(4) if error.level > 1: - validation_list.append(ValidationError( - msg, code=error.type.lower(), - params=dict(line=error.line, level=error.level, message=error.message))) + validation_list.append( + ValidationError( + msg, + code=error.type.lower(), + params=dict( + line=error.line, level=error.level, message=error.message + ), + ) + ) if validation_list: raise ValidationError(validation_list) + def ensure_html(text): try: validate_restructuredtext(text) - except ValidationError as e: - return '<pre>{}</pre>'.format(text) + except ValidationError: + return "<pre>{}</pre>".format(text) else: return restructuredtext(text) + def ensure_string(data): """ Ensure that we have a str object from data which can be either a str in @@ -125,6 +132,6 @@ def ensure_string(data): """ if data is not None: if isinstance(data, six.binary_type): - return data.decode('utf-8') + return data.decode("utf-8") return data - return '' \ No newline at end of file + return ""