Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions lms/djangoapps/grades/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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__)

Expand Down Expand Up @@ -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(
Expand Down
46 changes: 46 additions & 0 deletions lms/djangoapps/grades/tests/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
8 changes: 6 additions & 2 deletions lms/envs/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"],
},
}

Expand Down
2 changes: 1 addition & 1 deletion requirements/edx/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion requirements/edx/development.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion requirements/edx/doc.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion requirements/edx/testing.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading