Merge pull request #17654 from edx/aj/LEARNER-4484

correct check for enrollment
This commit is contained in:
Albert (AJ) St. Aubin
2018-03-09 12:14:03 -05:00
committed by GitHub
3 changed files with 39 additions and 4 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

@@ -389,13 +389,17 @@ def get_fulfillable_course_runs_for_entitlement(entitlement, course_runs):
search_time = datetime.datetime.now(UTC)
for course_run in course_runs:
course_id = CourseKey.from_string(course_run.get('key'))
is_enrolled = CourseEnrollment.is_enrolled(entitlement.user, course_id)
(user_enrollment_mode, is_active) = CourseEnrollment.enrollment_mode_for_user(
user=entitlement.user,
course_id=course_id
)
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 and
if (is_enrolled_in_mode and
entitlement.enrollment_course_run and
course_id == entitlement.enrollment_course_run.course_id):
enrollable_sessions.append(course_run)
elif not is_enrolled:
elif not is_enrolled_in_mode:
enrollable_sessions.append(course_run)
enrollable_sessions.sort(key=lambda session: session.get('start'))