From 7aa579f832ed03d24fd6212ef1ef117976c5da44 Mon Sep 17 00:00:00 2001 From: Navin Karkera Date: Thu, 16 Jul 2026 17:20:59 +0530 Subject: [PATCH 1/2] fix: render current config in studio template and prevent auto-save crash Move self.seen = True from get_client_configuration to student_view so Studio auto-save (which calls studio_view -> get_client_configuration) does not write Scope.user_info and crash. Pass actual configuration values into the Django template context instead of relying on hardcoded defaults. --- recommender/recommender.py | 17 ++++++++---- recommender/templates/recommenderstudio.html | 29 +++++++------------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/recommender/recommender.py b/recommender/recommender.py index 566c283..ef8b340 100644 --- a/recommender/recommender.py +++ b/recommender/recommender.py @@ -434,10 +434,6 @@ def get_client_configuration(self): result = self.client_configuration.copy() result['is_user_staff'] = self.get_user_is_staff() result['intro'] = not self.seen and self.intro_enabled - if not self.seen: - # Mark the user who interacted with the XBlock first time as seen, - # in order not to show the usage tutorial in future. - self.seen = True tracker.emit('get_client_configuration', result) return result @@ -1008,6 +1004,11 @@ def student_view(self, _context=None): # pylint: disable=unused-argument frag.add_javascript(self.resource_string("static/js/src/cats.js")) frag.add_javascript(self.resource_string("static/js/src/recommender.js")) frag.initialize_js('RecommenderXBlock', self.get_client_configuration()) + # First student view delivered the intro, mark seen so it doesn't + # show again. Must happen after get_client_configuration to avoid + # writing Scope.user_info during studio_view render (auto-save + # rejects user_info). + self.seen = True return frag def studio_view(self, _context=None): # pylint: disable=unused-argument @@ -1016,8 +1017,14 @@ def studio_view(self, _context=None): # pylint: disable=unused-argument course staff when editing a course in studio. """ frag = Fragment() + configurations = self.get_client_configuration() frag.add_content(resource_loader.render_django_template( - "templates/recommenderstudio.html", + "templates/recommenderstudio.html", { + 'configurations': configurations, + 'intro_enabled': self.intro_enabled, + 'entries_per_page_options': range(1, 11), + 'page_span_options': range(1, 6), + }, i18n_service=self.runtime.service(self, "i18n") )) frag.add_css(load("static/css/recommenderstudio.css")) diff --git a/recommender/templates/recommenderstudio.html b/recommender/templates/recommenderstudio.html index 3133611..62afd9a 100644 --- a/recommender/templates/recommenderstudio.html +++ b/recommender/templates/recommenderstudio.html @@ -9,39 +9,30 @@
{% trans "Set the student-view, client side configurations for RecommenderXblock." %}
+ + {% trans "Do you want to take users on a little tour when they see the RecommenderXBlock first time?" %}
{% trans "Do you want to disable the UX functions which are under development?" %}
{% trans "How many resources you want to show in each page of the resource list?" %}
{% trans "How many page icons in pagination control (i.e., page range)? The icons for pages from (current page - page range) to (current page + page range) will be shown." %}
From 7fd5447de677b4b2fb55e0be4c8e1c653eff8aae Mon Sep 17 00:00:00 2001 From: Navin Karkera Date: Tue, 21 Jul 2026 16:34:17 +0530 Subject: [PATCH 2/2] chore: bump version to 5.1.0 --- recommender/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recommender/__init__.py b/recommender/__init__.py index dc880af..98431ec 100644 --- a/recommender/__init__.py +++ b/recommender/__init__.py @@ -6,4 +6,4 @@ # which is not loaded when running `manage.py` commands (which is used by `make compile_translations`) # from .recommender import RecommenderXBlock -__version__ = '5.0.0' +__version__ = '5.1.0'