Skip to content

Improve error for missing (Translate)CustomTagBlock template #35829

@kdmccormick

Description

@kdmccormick

Currently, when an instance of a CustomTagBlock (or of its wrapper block, TranslateCustomTagBlock) does not have a matching template in the OLX at course/custom_tags/TAGNAME, a very opaque and confusing error message is displayed in Studio and in LMS/CMS logs.

We could make this situation better for course author and developers by explaining which template file is missing. It would be good if the Studio error was displayed in such a way that the block could still be edited or deleted.

(In addition to this, we would like to add an instance of this block to the test course)


(ORIGINAL ERROR REPORT)

We are trying to figure out the last time that CustomTagBlock and TranslateCustomTagBlock worked in LMS and in Studio. (UPDATE: They actually work in master. See my comment below).

@farhan first noticed this as an existing issue while trying to convert customtag's Sass to CSS. The errors he saw on CustomTagBlock are:

2024-11-06 22:09:43 Traceback (most recent call last):
2024-11-06 22:09:43   File "/openedx/edx-platform/cms/djangoapps/contentstore/views/preview.py", line 351, in get_preview_fragment
2024-11-06 22:09:43     fragment = block.render(preview_view, context)
2024-11-06 22:09:43                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "/openedx/venv/lib/python3.11/site-packages/xblock/core.py", line 818, in render
2024-11-06 22:09:43     return self.runtime.render(self, view, context)
2024-11-06 22:09:43            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "/openedx/edx-platform/xmodule/x_module.py", line 994, in render
2024-11-06 22:09:43     return super().render(block, view_name, context=context)
2024-11-06 22:09:43            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "/openedx/venv/lib/python3.11/site-packages/xblock/runtime.py", line 823, in render
2024-11-06 22:09:43     frag = view_fn(context)
2024-11-06 22:09:43            ^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "/openedx/edx-platform/xmodule/vertical_block.py", line 224, in author_view
2024-11-06 22:09:43     self.render_children(context, fragment, can_reorder=True, can_add=True)
2024-11-06 22:09:43   File "/openedx/edx-platform/xmodule/studio_editable.py", line 30, in render_children
2024-11-06 22:09:43     rendered_child = child.render(StudioEditableBlock.get_preview_view_name(child), context)
2024-11-06 22:09:43                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "/openedx/venv/lib/python3.11/site-packages/xblock/core.py", line 818, in render
2024-11-06 22:09:43     return self.runtime.render(self, view, context)
2024-11-06 22:09:43            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "/openedx/edx-platform/xmodule/x_module.py", line 994, in render
2024-11-06 22:09:43     return super().render(block, view_name, context=context)
2024-11-06 22:09:43            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "/openedx/venv/lib/python3.11/site-packages/xblock/runtime.py", line 823, in render
2024-11-06 22:09:43     frag = view_fn(context)
2024-11-06 22:09:43            ^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "/openedx/edx-platform/xmodule/template_block.py", line 114, in student_view
2024-11-06 22:09:43     fragment.add_content(self.rendered_html)
2024-11-06 22:09:43                          ^^^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "/openedx/edx-platform/xmodule/template_block.py", line 107, in rendered_html
2024-11-06 22:09:43     return self.render_template(self.runtime, self.data)
2024-11-06 22:09:43            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "/openedx/edx-platform/xmodule/template_block.py", line 81, in render_template
2024-11-06 22:09:43     xmltree = etree.fromstring(xml_data)
2024-11-06 22:09:43               ^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "/openedx/edx-platform/openedx/core/lib/safe_lxml/xmlparser.py", line 128, in fromstring
2024-11-06 22:09:43     rootelement = _etree.fromstring(text, parser, base_url=base_url)
2024-11-06 22:09:43                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-11-06 22:09:43   File "src/lxml/etree.pyx", line 3264, in lxml.etree.fromstring
2024-11-06 22:09:43   File "src/lxml/parser.pxi", line 1916, in lxml.etree._parseMemoryDocument
2024-11-06 22:09:43   File "src/lxml/parser.pxi", line 1796, in lxml.etree._parseDoc
2024-11-06 22:09:43   File "src/lxml/parser.pxi", line 1085, in lxml.etree._BaseParser._parseUnicodeDoc
2024-11-06 22:09:43   File "src/lxml/parser.pxi", line 618, in lxml.etree._ParserContext._handleParseResultDoc
2024-11-06 22:09:43   File "src/lxml/parser.pxi", line 728, in lxml.etree._handleParseResult
2024-11-06 22:09:43   File "src/lxml/parser.pxi", line 657, in lxml.etree._raiseParseError
2024-11-06 22:09:43   File "<string>", line 1
2024-11-06 22:09:43 lxml.etree.XMLSyntaxError: Document is empty, line 1, column 1
2024-11-06 22:09:43 [06/Nov/2024 17:09:43] "GET /xblock/block-v1:edx+3+3+type@vertical+block@44306a226476427cb4ad0d9057fc3795/container_preview?_=1730912983221 HTTP/1.1" 200 631

