corrected another enrollment edge case

This commit is contained in:
Albert St. Aubin
2018-03-09 09:48:33 -05:00
parent 7acff0a39e
commit bd9fedb27b
3 changed files with 33 additions and 2 deletions

View File

@@ -490,6 +490,33 @@ class EntitlementEnrollmentViewSetTest(ModuleStoreTestCase):
assert CourseEnrollment.is_enrolled(self.user, self.course.id)
assert course_entitlement.enrollment_course_run is not None
@patch("entitlements.api.v1.views.get_course_runs_for_course")
def test_user_already_enrolled_in_unpaid_mode(self, mock_get_course_runs):
course_entitlement = CourseEntitlementFactory.create(user=self.user, mode=CourseMode.VERIFIED)
mock_get_course_runs.return_value = self.return_values
url = reverse(
self.ENTITLEMENTS_ENROLLMENT_NAMESPACE,
args=[str(course_entitlement.uuid)]
)
CourseEnrollment.enroll(self.user, self.course.id, mode=CourseMode.AUDIT)
data = {
'course_run_id': str(self.course.id)
}
response = self.client.post(
url,
data=json.dumps(data),
content_type='application/json',
)
course_entitlement.refresh_from_db()
assert response.status_code == 201
assert CourseEnrollment.is_enrolled(self.user, self.course.id)
(enrolled_mode, is_active) = CourseEnrollment.enrollment_mode_for_user(self.user, self.course.id)
assert is_active and (enrolled_mode == course_entitlement.mode)
assert course_entitlement.enrollment_course_run is not None
@patch("entitlements.api.v1.views.get_course_runs_for_course")
def test_user_cannot_enroll_in_unknown_course_run_id(self, mock_get_course_runs):
fake_course_str = str(self.course.id) + 'fake'

View File

@@ -21,6 +21,7 @@ from openedx.core.djangoapps.catalog.utils import get_course_runs_for_course
from openedx.core.djangoapps.cors_csrf.authentication import SessionAuthenticationCrossDomainCsrf
from student.models import CourseEnrollment
from student.models import CourseEnrollmentException, AlreadyEnrolledError
from course_modes.models import CourseMode
log = logging.getLogger(__name__)
@@ -261,7 +262,10 @@ class EntitlementEnrollmentViewSet(viewsets.GenericViewSet):
enrollment = CourseEnrollment.get_enrollment(user, course_run_key)
if enrollment.mode == entitlement.mode:
entitlement.set_enrollment(enrollment)
# Else the User is already enrolled in another Mode and we should
elif enrollment.mode not in [mode.slug for mode in CourseMode.paid_modes_for_course(course_run_key)]:
enrollment.update_enrollment(mode=entitlement.mode)
entitlement.set_enrollment(enrollment)
# Else the User is already enrolled in another paid Mode and we should
# not do anything else related to Entitlements.
except CourseEnrollmentException:
message = (

View File

@@ -393,7 +393,7 @@ def get_fulfillable_course_runs_for_entitlement(entitlement, course_runs):
user=entitlement.user,
course_id=course_id
)
is_enrolled_in_mode = user_enrollment_mode == entitlement.mode
is_enrolled_in_mode = is_active and (user_enrollment_mode == entitlement.mode)
if is_course_run_entitlement_fulfillable(course_id, entitlement, search_time):
if (is_enrolled_in_mode and
entitlement.enrollment_course_run and