Skip to content

Commit

Permalink
1740: Re-enroll learner into program (#1746)
Browse files Browse the repository at this point in the history
  • Loading branch information
collinpreston authored Jul 14, 2023
1 parent 9420012 commit 34a958b
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 2 deletions.
20 changes: 18 additions & 2 deletions courses/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,23 @@ def create_run_enrollments(
def send_enrollment_emails():
subscribe_edx_course_emails.delay(enrollment.id)

def _enroll_learner_into_associated_programs():
"""
Enrolls the learner into all programs for which the course they are enrolling into
is associated as a requirement or elective. If a program enrollment already exists
then the change_status of that program_enrollment is checked to ensure it equals None.
"""
for program in run.course.programs:
program_enrollment, _ = ProgramEnrollment.objects.get_or_create(
user=user,
program=program,
defaults=dict(
change_status=None,
),
)
if program_enrollment.change_status is not None:
program_enrollment.reactivate_and_save()

try:
enroll_in_edx_course_runs(
user,
Expand Down Expand Up @@ -277,8 +294,7 @@ def send_enrollment_emails():
),
)

for program in run.course.programs:
ProgramEnrollment.objects.get_or_create(user=user, program=program)
_enroll_learner_into_associated_programs()

if not created:
enrollment_mode_changed = mode != enrollment.enrollment_mode
Expand Down
28 changes: 28 additions & 0 deletions courses/api_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from courses.constants import (
ENROLL_CHANGE_STATUS_DEFERRED,
ENROLL_CHANGE_STATUS_REFUNDED,
ENROLL_CHANGE_STATUS_UNENROLLED,
)
from courses.factories import (
CourseFactory,
Expand Down Expand Up @@ -1606,3 +1607,30 @@ def test_generate_program_certificate_failure_not_all_passed_nested_elective_sti
result = generate_program_certificate(user=user, program=program)
assert result == (None, False)
assert len(ProgramCertificate.objects.all()) == 0


def test_program_enrollment_unenrollment_re_enrollment(
mocker, user, program_with_empty_requirements
):
"""
create_run_enrollments should always enroll a learner into a program even
if the learner has previously unenrolled from the program.
"""

# Create a program_enrollment that mocks what exists after a learner unenrolls from
# a program.
ProgramEnrollmentFactory(
user=user,
program=program_with_empty_requirements,
change_status=ENROLL_CHANGE_STATUS_UNENROLLED,
)
course_run = CourseRunFactory.create()
program_with_empty_requirements.add_requirement(course_run.course)
mocker.patch("courses.api.enroll_in_edx_course_runs")
mocker.patch("courses.api.mail_api.send_course_run_enrollment_email")
mocker.patch("courses.tasks.subscribe_edx_course_emails.delay")

create_run_enrollments(user, runs=[course_run], mode=EDX_ENROLLMENT_VERIFIED_MODE)
assert ProgramEnrollment.objects.filter(
user=user, program=program_with_empty_requirements, change_status=None
).exists()

0 comments on commit 34a958b

Please sign in to comment.