diff --git a/common/djangoapps/entitlements/api/v1/tests/test_views.py b/common/djangoapps/entitlements/api/v1/tests/test_views.py index 03fc7dddff..1585b4c4f6 100644 --- a/common/djangoapps/entitlements/api/v1/tests/test_views.py +++ b/common/djangoapps/entitlements/api/v1/tests/test_views.py @@ -156,6 +156,38 @@ class EntitlementViewSetTest(ModuleStoreTestCase): assert course_entitlement.enrollment_course_run == enrollment assert results == CourseEntitlementSerializer(course_entitlement).data + @patch("entitlements.api.v1.views.get_course_runs_for_course") + def test_add_entitlement_inactive_audit_enrollment(self, mock_get_course_runs): + """ + Verify that if an entitlement is added for a user, if the user has one upgradeable enrollment + that enrollment is upgraded to the mode of the entitlement and linked to the entitlement. + """ + course_uuid = uuid.uuid4() + entitlement_data = self._get_data_set(self.user, str(course_uuid)) + mock_get_course_runs.return_value = [{'key': str(self.course.id)}] + + # Add an audit course enrollment for user. + enrollment = CourseEnrollment.enroll(self.user, self.course.id, mode=CourseMode.AUDIT) + enrollment.update_enrollment(is_active=False) + response = self.client.post( + self.entitlements_list_url, + data=json.dumps(entitlement_data), + content_type='application/json', + ) + assert response.status_code == 201 + results = response.data + + course_entitlement = CourseEntitlement.objects.get( + user=self.user, + course_uuid=course_uuid + ) + # Assert that enrollment mode is now verified + enrollment_mode, enrollment_active = CourseEnrollment.enrollment_mode_for_user(self.user, self.course.id) + assert enrollment_mode == CourseMode.AUDIT + assert enrollment_active is False + assert course_entitlement.enrollment_course_run is None + assert results == CourseEntitlementSerializer(course_entitlement).data + def test_non_staff_get_select_entitlements(self): not_staff_user = UserFactory() self.client.login(username=not_staff_user.username, password=TEST_PASSWORD) diff --git a/common/djangoapps/entitlements/api/v1/views.py b/common/djangoapps/entitlements/api/v1/views.py index a5fdfe22a0..52aab7faf9 100644 --- a/common/djangoapps/entitlements/api/v1/views.py +++ b/common/djangoapps/entitlements/api/v1/views.py @@ -77,7 +77,7 @@ class EntitlementViewSet(viewsets.ModelViewSet): enrollment for enrollment in user_run_enrollments - if enrollment.upgrade_deadline and enrollment.upgrade_deadline > timezone.now() + if enrollment.is_active and enrollment.upgrade_deadline and enrollment.upgrade_deadline > timezone.now() ] # if there is only one upgradeable enrollment, convert it from audit to the entitlement.mode @@ -85,14 +85,26 @@ class EntitlementViewSet(viewsets.ModelViewSet): # (i.e. multiple upgradeable enrollments or no available upgradeable enrollment), dont enroll if len(upgradeable_enrollments) == 1: enrollment = upgradeable_enrollments[0] - log.info('Upgrading enrollment [%s] from audit to [%s] while adding entitlement for user [%s] for course [%s] ', enrollment, serializer.data.get('mode'), user.username, serializer.data.get('course_uuid')) + log.info( + 'Upgrading enrollment [%s] from %s to %s while adding entitlement for user [%s] for course [%s]', + enrollment, + enrollment.mode, + serializer.data.get('mode'), + user.username, + serializer.data.get('course_uuid') + ) enrollment.update_enrollment(mode=entitlement.mode) entitlement.set_enrollment(enrollment) else: - log.info('No enrollment upgraded while adding entitlement for user [%s] for course [%s] ', user.username, serializer.data.get('course_uuid')) + log.info( + 'No enrollment upgraded while adding entitlement for user [%s] for course [%s] ', + user.username, + serializer.data.get('course_uuid') + ) headers = self.get_success_headers(serializer.data) - # Note, the entitlement is re-serialized before getting added to the Response, so that the 'modified' date reflects changes that occur when upgrading enrollment. + # Note, the entitlement is re-serialized before getting added to the Response, + # so that the 'modified' date reflects changes that occur when upgrading enrollment. return Response(CourseEntitlementSerializer(entitlement).data, status=status.HTTP_201_CREATED, headers=headers) def retrieve(self, request, *args, **kwargs):