diff --git a/lms/djangoapps/grades/events.py b/lms/djangoapps/grades/events.py index e386d0bc6326..49299b709f83 100644 --- a/lms/djangoapps/grades/events.py +++ b/lms/djangoapps/grades/events.py @@ -15,6 +15,7 @@ UserPersonalData, ) from openedx_events.learning.signals import CCX_COURSE_PASSING_STATUS_UPDATED, COURSE_PASSING_STATUS_UPDATED +from openedx_filters.learning.filters import GradeEventContextRequested from common.djangoapps.course_modes.models import CourseMode from common.djangoapps.student.models import CourseEnrollment @@ -27,7 +28,6 @@ ) from lms.djangoapps.grades.signals.signals import SCHEDULE_FOLLOW_UP_SEGMENT_EVENT_FOR_COURSE_PASSED_FIRST_TIME from openedx.core.djangoapps.content.course_overviews.models import CourseOverview -from openedx.features.enterprise_support.context import get_enterprise_event_context log = getLogger(__name__) @@ -166,8 +166,11 @@ def course_grade_passed_first_time(user_id, course_id): """ event_name = COURSE_GRADE_PASSED_FIRST_TIME_EVENT_TYPE context = contexts.course_context_from_course_id(course_id) - context_enterprise = get_enterprise_event_context(user_id, course_id) - context.update(context_enterprise) + filtered_context, _, _ = GradeEventContextRequested.run_filter( + context=context, user_id=user_id, course_id=course_id + ) + if filtered_context is not None: + context = filtered_context # TODO (AN-6134): remove this context manager with tracker.get_tracker().context(event_name, context): tracker.emit( diff --git a/lms/djangoapps/grades/tests/test_events.py b/lms/djangoapps/grades/tests/test_events.py index 01b214ce95e1..7451dda08bf0 100644 --- a/lms/djangoapps/grades/tests/test_events.py +++ b/lms/djangoapps/grades/tests/test_events.py @@ -3,6 +3,7 @@ """ from unittest import mock +from unittest.mock import patch from ccx_keys.locator import CCXLocator from django.utils.timezone import now @@ -229,3 +230,48 @@ def test_ccx_course_passing_status_updated_emitted(self): }, event_receiver.call_args.kwargs, ) + + +class GradeEventContextFilterTest(SharedModuleStoreTestCase): + """ + Tests that course_grade_passed_first_time invokes the GradeEventContextRequested + filter instead of the old enterprise_support import. + """ + + @classmethod + def setUpClass(cls): + super().setUpClass() + + def setUp(self): + super().setUp() + self.user = UserFactory.create() + self.course = CourseFactory.create() + + @patch('lms.djangoapps.grades.events.GradeEventContextRequested.run_filter') + def test_filter_called_with_context(self, mock_run_filter): + """ + course_grade_passed_first_time should call GradeEventContextRequested.run_filter + and merge the returned context. + """ + enriched = {"org": "test_org", "enterprise_uuid": "abc-123"} + mock_run_filter.return_value = enriched + + from lms.djangoapps.grades.events import course_grade_passed_first_time + with patch('lms.djangoapps.grades.events.tracker'): + course_grade_passed_first_time(self.user.id, self.course.id) + + mock_run_filter.assert_called_once() + call_kwargs = mock_run_filter.call_args.kwargs + assert call_kwargs['user_id'] == self.user.id + assert str(call_kwargs['course_id']) == str(self.course.id) + + @patch('lms.djangoapps.grades.events.GradeEventContextRequested.run_filter') + def test_filter_none_return_leaves_context_intact(self, mock_run_filter): + """ + If run_filter returns None (fail_silently path), context is not overwritten. + """ + mock_run_filter.return_value = None + from lms.djangoapps.grades.events import course_grade_passed_first_time + with patch('lms.djangoapps.grades.events.tracker'): + # Should not raise even when filter returns None + course_grade_passed_first_time(self.user.id, self.course.id) diff --git a/lms/envs/common.py b/lms/envs/common.py index 3ec166552166..f3446204180e 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -3290,8 +3290,12 @@ def _should_send_certificate_events(settings): # 'pipeline' (list of dotted-path strings to PipelineStep subclasses). OPEN_EDX_FILTERS_CONFIG = { "org.openedx.learning.account.settings.read_only_fields.requested.v1": { - "fail_silently": True, - "pipeline": ["enterprise.filters.accounts.AccountSettingsReadOnlyFieldsStep"], + "fail_silently": False, + "pipeline": ["enterprise.filters.accounts.AccountSettingsEnterpriseReadOnlyFieldsStep"], + }, + "org.openedx.learning.grade.context.requested.v1": { + "fail_silently": False, + "pipeline": ["enterprise.filters.grades.GradeEventContextEnricher"], }, } diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index b31b3126523f..487b820c1c74 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -861,7 +861,7 @@ openedx-events==11.2.0 # openedx-authz # openedx-core # ora2 -openedx-filters==3.1.0 +openedx-filters==3.3.0 # via # -r requirements/edx/kernel.in # edx-enterprise diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 10e05f216365..8bbf513e91b8 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1413,7 +1413,7 @@ openedx-events==11.2.0 # openedx-authz # openedx-core # ora2 -openedx-filters==3.1.0 +openedx-filters==3.3.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 432599aac433..59bf1e31ff00 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -1041,7 +1041,7 @@ openedx-events==11.2.0 # openedx-authz # openedx-core # ora2 -openedx-filters==3.1.0 +openedx-filters==3.3.0 # via # -r requirements/edx/base.txt # edx-enterprise diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 3b000d1ca072..95edea1f9662 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -1081,7 +1081,7 @@ openedx-events==11.2.0 # openedx-authz # openedx-core # ora2 -openedx-filters==3.1.0 +openedx-filters==3.3.0 # via # -r requirements/edx/base.txt # edx-enterprise