From 0a123bb448013b578bb0af190f02f82ddf74facd Mon Sep 17 00:00:00 2001 From: Navin Karkera Date: Thu, 19 Mar 2026 16:17:45 +0530 Subject: [PATCH 1/4] feat: add pre-item-delete signal This is required in cases where we want to be able to delete or update database rows related to children blocks on the deleted block. Fetching children after deletion is not possible, which is why this signal is useful --- xmodule/modulestore/__init__.py | 7 +++++++ xmodule/modulestore/django.py | 10 +++++++++- xmodule/modulestore/split_mongo/split.py | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/xmodule/modulestore/__init__.py b/xmodule/modulestore/__init__.py index 1e83e7e57162..e75f720bc376 100644 --- a/xmodule/modulestore/__init__.py +++ b/xmodule/modulestore/__init__.py @@ -1425,3 +1425,10 @@ def _emit_item_deleted_signal(self, usage_key, user_id): """ if self.signal_handler: self.signal_handler.send("item_deleted", usage_key=usage_key, user_id=user_id) + + def _emit_pre_item_delete_signal(self, usage_key, user_id): + """ + Helper method used to emit the pre_item_delete signal. + """ + if self.signal_handler: + self.signal_handler.send("pre_item_delete", usage_key=usage_key, user_id=user_id) diff --git a/xmodule/modulestore/django.py b/xmodule/modulestore/django.py index 7ac4c4d7d704..6dd0addfcbc8 100644 --- a/xmodule/modulestore/django.py +++ b/xmodule/modulestore/django.py @@ -195,11 +195,19 @@ def do_my_expensive_update(course_key): course_deleted = SwitchedSignal("course_deleted") library_updated = SwitchedSignal("library_updated") item_deleted = SwitchedSignal("item_deleted") + pre_item_delete = SwitchedSignal("pre_item_delete") _mapping = { signal.name: signal for signal - in [pre_publish, course_published, course_deleted, library_updated, item_deleted] + in [ + pre_publish, + course_published, + course_deleted, + library_updated, + item_deleted, + pre_item_delete, + ] } def __init__(self, modulestore_class): diff --git a/xmodule/modulestore/split_mongo/split.py b/xmodule/modulestore/split_mongo/split.py index f429c9d14ecc..429a26561a76 100644 --- a/xmodule/modulestore/split_mongo/split.py +++ b/xmodule/modulestore/split_mongo/split.py @@ -2517,6 +2517,9 @@ def delete_item(self, usage_locator, user_id, force=False): # lint-amnesty, pyl # The supplied UsageKey is of the wrong type, so it can't possibly be stored in this modulestore. raise ItemNotFoundError(usage_locator) + # Send pre delete event signal before deleting any item + self._emit_pre_item_delete_signal(usage_locator, user_id) + with self.bulk_operations(usage_locator.course_key): original_structure = self._lookup_course(usage_locator.course_key).structure block_key = BlockKey.from_usage_key(usage_locator) From dcc72e800fe176429302786226feb7830878c616 Mon Sep 17 00:00:00 2001 From: Navin Karkera Date: Thu, 19 Mar 2026 20:54:58 +0530 Subject: [PATCH 2/4] temp: point to dev branch of lti-xblock --- requirements/edx/base.txt | 3 ++- requirements/edx/development.txt | 3 ++- requirements/edx/doc.txt | 3 ++- requirements/edx/kernel.in | 2 +- requirements/edx/testing.txt | 3 ++- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index c2d88471fa40..b76ea638d841 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -728,7 +728,7 @@ lazy==1.6 # lti-consumer-xblock # ora2 # xblock -lti-consumer-xblock==10.0.1 +lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer@navin/fal-4318/split-config # via -r requirements/edx/kernel.in lxml[html-clean]==5.3.2 # via @@ -850,6 +850,7 @@ openedx-events==11.1.0 # edx-event-bus-kafka # edx-event-bus-redis # event-tracking + # lti-consumer-xblock # ora2 openedx-filters==3.1.0 # via diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 462f74061ea9..1fc2b1f275a9 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1206,7 +1206,7 @@ libsass==0.10.0 # via # -c requirements/constraints.txt # -r requirements/edx/assets.txt -lti-consumer-xblock==10.0.1 +lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer@navin/fal-4318/split-config # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1411,6 +1411,7 @@ openedx-events==11.1.0 # edx-event-bus-kafka # edx-event-bus-redis # event-tracking + # lti-consumer-xblock # ora2 openedx-filters==3.1.0 # via diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index fd9bc6c77bd2..56478ca52e0e 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -886,7 +886,7 @@ lazy==1.6 # lti-consumer-xblock # ora2 # xblock -lti-consumer-xblock==10.0.1 +lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer@navin/fal-4318/split-config # via -r requirements/edx/base.txt lxml[html-clean]==5.3.2 # via @@ -1029,6 +1029,7 @@ openedx-events==11.1.0 # edx-event-bus-kafka # edx-event-bus-redis # event-tracking + # lti-consumer-xblock # ora2 openedx-filters==3.1.0 # via diff --git a/requirements/edx/kernel.in b/requirements/edx/kernel.in index 26448abf177d..e838436d292f 100644 --- a/requirements/edx/kernel.in +++ b/requirements/edx/kernel.in @@ -101,7 +101,7 @@ jsonfield # Django model field for validated JSON; use laboratory # Library for testing that code refactors/infrastructure changes produce identical results importlib_metadata # Used to access entry_points in i18n_api plugin lxml[html_clean] # XML parser -lti-consumer-xblock>=9.14.2 +lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer@navin/fal-4318/split-config mako # Primary template language used for server-side page rendering Markdown # Convert text markup to HTML; used in capa problems, forums, and course wikis meilisearch # Library to access Meilisearch search engine (will replace ElasticSearch) diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 8d679c59e1c1..42a3d6a798ec 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -925,7 +925,7 @@ lazy==1.6 # lti-consumer-xblock # ora2 # xblock -lti-consumer-xblock==10.0.1 +lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer@navin/fal-4318/split-config # via -r requirements/edx/base.txt lxml[html-clean]==5.3.2 # via @@ -1076,6 +1076,7 @@ openedx-events==11.1.0 # edx-event-bus-kafka # edx-event-bus-redis # event-tracking + # lti-consumer-xblock # ora2 openedx-filters==3.1.0 # via From 97cc25e7e9b2efe164cf8c46d51a9b8f32895009 Mon Sep 17 00:00:00 2001 From: Navin Karkera Date: Thu, 19 Mar 2026 22:32:09 +0530 Subject: [PATCH 3/4] fix: failing tests --- xmodule/modulestore/tests/test_mixed_modulestore.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xmodule/modulestore/tests/test_mixed_modulestore.py b/xmodule/modulestore/tests/test_mixed_modulestore.py index 6c0cdc6504d1..c12607687bde 100644 --- a/xmodule/modulestore/tests/test_mixed_modulestore.py +++ b/xmodule/modulestore/tests/test_mixed_modulestore.py @@ -1123,7 +1123,7 @@ def test_has_changes_missing_child(self, default_ms, default_branch): # check CONTENT_TAGGING_AUTO CourseWaffleFlag # Find: active_versions, 2 structures (published & draft), definition (unnecessary) # Sends: updated draft and published structures and active_versions - @ddt.data((ModuleStoreEnum.Type.split, 5, 2, 3)) + @ddt.data((ModuleStoreEnum.Type.split, 11, 2, 3)) @ddt.unpack def test_delete_item(self, default_ms, num_mysql, max_find, max_send): """ @@ -1146,7 +1146,7 @@ def test_delete_item(self, default_ms, num_mysql, max_find, max_send): # check CONTENT_TAGGING_AUTO CourseWaffleFlag # find: draft and published structures, definition (unnecessary) # sends: update published (why?), draft, and active_versions - @ddt.data((ModuleStoreEnum.Type.split, 5, 3, 3)) + @ddt.data((ModuleStoreEnum.Type.split, 11, 3, 3)) @ddt.unpack def test_delete_private_vertical(self, default_ms, num_mysql, max_find, max_send): """ @@ -1196,7 +1196,7 @@ def test_delete_private_vertical(self, default_ms, num_mysql, max_find, max_send # check CONTENT_TAGGING_AUTO CourseWaffleFlag # find: structure (cached) # send: update structure and active_versions - @ddt.data((ModuleStoreEnum.Type.split, 5, 1, 2)) + @ddt.data((ModuleStoreEnum.Type.split, 11, 1, 2)) @ddt.unpack def test_delete_draft_vertical(self, default_ms, num_mysql, max_find, max_send): """ From 06070f48d0dad563d1ce584bde612e36f1352694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B4mulo=20Penido?= Date: Thu, 2 Apr 2026 17:14:51 -0300 Subject: [PATCH 4/4] chore: pin lti-conmsumer-xblock branch --- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/kernel.in | 2 +- requirements/edx/testing.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index b76ea638d841..35b44896b6fb 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -728,7 +728,7 @@ lazy==1.6 # lti-consumer-xblock # ora2 # xblock -lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer@navin/fal-4318/split-config +lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer.git@rpenido/FAL-4322/new-editor-design # via -r requirements/edx/kernel.in lxml[html-clean]==5.3.2 # via diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 1fc2b1f275a9..8c08ad640e91 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1206,7 +1206,7 @@ libsass==0.10.0 # via # -c requirements/constraints.txt # -r requirements/edx/assets.txt -lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer@navin/fal-4318/split-config +lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer.git@rpenido/FAL-4322/new-editor-design # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 56478ca52e0e..cc8c6674e015 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -886,7 +886,7 @@ lazy==1.6 # lti-consumer-xblock # ora2 # xblock -lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer@navin/fal-4318/split-config +lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer.git@rpenido/FAL-4322/new-editor-design # via -r requirements/edx/base.txt lxml[html-clean]==5.3.2 # via diff --git a/requirements/edx/kernel.in b/requirements/edx/kernel.in index e838436d292f..55d8132c1bc8 100644 --- a/requirements/edx/kernel.in +++ b/requirements/edx/kernel.in @@ -101,7 +101,7 @@ jsonfield # Django model field for validated JSON; use laboratory # Library for testing that code refactors/infrastructure changes produce identical results importlib_metadata # Used to access entry_points in i18n_api plugin lxml[html_clean] # XML parser -lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer@navin/fal-4318/split-config +lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer.git@rpenido/FAL-4322/new-editor-design mako # Primary template language used for server-side page rendering Markdown # Convert text markup to HTML; used in capa problems, forums, and course wikis meilisearch # Library to access Meilisearch search engine (will replace ElasticSearch) diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 42a3d6a798ec..1f56bf860be9 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -925,7 +925,7 @@ lazy==1.6 # lti-consumer-xblock # ora2 # xblock -lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer@navin/fal-4318/split-config +lti-consumer-xblock @ git+https://github.com/open-craft/xblock-lti-consumer.git@rpenido/FAL-4322/new-editor-design # via -r requirements/edx/base.txt lxml[html-clean]==5.3.2 # via