From 7edbe25206965dba098beab48952b9b684540ea4 Mon Sep 17 00:00:00 2001 From: Hamzah Ullah Date: Tue, 8 Sep 2026 12:15:18 -0400 Subject: [PATCH] feat: replace enterprise support enrollment imports with filter call Removes the direct openedx.features.enterprise_support imports and the _enterprise_course_enrollments_by_course_id helper from EnrollmentSupportListView, replacing them with a call to the SupportEnrollmentDataRequested openedx-filter. ENT-11574 --- lms/djangoapps/support/tests/test_views.py | 68 ++++++--------------- lms/djangoapps/support/views/enrollments.py | 43 +------------ 2 files changed, 22 insertions(+), 89 deletions(-) diff --git a/lms/djangoapps/support/tests/test_views.py b/lms/djangoapps/support/tests/test_views.py index c0a1fc1740ee..43af9358e566 100644 --- a/lms/djangoapps/support/tests/test_views.py +++ b/lms/djangoapps/support/tests/test_views.py @@ -64,16 +64,6 @@ from openedx.core.djangoapps.oauth_dispatch.tests import factories from openedx.features.content_type_gating.models import ContentTypeGatingConfig from openedx.features.course_duration_limits.models import CourseDurationLimitConfig -from openedx.features.enterprise_support.api import enterprise_is_enabled -from openedx.features.enterprise_support.tests.factories import ( - EnterpriseCourseEnrollmentFactory, - EnterpriseCustomerUserFactory -) - -try: - from consent.models import DataSharingConsent -except ImportError: # pragma: no cover - pass class SupportViewTestCase(ModuleStoreTestCase): @@ -377,7 +367,6 @@ def test_get_enrollments(self, search_string_type): }, data[0]) assert {CourseMode.VERIFIED, CourseMode.AUDIT, CourseMode.HONOR, CourseMode.NO_ID_PROFESSIONAL_MODE, CourseMode.PROFESSIONAL, CourseMode.CREDIT_MODE} == {mode['slug'] for mode in data[0]['course_modes']} - assert 'enterprise_course_enrollments' not in data[0] assert data[0]['order_number'] == '' assert data[0]['source_system'] == '' @@ -418,52 +407,35 @@ def test_order_source_system_information(self): assert len(data) == 1 assert data[0]['source_system'] == 'commercetools' - @override_settings(FEATURES=dict(ENABLE_ENTERPRISE_INTEGRATION=True)) - @enterprise_is_enabled() - def test_get_enrollments_enterprise_enabled(self): + @patch('lms.djangoapps.support.views.enrollments.SupportEnrollmentDataRequested.run_filter') + def test_get_enrollments_augmented_by_pipeline_step(self, mock_run_filter): + """ + Data a configured pipeline step adds to an enrollment dict is passed through in the + response. This view only needs to verify it wires the filter's return value through + correctly — pipeline step behavior itself is covered by that step's own test suite. + """ + course_id = str(self.course.id) + + def fake_run_filter(enrollments_data, user): + for enrollment in enrollments_data: + enrollment['foo_extra_data'] = "I'm a little teapot." + return enrollments_data, user + + mock_run_filter.side_effect = fake_run_filter + url = reverse( 'support:enrollment_list', kwargs={'username_or_email': self.student.username} ) - - enterprise_customer_user = EnterpriseCustomerUserFactory( - user_id=self.student.id - ) - enterprise_course_enrollment = EnterpriseCourseEnrollmentFactory( - course_id=self.course.id, - enterprise_customer_user=enterprise_customer_user - ) - data_sharing_consent = DataSharingConsent( - course_id=self.course.id, - enterprise_customer=enterprise_customer_user.enterprise_customer, - username=self.student.username, - granted=True - ) - data_sharing_consent.save() - response = self.client.get(url) assert response.status_code == 200 data = json.loads(response.content.decode('utf-8')) assert len(data) == 1 - enterprise_course_enrollments_data = data[0]['enterprise_course_enrollments'] - assert len(enterprise_course_enrollments_data) == 1 - expected = { - 'course_id': str(enterprise_course_enrollment.course_id), - 'enterprise_customer_name': enterprise_customer_user.enterprise_customer.name, - 'enterprise_customer_user_id': enterprise_customer_user.id, - 'license': None, - 'saved_for_later': enterprise_course_enrollment.saved_for_later, - 'data_sharing_consent': { - 'username': self.student.username, - 'enterprise_customer_uuid': str(enterprise_customer_user.enterprise_customer_id), - 'exists': data_sharing_consent.exists, - 'consent_provided': data_sharing_consent.granted, - 'consent_required': data_sharing_consent.consent_required(), - 'course_id': str(enterprise_course_enrollment.course_id), - } - } - assert enterprise_course_enrollments_data[0] == expected + _, call_kwargs = mock_run_filter.call_args + assert call_kwargs['user'] == self.student + assert call_kwargs['enrollments_data'][0]['course_id'] == course_id + assert data[0]['foo_extra_data'] == "I'm a little teapot." @ddt.data( (True, 'Self Paced'), diff --git a/lms/djangoapps/support/views/enrollments.py b/lms/djangoapps/support/views/enrollments.py index 0e469ec8de78..ab8c6ae0c259 100644 --- a/lms/djangoapps/support/views/enrollments.py +++ b/lms/djangoapps/support/views/enrollments.py @@ -2,7 +2,6 @@ Support tool for changing course enrollments. """ import logging -from collections import defaultdict import markupsafe from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user @@ -14,6 +13,7 @@ from django.views.generic import View from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey +from openedx_filters.learning.filters import SupportEnrollmentDataRequested from rest_framework.generics import GenericAPIView from common.djangoapps.course_modes.models import CourseMode @@ -34,12 +34,6 @@ from openedx.core.djangoapps.enrollments.api import get_enrollments, get_enrollment_attributes, update_enrollment from openedx.core.djangoapps.enrollments.errors import CourseModeNotFoundError from openedx.core.djangoapps.enrollments.serializers import ModeSerializer -from openedx.features.enterprise_support.api import ( - enterprise_enabled, - get_data_sharing_consents, - get_enterprise_course_enrollments -) -from openedx.features.enterprise_support.serializers import EnterpriseCourseEnrollmentSerializer logger = logging.getLogger(__name__) @@ -71,35 +65,6 @@ class EnrollmentSupportListView(GenericAPIView): # does not specify a serializer class. exclude_from_schema = True - def _enterprise_course_enrollments_by_course_id(self, user): - """ - Returns a dict containing enterprise course enrollments data with - course ids as keys. - """ - enterprise_course_enrollments = get_enterprise_course_enrollments(user) - data_sharing_consents_for_user = get_data_sharing_consents(user) - - enterprise_enrollments_by_course_id = defaultdict(list) - consent_by_course_and_enterprise_customer_id = {} - - # Get data sharing consent for each enterprise enrollment - for consent in data_sharing_consents_for_user: - key = f'{consent.course_id}-{consent.enterprise_customer_id}' - consent_by_course_and_enterprise_customer_id[key] = consent.serialize() - - for enterprise_course_enrollment in enterprise_course_enrollments: - serialized_enterprise_course_enrollment = EnterpriseCourseEnrollmentSerializer( - enterprise_course_enrollment - ).data - course_id = enterprise_course_enrollment.course_id - enterprise_customer_id = enterprise_course_enrollment.enterprise_customer_user.enterprise_customer_id - key = f'{course_id}-{enterprise_customer_id}' - consent = consent_by_course_and_enterprise_customer_id.get(key) - serialized_enterprise_course_enrollment['data_sharing_consent'] = consent - enterprise_enrollments_by_course_id[course_id].append(serialized_enterprise_course_enrollment) - - return enterprise_enrollments_by_course_id - @method_decorator(require_support_permission) def get(self, request, username_or_email): """ @@ -127,11 +92,7 @@ def get(self, request, username_or_email): # Add manual enrollment history, if it exists enrollment['manual_enrollment'] = self.manual_enrollment_data(enrollment, course_key) - if enterprise_enabled(): - enterprise_enrollments_by_course_id = self._enterprise_course_enrollments_by_course_id(user) - for enrollment in enrollments: - enterprise_course_enrollments = enterprise_enrollments_by_course_id.get(enrollment['course_id'], []) - enrollment['enterprise_course_enrollments'] = enterprise_course_enrollments + enrollments, _ = SupportEnrollmentDataRequested.run_filter(enrollments_data=enrollments, user=user) return JsonResponse(enrollments)