diff --git a/common/djangoapps/student/api.py b/common/djangoapps/student/api.py new file mode 100644 index 0000000000..2d372ed514 --- /dev/null +++ b/common/djangoapps/student/api.py @@ -0,0 +1,90 @@ +from django.contrib.auth import get_user_model +from django.conf import settings + +from student.models_api import create_manual_enrollment_audit as _create_manual_enrollment_audit +from student.models_api import get_course_enrollment as _get_course_enrollment +from student.models_api import ( + ENROLLED_TO_ENROLLED as _ENROLLED_TO_ENROLLED, + ENROLLED_TO_UNENROLLED as _ENROLLED_TO_UNENROLLED, + UNENROLLED_TO_ENROLLED as _UNENROLLED_TO_ENROLLED, + UNENROLLED_TO_UNENROLLED as _UNENROLLED_TO_UNENROLLED, + UNENROLLED_TO_ALLOWEDTOENROLL as _UNENROLLED_TO_ALLOWEDTOENROLL, + ALLOWEDTOENROLL_TO_ENROLLED as _ALLOWEDTOENROLL_TO_ENROLLED, + ALLOWEDTOENROLL_TO_UNENROLLED as _ALLOWEDTOENROLL_TO_UNENROLLED, + DEFAULT_TRANSITION_STATE as _DEFAULT_TRANSITION_STATE, +) +from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers + + +# This is done so that if these strings change within the app, we can keep exported constants the same +ENROLLED_TO_ENROLLED = _ENROLLED_TO_ENROLLED +ENROLLED_TO_UNENROLLED = _ENROLLED_TO_UNENROLLED +UNENROLLED_TO_ENROLLED = _UNENROLLED_TO_ENROLLED +UNENROLLED_TO_UNENROLLED = _UNENROLLED_TO_UNENROLLED +UNENROLLED_TO_ALLOWEDTOENROLL = _UNENROLLED_TO_ALLOWEDTOENROLL +ALLOWEDTOENROLL_TO_ENROLLED = _ALLOWEDTOENROLL_TO_ENROLLED +ALLOWEDTOENROLL_TO_UNENROLLED = _ALLOWEDTOENROLL_TO_UNENROLLED +DEFAULT_TRANSITION_STATE = _DEFAULT_TRANSITION_STATE + +TRANSITION_STATES = ( + ENROLLED_TO_ENROLLED, + ENROLLED_TO_UNENROLLED, + UNENROLLED_TO_ENROLLED, + UNENROLLED_TO_UNENROLLED, + UNENROLLED_TO_ALLOWEDTOENROLL, + ALLOWEDTOENROLL_TO_ENROLLED, + ALLOWEDTOENROLL_TO_UNENROLLED, + DEFAULT_TRANSITION_STATE, +) + +MANUAL_ENROLLMENT_ROLE_CHOICES = configuration_helpers.get_value( + 'MANUAL_ENROLLMENT_ROLE_CHOICES', + settings.MANUAL_ENROLLMENT_ROLE_CHOICES +) + + +def create_manual_enrollment_audit( + enrolled_by, + user_email, + transition_state, + reason, + course_run_key=None, + role=None +): + """ + Creates an audit item for a manual enrollment. + Parameters: + enrolled_by: of the person that is manually enrolling + user_email: email of the user being enrolled + transition_state: state of enrollment transition state from _TRANSITIONS_STATES + reason: Reason why user was manually enrolled + course_run_key: Used to link the audit enrollment to the actual enrollment + role: role of the enrolled user from MANUAL_ENROLLMENT_ROLE_CHOICES + + Note: We purposefully *exclude* passing items like CourseEnrollment objects to prevent callers from needed to + know about model level code. + """ + if role and role not in MANUAL_ENROLLMENT_ROLE_CHOICES: + raise ValueError("Role `{}` not in allowed roles: `{}".format(role, MANUAL_ENROLLMENT_ROLE_CHOICES)) + if transition_state not in TRANSITION_STATES: + raise ValueError("State `{}` not in allow states: `{}`".format(transition_state, TRANSITION_STATES)) + + User = get_user_model() + try: + enrolled_user = User.objects.get(email=user_email) + except User.DoesNotExist: + enrolled_user = None + + if enrolled_user and course_run_key: + enrollment = _get_course_enrollment(enrolled_user, course_run_key) + else: + enrollment = None + + _create_manual_enrollment_audit( + enrolled_by, + user_email, + transition_state, + reason, + enrollment, + role + ) diff --git a/common/djangoapps/student/models_api.py b/common/djangoapps/student/models_api.py new file mode 100644 index 0000000000..e093b0b7f0 --- /dev/null +++ b/common/djangoapps/student/models_api.py @@ -0,0 +1,48 @@ +""" +Provides Python APIs exposed from Student models. +""" + +from student.models import CourseEnrollment as _CourseEnrollment +from student.models import ManualEnrollmentAudit as _ManualEnrollmentAudit +from student.models import ( + ENROLLED_TO_ENROLLED as _ENROLLED_TO_ENROLLED, + ENROLLED_TO_UNENROLLED as _ENROLLED_TO_UNENROLLED, + UNENROLLED_TO_ENROLLED as _UNENROLLED_TO_ENROLLED, + UNENROLLED_TO_UNENROLLED as _UNENROLLED_TO_UNENROLLED, + UNENROLLED_TO_ALLOWEDTOENROLL as _UNENROLLED_TO_ALLOWEDTOENROLL, + ALLOWEDTOENROLL_TO_ENROLLED as _ALLOWEDTOENROLL_TO_ENROLLED, + ALLOWEDTOENROLL_TO_UNENROLLED as _ALLOWEDTOENROLL_TO_UNENROLLED, + DEFAULT_TRANSITION_STATE as _DEFAULT_TRANSITION_STATE, +) + +# This is done so that if these strings change within the app, we can keep exported constants the same +ENROLLED_TO_ENROLLED = _ENROLLED_TO_ENROLLED +ENROLLED_TO_UNENROLLED = _ENROLLED_TO_UNENROLLED +UNENROLLED_TO_ENROLLED = _UNENROLLED_TO_ENROLLED +UNENROLLED_TO_UNENROLLED = _UNENROLLED_TO_UNENROLLED +UNENROLLED_TO_ALLOWEDTOENROLL = _UNENROLLED_TO_ALLOWEDTOENROLL +ALLOWEDTOENROLL_TO_ENROLLED = _ALLOWEDTOENROLL_TO_ENROLLED +ALLOWEDTOENROLL_TO_UNENROLLED = _ALLOWEDTOENROLL_TO_UNENROLLED +DEFAULT_TRANSITION_STATE = _DEFAULT_TRANSITION_STATE + + +def create_manual_enrollment_audit( + enrolled_by, + user_email, + state_transition, + reason, + course_enrollment, + role +): + _ManualEnrollmentAudit.create_manual_enrollment_audit( + user=enrolled_by, + email=user_email, + state_transition=state_transition, + reason=reason, + enrollment=course_enrollment, + role=role, + ) + + +def get_course_enrollment(user, course_run_key): + return _CourseEnrollment.get_enrollment(user, course_run_key)