Skip to content

Commit cffce48

Browse files
authored
feat: replace enterprise_support import with GradeEventContextRequested filter
1 parent 272718e commit cffce48

7 files changed

Lines changed: 105 additions & 10 deletions

File tree

lms/djangoapps/grades/events.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
UserPersonalData,
1616
)
1717
from openedx_events.learning.signals import CCX_COURSE_PASSING_STATUS_UPDATED, COURSE_PASSING_STATUS_UPDATED
18+
from openedx_filters.learning.filters import GradeEventContextRequested
1819

1920
from common.djangoapps.course_modes.models import CourseMode
2021
from common.djangoapps.student.models import CourseEnrollment
@@ -27,7 +28,6 @@
2728
)
2829
from lms.djangoapps.grades.signals.signals import SCHEDULE_FOLLOW_UP_SEGMENT_EVENT_FOR_COURSE_PASSED_FIRST_TIME
2930
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
30-
from openedx.features.enterprise_support.context import get_enterprise_event_context
3131

3232
log = getLogger(__name__)
3333

@@ -166,10 +166,25 @@ def course_grade_passed_first_time(user_id, course_id):
166166
"""
167167
event_name = COURSE_GRADE_PASSED_FIRST_TIME_EVENT_TYPE
168168
context = contexts.course_context_from_course_id(course_id)
169-
context_enterprise = get_enterprise_event_context(user_id, course_id)
170-
context.update(context_enterprise)
169+
try:
170+
filtered_context, _, _ = GradeEventContextRequested.run_filter(
171+
context=context, user_id=user_id, course_id=course_id
172+
)
173+
except Exception: # pylint: disable=broad-except
174+
log.exception(
175+
'GradeEventContextRequested failed for user_id=%s course_id=%s',
176+
user_id,
177+
course_id,
178+
)
179+
raise
180+
log.debug(
181+
'GradeEventContextRequested succeeded for user_id=%s course_id=%s',
182+
user_id,
183+
course_id,
184+
)
185+
171186
# TODO (AN-6134): remove this context manager
172-
with tracker.get_tracker().context(event_name, context):
187+
with tracker.get_tracker().context(event_name, filtered_context):
173188
tracker.emit(
174189
event_name,
175190
{

lms/djangoapps/grades/tests/test_events.py

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
"""
44

55
from unittest import mock
6+
from unittest.mock import patch
67

