From 99d17106042a4e211d5e1360741a5424d4e69603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B4mulo=20Penido?= Date: Tue, 11 Feb 2025 15:32:11 -0300 Subject: [PATCH 1/2] fix: always define a student_data_store to prevent errors on XBlock load --- openedx/core/djangoapps/xblock/runtime/runtime.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/openedx/core/djangoapps/xblock/runtime/runtime.py b/openedx/core/djangoapps/xblock/runtime/runtime.py index 2bf84e995417..8829cedac77b 100644 --- a/openedx/core/djangoapps/xblock/runtime/runtime.py +++ b/openedx/core/djangoapps/xblock/runtime/runtime.py @@ -18,7 +18,7 @@ from web_fragments.fragment import Fragment from xblock.core import XBlock from xblock.exceptions import NoSuchServiceError -from xblock.field_data import FieldData, SplitFieldData +from xblock.field_data import DictFieldData, FieldData, SplitFieldData from xblock.fields import Scope, ScopeIds from xblock.runtime import IdReader, KvsFieldData, MemoryIdManager, Runtime @@ -351,8 +351,10 @@ def _init_field_data_for_block(self, block: XBlock) -> FieldData: Initialize the FieldData implementation for the specified XBlock """ if self.user is None: - # No user is specified, so we want to throw an error if anything attempts to read/write user-specific fields - student_data_store = None + # No user is specified, so we want to ignore any user-specific data. We cannot throw an + # error here because the XBlock loading process will write to the user_state if we have + # mutable fields. + student_data_store = DictFieldData({}) elif self.user.is_anonymous: # This is an anonymous (non-registered) user: assert isinstance(self.user_id, str) and self.user_id.startswith("anon") From 1aa8e951310cdb68f651a4703cec501605a9a439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B4mulo=20Penido?= Date: Tue, 11 Feb 2025 15:42:34 -0300 Subject: [PATCH 2/2] chore: bump xblock version to 5.1.2 --- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/testing.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index fafc6ff17c8d..32f3638340ff 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -1252,7 +1252,7 @@ wheel==0.45.1 # via django-pipeline wrapt==1.17.2 # via -r requirements/edx/kernel.in -xblock[django]==5.1.1 +xblock[django]==5.1.2 # via # -r requirements/edx/kernel.in # acid-xblock diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 318464d44812..93396ff1a38d 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -2239,7 +2239,7 @@ wrapt==1.17.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -xblock[django]==5.1.1 +xblock[django]==5.1.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index ddda43eb5b70..b67891daf4f1 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -1573,7 +1573,7 @@ wheel==0.45.1 # django-pipeline wrapt==1.17.2 # via -r requirements/edx/base.txt -xblock[django]==5.1.1 +xblock[django]==5.1.2 # via # -r requirements/edx/base.txt # acid-xblock diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 6a727650fe71..843e5b3757b7 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -1663,7 +1663,7 @@ wheel==0.45.1 # django-pipeline wrapt==1.17.2 # via -r requirements/edx/base.txt -xblock[django]==5.1.1 +xblock[django]==5.1.2 # via # -r requirements/edx/base.txt # acid-xblock