Skip to content

Commit 320d74f

Browse files
authored
fix: raise error on enrollment retry failure (#3016)
1 parent 1d4fc19 commit 320d74f

File tree

3 files changed

+21
-27
lines changed

3 files changed

+21
-27
lines changed

courses/api.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
from openedx.exceptions import (
7878
EdxApiEnrollErrorException,
7979
NoEdxApiAuthError,
80+
OpenEdxUserMissingError,
8081
UnknownEdxApiEnrollException,
8182
)
8283

@@ -186,6 +187,7 @@ def _enroll_learner_into_associated_programs():
186187
except (
187188
UnknownEdxApiEnrollException,
188189
NoEdxApiAuthError,
190+
OpenEdxUserMissingError,
189191
RequestsConnectionError,
190192
EdxApiEnrollErrorException,
191193
HTTPError,

openedx/api.py

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,15 @@ def enroll_in_edx_course_runs(
10471047

10481048
username = user.edx_username
10491049

1050+
try:
1051+
created_user, _ = repair_faulty_edx_user(user)
1052+
if created_user is False:
1053+
msg = f"User {user.edx_username} does not exist in OpenEdX and could not be created"
1054+
raise OpenEdxUserMissingError(msg) # noqa: TRY301
1055+
except Exception as exc:
1056+
msg = f"Failed to verify/create user {user.edx_username} in OpenEdX"
1057+
raise OpenEdxUserMissingError(msg) from exc
1058+
10501059
results = []
10511060
for course_run in course_runs:
10521061
try:
@@ -1069,33 +1078,13 @@ def enroll_in_edx_course_runs(
10691078
)
10701079
results.append(enrollment)
10711080
except HTTPError as exc: # noqa: PERF203
1072-
if exc.response.status_code == 406: # noqa: PLR2004
1073-
log.warning(
1074-
"User %s does not exist in edX, attempting to create user.",
1075-
user.edx_username,
1076-
)
1077-
# If the user doesn't exist, we need to create them first
1078-
try:
1079-
created_user, _ = repair_faulty_edx_user(user)
1080-
if created_user:
1081-
enrollment = edx_client.enrollments.create_student_enrollment(
1082-
course_run.courseware_id,
1083-
mode=mode,
1084-
username=username,
1085-
force_enrollment=force_enrollment,
1086-
)
1087-
results.append(enrollment)
1088-
except Exception as exc:
1089-
log.exception("Failed to create user %s in edX.", user.edx_username)
1090-
raise UnknownEdxApiEnrollException(user, course_run, exc) from exc
1091-
else:
1092-
log.exception(
1093-
"Failed to enroll user %s in course run %s with mode %s.",
1094-
user.edx_username,
1095-
course_run.courseware_id,
1096-
mode,
1097-
)
1098-
raise EdxApiEnrollErrorException(user, course_run, exc) from exc
1081+
log.error( # noqa: TRY400
1082+
"Failed to enroll user %s in course run %s with mode %s.",
1083+
user.edx_username,
1084+
course_run.courseware_id,
1085+
mode,
1086+
)
1087+
raise EdxApiEnrollErrorException(user, course_run, exc) from exc
10991088
except Exception as exc: # pylint: disable=broad-except
11001089
raise UnknownEdxApiEnrollException(user, course_run, exc) from exc
11011090
return results

openedx/api_test.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,7 @@ def test_enroll_in_edx_course_runs(settings, mocker, user, has_edx_username):
654654
)
655655
mocker.patch("openedx.api.get_edx_api_client", return_value=mock_client)
656656
mocker.patch("openedx.api.get_edx_api_service_client", return_value=mock_client)
657+
mocker.patch("openedx.api.repair_faulty_edx_user", return_value=(None, None))
657658
course_runs = CourseRunFactory.build_batch(2)
658659

659660
# Test to make sure reconcile_edx_username runs as expected.
@@ -696,6 +697,7 @@ def test_enroll_api_fail(mocker, user):
696697
)
697698
mocker.patch("openedx.api.get_edx_api_client", return_value=mock_client)
698699
mocker.patch("openedx.api.get_edx_api_service_client", return_value=mock_client)
700+
mocker.patch("openedx.api.repair_faulty_edx_user", return_value=(None, None))
699701
course_run = CourseRunFactory.build()
700702

701703
with pytest.raises(EdxApiEnrollErrorException):
@@ -713,6 +715,7 @@ def test_enroll_pro_unknown_fail(settings, mocker, user):
713715
side_effect=ValueError("Unexpected error")
714716
)
715717
mocker.patch("openedx.api.get_edx_api_client", return_value=mock_client)
718+
mocker.patch("openedx.api.repair_faulty_edx_user", return_value=(None, None))
716719
course_run = CourseRunFactory.build()
717720

718721
with pytest.raises(UnknownEdxApiEnrollException):

0 commit comments

Comments
 (0)