8+
import pytest
79
from ccx_keys.locator import CCXLocator
810
from django.utils.timezone import now
911
from openedx_events.learning.data import (
@@ -34,7 +36,7 @@
3436

3537
class PersistentGradeEventsTest(OpenEdxEventsTestMixin, SharedModuleStoreTestCase):
3638
"""
37-
Tests for the Open edX Events associated with the persistant grade process through the update_or_create method.
39+
Tests for the Open edX Events associated with the persistent grade process through the update_or_create method.
3840
3941
This class guarantees that the following events are sent during the user updates their grade, with
4042
the exact Data Attributes as the event definition stated:
@@ -229,3 +231,81 @@ def test_ccx_course_passing_status_updated_emitted(self):
229231
},
230232
event_receiver.call_args.kwargs,
231233
)
234+
235+
236+
class GradeEventContextFilterTest(SharedModuleStoreTestCase):
237+
"""
238+
Tests that course_grade_passed_first_time invokes the GradeEventContextRequested
239+
filter and uses the returned context directly.
240+
"""
241+
242+
def setUp(self):
243+
super().setUp()
244+
self.user = UserFactory.create()
245+
self.course = CourseFactory.create()
246+
247+
@patch('lms.djangoapps.grades.events.tracker')
248+
@patch('lms.djangoapps.grades.events.contexts.course_context_from_course_id')
249+
@patch('lms.djangoapps.grades.events.GradeEventContextRequested.run_filter')
250+
def test_filter_called_with_context(
251+
self,
252+
mock_run_filter,
253+
mock_course_context_from_course_id,
254+
mock_tracker,
255+
):
256+
"""
257+
course_grade_passed_first_time should call
258+
GradeEventContextRequested.run_filter and use the returned context.
259+
"""
260+
original_context = {"course_id": str(self.course.id)}
261+
filtered_context = {
262+
"course_id": str(self.course.id),
263+
"org": "test_org",
264+
"enterprise_uuid": "abc-123",
265+
}
266+
mock_course_context_from_course_id.return_value = original_context
267+
mock_run_filter.return_value = (filtered_context, self.user.id, self.course.id)
268+
269+
from lms.djangoapps.grades.events import course_grade_passed_first_time
270+
271+
course_grade_passed_first_time(self.user.id, self.course.id)
272+
273+
mock_run_filter.assert_called_once_with(
274+
context=original_context,
275+
user_id=self.user.id,
276+
course_id=self.course.id,
277+
)
278+
mock_tracker.get_tracker.return_value.context.assert_called_once_with(
279+
'edx.course.grade.passed.first_time',
280+
filtered_context,
281+
)
282+
283+
@patch('lms.djangoapps.grades.events.log')
284+
@patch('lms.djangoapps.grades.events.tracker')
285+
@patch('lms.djangoapps.grades.events.contexts.course_context_from_course_id')
286+
@patch('lms.djangoapps.grades.events.GradeEventContextRequested.run_filter')
287+
def test_filter_exception_is_logged_and_raised(
288+
self,
289+
mock_run_filter,
290+
mock_course_context_from_course_id,
291+
mock_tracker,
292+
mock_log,
293+
):
294+
"""
295+
If run_filter raises an exception, it should be logged and re-raised.
296+
"""
297+
original_context = {"course_id": str(self.course.id)}
298+
mock_course_context_from_course_id.return_value = original_context
299+
mock_run_filter.side_effect = Exception("boom")
300+
301+
from lms.djangoapps.grades.events import course_grade_passed_first_time
302+
303+
with pytest.raises(Exception, match="boom"):
304+
course_grade_passed_first_time(self.user.id, self.course.id)
305+
306+
mock_log.exception.assert_called_once_with(
307+
'GradeEventContextRequested failed for user_id=%s course_id=%s',
308+
self.user.id,
309+
self.course.id,
310+
)
311+
mock_tracker.get_tracker.return_value.context.assert_not_called()

requirements/constraints.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ django-stubs<6
4444
# The team that owns this package will manually bump this package rather than having it pulled in automatically.
4545
# This is to allow them to better control its deployment and to do it in a process that works better
4646
# for them.
47-
edx-enterprise==8.0.14
47+
edx-enterprise==8.0.15
4848

4949
# Date: 2023-07-26
5050
# Our legacy Sass code is incompatible with anything except this ancient libsass version.

requirements/edx/base.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ edx-drf-extensions==10.6.0
483483
# enterprise-integrated-channels
484484
# openedx-authz
485485
# openedx-core
486-
edx-enterprise==8.0.14
486+
edx-enterprise==8.0.15
487487
# via
488488
# -c requirements/constraints.txt
489489
# -r requirements/edx/kernel.in

requirements/edx/development.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ edx-drf-extensions==10.6.0
756756
# enterprise-integrated-channels
757757
# openedx-authz
758758
# openedx-core
759-
edx-enterprise==8.0.14
759+
edx-enterprise==8.0.15
760760
# via
761761
# -c requirements/constraints.txt
762762
# -r requirements/edx/doc.txt

requirements/edx/doc.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ edx-drf-extensions==10.6.0
573573
# enterprise-integrated-channels
574574
# openedx-authz
575575
# openedx-core
576-
edx-enterprise==8.0.14
576+
edx-enterprise==8.0.15
577577
# via
578578
# -c requirements/constraints.txt
579579
# -r requirements/edx/base.txt

requirements/edx/testing.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,7 @@ edx-drf-extensions==10.6.0
589589
# enterprise-integrated-channels
590590
# openedx-authz
591591
# openedx-core
592-
edx-enterprise==8.0.14
592+
edx-enterprise==8.0.15
593593
# via
594594
# -c requirements/constraints.txt
595595
# -r requirements/edx/base.txt

0 commit comments

Comments
 (0)