feat: remove enterprise enrollment imports and adds CourseEnrollmentViewStarted filter#306
Conversation
There was a problem hiding this comment.
Pull request overview
This PR decouples enterprise-specific enrollment side effects from the LMS enrollment API endpoint by removing direct enterprise_support dependencies in EnrollmentView, and instead relying on an updated edx-enterprise version (presumably containing the new filter/pipeline integration) to handle enterprise post-enrollment processing.
Changes:
- Bump
edx-enterprisefrom8.0.14to8.0.16across constraints and edx requirement sets. - Remove
openedx.features.enterprise_support.apiimports and thelinked_enterprise_customerconditional enterprise enrollment/consent block fromEnrollmentView.post. - Remove the enterprise-mocking test mixin usage and the enterprise enrollment test that depended on HTTP mocking.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| requirements/edx/base.txt | Bumps edx-enterprise pin to align the platform with the new enterprise-side pipeline behavior. |
| requirements/edx/development.txt | Updates dev requirements to the same edx-enterprise version. |
| requirements/edx/doc.txt | Updates doc requirements to the same edx-enterprise version. |
| requirements/edx/testing.txt | Updates testing requirements to the same edx-enterprise version. |
| requirements/constraints.txt | Updates the global constraint for edx-enterprise to 8.0.16. |
| openedx/core/djangoapps/enrollments/views.py | Removes direct enterprise service calls during enrollment POST handling. |
| openedx/core/djangoapps/enrollments/tests/test_views.py | Removes enterprise-specific test scaffolding and the enterprise enrollment integration test. |
Comments suppressed due to low confidence (1)
openedx/core/djangoapps/enrollments/views.py:775
- The POST enrollment API used to read
linked_enterprise_customerand trigger enterprise enrollment/consent side effects when called with API-key permissions. With this block removed, requests that still sendlinked_enterprise_customerwill now be silently ignored, which is a behavior change and can break existing enterprise-worker integrations.
To make the change safer, consider either (a) supporting backwards compatibility by mapping linked_enterprise_customer to the enterprise_uuid path (or otherwise passing it through to the new edx-enterprise post-processor), or (b) explicitly rejecting/deprecating the parameter with a clear 4xx response so clients fail fast instead of succeeding without the intended enterprise linkage.
enrollment_attributes = request.data.get("enrollment_attributes")
force_enrollment = request.data.get("force_enrollment")
# Check if the force enrollment status is None or a Boolean
if force_enrollment is not None and not isinstance(force_enrollment, bool):
return Response(
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.
Comments suppressed due to low confidence (1)
openedx/core/djangoapps/enrollments/tests/test_views.py:1247
- Enterprise enrollment behavior previously had a dedicated test. With the enterprise-specific code moved behind CourseEnrollmentViewStarted, there should be replacement coverage to (1) assert the filter is invoked when linked_enterprise_customer is present and (2) verify PreventEnrollment produces the expected HTTP 400 response. Otherwise regressions in this integration point may go unnoticed.
def test_enrollment_attributes_always_written(self):
""" Enrollment attributes should always be written, regardless of whether
the enrollment is being created or updated.
"""
course_key = self.course.id
da62878 to
31ca3d4
Compare
521a53e to
82533f2
Compare
8ad0ccf to
1568606
Compare
9084d93 to
cdc2980
Compare
d6319c2 to
a895f55
Compare
a895f55 to
5de7dd6
Compare
5de7dd6 to
65e7ee9
Compare
65e7ee9 to
686183f
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
openedx/core/djangoapps/enrollments/views.py:783
erroris undefined here (will raiseNameError), and translatingPreventEnrollmentintoCourseEnrollmentErrorcauses the view to return HTTP 400 via theexcept CourseEnrollmentErrorhandler. To preserve the intended semantics (and match existing filter handling incommon/djangoapps/student/models/course_enrollment.py:731-732), raiseEnrollmentNotAllowedusing the caught exception message instead.
except CourseEnrollmentViewStarted.PreventEnrollment as exc:
raise CourseEnrollmentError(str(error)) from exc
686183f to
aa2bafa
Compare
aa2bafa to
6b209cd
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
openedx/core/djangoapps/enrollments/views.py:783
PreventEnrollmentis converted intoCourseEnrollmentError, which is handled later as a generic enrollment error and returned as HTTP 400 with a generic message. That contradicts the intended semantics (and the new tests) where a pipeline step should be able to block enrollment with HTTP 403 and preserve the reason. UseEnrollmentNotAllowedhere (consistent withcommon/djangoapps/student/models/course_enrollment.py:732) so the existingexcept EnrollmentNotAllowedblock returns 403 with the filter message.
# Filter hook that allows plugins (e.g., Enterprise) to run enrollment-related logic
# and optionally prevent enrollment via CourseEnrollmentViewStarted.PreventEnrollment.
try:
# .. filter_implemented_name: CourseEnrollmentViewStarted
# .. filter_type: org.openedx.learning.course.enrollment.view.started.v1
CourseEnrollmentViewStarted.run_filter(
user=user,
course_key=course_id,
requester_is_backend_service=has_api_key_permissions,
)
except CourseEnrollmentViewStarted.PreventEnrollment as exc:
raise CourseEnrollmentError(str(exc)) from exc
…iewStarted filter
6b209cd to
540e462
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (1)
openedx/core/djangoapps/enrollments/views.py:783
CourseEnrollmentViewStarted.PreventEnrollmentis currently converted intoCourseEnrollmentError, which the view maps to a generic HTTP 400 response. Elsewhere in the codebase,PreventEnrollmentis translated intoEnrollmentNotAllowed(e.g.,common/djangoapps/student/models/course_enrollment.py:731-732), which this view already renders as HTTP 403 with the specific message. To keep semantics consistent (and to avoid losing the filter-provided reason), raiseEnrollmentNotAllowedhere instead.
except CourseEnrollmentViewStarted.PreventEnrollment as exc:
raise CourseEnrollmentError(str(exc)) from exc
Description
This PR removes those enterprise imports and the conditional block from the enrollment view, then runs the CourseEnrollmentViewStarted filter to handle the enterprise-specific enrollment logic seperately and outside of edx-platform. This is part of an ongoing initiative to leverage openedx-filters to allow enterprise to customize logic and remove it from edx-platform code.
ENT-11570
Supporting information
This is the openedx-filters PR
This is related edx-enterprise PR
And this is the corresponding openedx-platform PR (in draft mode rn)
Testing instructions
Testing instructions in the edx-enterprise PR.
Deadline
"None" if there's no rush, or provide a specific date or event (and reason) if there is one.
Other information
Include anything else that will help reviewers and consumers understand the change.