@kdmccormick sees these NoSuchViewError for TranslateCustomTagBlock, both in LMS (these logs) and CMS (not shown):

lms-1  | 2024-11-12 16:31:52,646 ERROR 22 [django.request] [user None] [ip None] log.py:241 - Internal Server Error: /xblock/block-v1:OpenedX+TestX+TestCourse+type@vertical+block@241c59c55fc24def97bf5ec8a22ed5a4
lms-1  | Traceback (most recent call last):
lms-1  |   File "/openedx/venv/lib/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner
lms-1  |     response = get_response(request)
lms-1  |                ^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/openedx/venv/lib/python3.11/site-packages/django/core/handlers/base.py", line 197, in _get_response
lms-1  |     response = wrapped_callback(request, *callback_args, **callback_kwargs)
lms-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/openedx/venv/lib/python3.11/site-packages/django/views/decorators/http.py", line 43, in inner
lms-1  |     return func(request, *args, **kwargs)
lms-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/openedx/edx-platform/common/djangoapps/util/views.py", line 63, in inner
lms-1  |     response = view_func(request, *args, **kwargs)
lms-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/openedx/venv/lib/python3.11/site-packages/django/views/decorators/clickjacking.py", line 58, in wrapper_view
lms-1  |     resp = view_func(*args, **kwargs)
lms-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/openedx/venv/lib/python3.11/site-packages/django/utils/decorators.py", line 134, in _wrapper_view
lms-1  |     response = view_func(request, *args, **kwargs)
lms-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/openedx/edx-platform/lms/djangoapps/courseware/views/views.py", line 1708, in render_xblock
lms-1  |     fragment = block.render(requested_view, context=student_view_context)
lms-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/mnt/xblock/xblock/core.py", line 818, in render
lms-1  |     return self.runtime.render(self, view, context)
lms-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/openedx/edx-platform/xmodule/x_module.py", line 994, in render
lms-1  |     return super().render(block, view_name, context=context)
lms-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/mnt/xblock/xblock/runtime.py", line 823, in render
lms-1  |     frag = view_fn(context)
lms-1  |            ^^^^^^^^^^^^^^^^
lms-1  |   File "/openedx/edx-platform/xmodule/vertical_block.py", line 204, in student_view
lms-1  |     return self._student_or_public_view(context, STUDENT_VIEW)
lms-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/openedx/edx-platform/xmodule/vertical_block.py", line 131, in _student_or_public_view
lms-1  |     rendered_child = child.render(view, child_block_context)
lms-1  |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/mnt/xblock/xblock/core.py", line 818, in render
lms-1  |     return self.runtime.render(self, view, context)
lms-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/openedx/edx-platform/xmodule/x_module.py", line 994, in render
lms-1  |     return super().render(block, view_name, context=context)
lms-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1  |   File "/mnt/xblock/xblock/runtime.py", line 820, in render
lms-1  |     raise NoSuchViewError(block, view_name)
lms-1  | xblock.exceptions.NoSuchViewError

In Studio, this looks like:
image

When was the last time this block worked?

Potentially relevant PRs:

Metadata

Metadata

Assignees

No one assigned

    Labels

    good first issueA good task for a newcomer to start withhelp wantedReady to be picked up by anyone in the community

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions