Feedback Xblock in Ulmo

Hi,

I am trying to use the Feedback Xblock GitHub - openedx/FeedbackXBlock: An XBlock to allow students to provide feedback on course materials

The Xblock shows correctly, but I can’t seem to find where, as an instructor, I can see the results of that feedback.

The xblock page mentions that it’s in the administrator dashboard, but I don’t find anything about it.

I am using Ulmo. Any guidance ?

I implemented GitHub - openedx/FeedbackXBlock: An XBlock to allow students to provide feedback on course materials which I missed before, but that causes an error 500 when loading the instructor dashboard

In the logs, I get

lms-1                   | 2026-02-19 21:25:20,122 INFO 23 [eventtracking.backends.async_routing] [user 5] [ip 57.134.91.53] async_routing.py:41 - [EventEmissionExit] skipping event /courses/course-v1:CQ+CIP101+v1/instructor
lms-1                   | 2026-02-19 21:25:20,123 INFO 23 [tracking] [user 5] [ip 57.134.91.53] logger.py:41 - {"name": "/courses/course-v1:CQ+CIP101+v1/instructor", "context": {"course_id": "course-v1:CQ+CIP101+v1", "course_user_tags": {}, "user_id": 5, "path": "/courses/course-v1:CQ+CIP101+v1/instructor", "org_id": "CQ", "enterprise_uuid": ""}, "username": "mboisson", "session": "765ee8474e69d17703326b5bdd69c4e9", "ip": "57.134.91.53", "agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", "host": "edx.evolo-dev.calculquebec.cloud", "referer": "https://apps.edx.evolo-dev.calculquebec.cloud/", "accept_language": "fr-CA,fr;q=0.9,en-US;q=0.8,en;q=0.7,fr-FR;q=0.6", "event": "{\"GET\": {}, \"POST\": {}}", "time": "2026-02-19T21:25:20.122760+00:00", "event_type": "/courses/course-v1:CQ+CIP101+v1/instructor", "event_source": "server", "page": null}
lms-1                   | 2026-02-19 21:25:20,212 ERROR 23 [root] [user None] [ip None] signals.py:22 - Uncaught exception from None
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 "/opt/pyenv/versions/3.11.8/lib/python3.11/contextlib.py", line 81, in inner
lms-1                   |     return func(*args, **kwds)
lms-1                   |            ^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/utils/decorators.py", line 192, in _view_wrapper
lms-1                   |     result = _process_exception(request, e)
lms-1                   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/utils/decorators.py", line 190, in _view_wrapper
lms-1                   |     response = view_func(request, *args, **kwargs)
lms-1                   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/views/decorators/cache.py", line 54, in _view_wrapper
lms-1                   |     response = viewfunc(request, *args, **kw)
lms-1                   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/edx-platform/lms/djangoapps/instructor/views/instructor_dashboard.py", line 274, in instructor_dashboard_2
lms-1                   |     context, instructor_template = InstructorDashboardRenderStarted.run_filter(
lms-1                   |                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/openedx_filters/learning/filters.py", line 1282, in run_filter
lms-1                   |     data = super().run_pipeline(context=context, template_name=template_name)
lms-1                   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/openedx_filters/tooling.py", line 198, in run_pipeline
lms-1                   |     steps = cls.get_steps_for_pipeline(pipeline, fail_silently)
lms-1                   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/openedx_filters/tooling.py", line 61, in get_steps_for_pipeline
lms-1                   |     function = import_string(step_path)
lms-1                   |                ^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/utils/module_loading.py", line 30, in import_string
lms-1                   |     return cached_import(module_path, class_name)
lms-1                   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/utils/module_loading.py", line 15, in cached_import
lms-1                   |     module = import_module(module_path)
lms-1                   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/opt/pyenv/versions/3.11.8/lib/python3.11/importlib/__init__.py", line 126, in import_module
lms-1                   |     return _bootstrap._gcd_import(name[level:], package, level)
lms-1                   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
lms-1                   |   File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
lms-1                   |   File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
lms-1                   |   File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
lms-1                   |   File "<frozen importlib._bootstrap_external>", line 940, in exec_module
lms-1                   |   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/feedback/extensions/filters.py", line 12, in <module>
lms-1                   |     from cms.djangoapps.contentstore.utils import get_lms_link_for_item
lms-1                   |   File "/openedx/edx-platform/cms/djangoapps/contentstore/utils.py", line 38, in <module>
lms-1                   |     from cms.djangoapps.contentstore.toggles import (
lms-1                   |   File "/openedx/edx-platform/cms/djangoapps/contentstore/toggles.py", line 5, in <module>
lms-1                   |     from openedx.core.djangoapps.content.search import api as search_api
lms-1                   |   File "/openedx/edx-platform/openedx/core/djangoapps/content/search/api.py", line 33, in <module>
lms-1                   |     from openedx.core.djangoapps.content.search.index_config import (
lms-1                   |   File "/openedx/edx-platform/openedx/core/djangoapps/content/search/index_config.py", line 2, in <module>
lms-1                   |     from .documents import Fields
lms-1                   |   File "/openedx/edx-platform/openedx/core/djangoapps/content/search/documents.py", line 17, in <module>
lms-1                   |     from openedx.core.djangoapps.content.search.models import SearchAccess
lms-1                   |   File "/openedx/edx-platform/openedx/core/djangoapps/content/search/models.py", line 15, in <module>
lms-1                   |     class SearchAccess(models.Model):
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/db/models/base.py", line 136, in __new__
lms-1                   |     raise RuntimeError(
lms-1                   | RuntimeError: Model class openedx.core.djangoapps.content.search.models.SearchAccess doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
lms-1                   | 2026-02-19 21:25:20,247 INFO 23 [edx.footer] [user 5] [ip 57.134.91.53] api.py:479 - images/logo.png
lms-1                   | 2026-02-19 21:25:20,259 ERROR 23 [django.request] [user 5] [ip 57.134.91.53] log.py:253 - Internal Server Error: /courses/course-v1:CQ+CIP101+v1/instructor
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 "/opt/pyenv/versions/3.11.8/lib/python3.11/contextlib.py", line 81, in inner
lms-1                   |     return func(*args, **kwds)
lms-1                   |            ^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/utils/decorators.py", line 192, in _view_wrapper
lms-1                   |     result = _process_exception(request, e)
lms-1                   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/utils/decorators.py", line 190, in _view_wrapper
lms-1                   |     response = view_func(request, *args, **kwargs)
lms-1                   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/views/decorators/cache.py", line 54, in _view_wrapper
lms-1                   |     response = viewfunc(request, *args, **kw)
lms-1                   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/edx-platform/lms/djangoapps/instructor/views/instructor_dashboard.py", line 274, in instructor_dashboard_2
lms-1                   |     context, instructor_template = InstructorDashboardRenderStarted.run_filter(
lms-1                   |                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/openedx_filters/learning/filters.py", line 1282, in run_filter
lms-1                   |     data = super().run_pipeline(context=context, template_name=template_name)
lms-1                   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/openedx_filters/tooling.py", line 198, in run_pipeline
lms-1                   |     steps = cls.get_steps_for_pipeline(pipeline, fail_silently)
lms-1                   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/openedx_filters/tooling.py", line 61, in get_steps_for_pipeline
lms-1                   |     function = import_string(step_path)
lms-1                   |                ^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/utils/module_loading.py", line 30, in import_string
lms-1                   |     return cached_import(module_path, class_name)
lms-1                   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/utils/module_loading.py", line 15, in cached_import
lms-1                   |     module = import_module(module_path)
lms-1                   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "/opt/pyenv/versions/3.11.8/lib/python3.11/importlib/__init__.py", line 126, in import_module
lms-1                   |     return _bootstrap._gcd_import(name[level:], package, level)
lms-1                   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lms-1                   |   File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
lms-1                   |   File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
lms-1                   |   File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
lms-1                   |   File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
lms-1                   |   File "<frozen importlib._bootstrap_external>", line 940, in exec_module
lms-1                   |   File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/feedback/extensions/filters.py", line 12, in <module>
lms-1                   |     from cms.djangoapps.contentstore.utils import get_lms_link_for_item
lms-1                   |   File "/openedx/edx-platform/cms/djangoapps/contentstore/utils.py", line 38, in <module>
lms-1                   |     from cms.djangoapps.contentstore.toggles import (
lms-1                   |   File "/openedx/edx-platform/cms/djangoapps/contentstore/toggles.py", line 5, in <module>
lms-1                   |     from openedx.core.djangoapps.content.search import api as search_api
lms-1                   |   File "/openedx/edx-platform/openedx/core/djangoapps/content/search/api.py", line 33, in <module>
lms-1                   |     from openedx.core.djangoapps.content.search.index_config import (
lms-1                   |   File "/openedx/edx-platform/openedx/core/djangoapps/content/search/index_config.py", line 2, in <module>
lms-1                   |     from .documents import Fields
lms-1                   |   File "/openedx/edx-platform/openedx/core/djangoapps/content/search/documents.py", line 17, in <module>
lms-1                   |     from openedx.core.djangoapps.content.search.models import SearchAccess
lms-1                   |   File "/openedx/edx-platform/openedx/core/djangoapps/content/search/models.py", line 15, in <module>
lms-1                   |     class SearchAccess(models.Model):
lms-1                   |   File "/openedx/venv/lib/python3.11/site-packages/django/db/models/base.py", line 136, in __new__
lms-1                   |     raise RuntimeError(
lms-1                   | RuntimeError: Model class openedx.core.djangoapps.content.search.models.SearchAccess doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
lms-1                   | [pid: 23|app: 0|req: 11/33] 172.18.0.3 () {66 vars in 4076 bytes} [Thu Feb 19 21:25:20 2026] GET /courses/course-v1:CQ+CIP101+v1/instructor => generated 16424 bytes in 159 msecs (HTTP/1.1 500) 8 headers in 535 bytes (1 switches on core 0)
caddy-1                 | {"level":"error","ts":1771536320.2673352,"logger":"http.log.access.log0","msg":"handled request","request":{"remote_ip":"172.16.148.203","remote_port":"47272","client_ip":"57.134.91.53","proto":"HTTP/1.1","method":"GET","host":"edx.evolo-dev.calculquebec.cloud","uri":"/courses/course-v1:CQ+CIP101+v1/instructor"},"bytes_read":0,"user_id":"","duration":0.163930703,"size":5562,"status":500}

This isn’t a frontend issue so I moved to Site Operations. I don’t know who’s using the block but hopefully that helps get the right eyes on it.

This is fixed in FeedbackXBlock v3.0.1.

For Verawood, that repository has been consolidated, along with several other XBlocks, into GitHub - openedx/xblocks-extra · GitHub . The version of the block published by xblocks-extra will also contain the bugfix.

Thanks. I tested `xblocks-extra`, but it’s not compatible with Ulmo (requires python > 3.11). Trying this new version of `feedback-xblock` now. Will report soon.

Seems like the `feedback-xblock==3.0.1` indeed fixes the issues. Thank you!

Of course, thanks for your patience!