Skip to content

Commit 55cadea

Browse files
Merge pull request #775 from jono-booth/jono-booth/ENT-10570_expired_credit_requests
ENT-10570 Expire credit requests when an assignment expires
2 parents bb7eea2 + 4cec3f7 commit 55cadea

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

enterprise_access/apps/content_assignments/api.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
)
2424
from enterprise_access.apps.core.models import User
2525
from enterprise_access.apps.subsidy_access_policy.content_metadata_api import get_and_cache_content_metadata
26+
from enterprise_access.apps.subsidy_request.constants import SubsidyRequestStates
2627
from enterprise_access.utils import (
2728
chunks,
2829
get_automatic_expiration_date_and_reason,
@@ -996,7 +997,16 @@ def expire_assignment(
996997
if automatic_expiration_reason == AssignmentAutomaticExpiredReason.NINETY_DAYS_PASSED:
997998
assignment.clear_pii()
998999

1000+
credit_request = getattr(assignment, 'credit_request', None)
1001+
1002+
if credit_request:
1003+
logger.info('Modifying credit request %s to expired', credit_request.uuid)
1004+
credit_request.state = SubsidyRequestStates.EXPIRED
1005+
credit_request.save()
1006+
9991007
assignment.save()
1000-
send_assignment_automatically_expired_email.delay(assignment.uuid)
1008+
1009+
if not credit_request:
1010+
send_assignment_automatically_expired_email.delay(assignment.uuid)
10011011

10021012
return automatic_expiration_reason

enterprise_access/apps/content_assignments/tests/test_api.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
from enterprise_access.apps.core.tests.factories import UserFactory
1212
from enterprise_access.apps.subsidy_access_policy.tests.factories import AssignedLearnerCreditAccessPolicyFactory
13+
from enterprise_access.apps.subsidy_request.constants import SubsidyRequestStates
14+
from enterprise_access.apps.subsidy_request.tests.factories import LearnerCreditRequestFactory
1315

1416
from ..api import (
1517
AllocationException,
@@ -1124,3 +1126,54 @@ def test_expire_assignments_with_expired_subsidy(
11241126
self.assertEqual(assignment.learner_email, 'larry@stooges.com')
11251127
self.assertEqual(assignment.lms_user_id, 12345)
11261128
mock_expired_email.delay.assert_called_once_with(assignment.uuid)
1129+
1130+
@ddt.data(
1131+
*LearnerContentAssignmentStateChoices.EXPIRABLE_STATES
1132+
)
1133+
@mock.patch('enterprise_access.apps.content_assignments.api.send_assignment_automatically_expired_email')
1134+
def test_expire_credit_request_when_assigment_expires(self, expirable_assignment_state, mock_expired_email):
1135+
"""
1136+
Tests that we expire any open credit requests when we expire an assignment.
1137+
"""
1138+
course_key = 'edX+DemoX'
1139+
course_run_key = 'course-v1:edX+DemoX+T2024'
1140+
content_key = course_key
1141+
1142+
assignment = LearnerContentAssignmentFactory.create(
1143+
assignment_configuration=self.assignment_configuration,
1144+
content_key=content_key,
1145+
parent_content_key=content_key,
1146+
is_assigned_course_run=True,
1147+
state=expirable_assignment_state,
1148+
learner_email='larry@stooges.com',
1149+
lms_user_id=12345,
1150+
)
1151+
1152+
credit_request = LearnerCreditRequestFactory.create(
1153+
assignment=assignment
1154+
)
1155+
1156+
assignment.add_successful_notified_action()
1157+
1158+
# create non-expired content metadata
1159+
mock_content_metadata = self.mock_content_metadata(
1160+
content_key=content_key,
1161+
course_run_key=course_run_key,
1162+
enroll_by_date=delta_t(days=100, as_string=True),
1163+
)
1164+
1165+
# set a policy-subsidy expiration date in the past
1166+
mock_subsidy_record = {'expiration_datetime': delta_t(days=-1, as_string=True)}
1167+
with mock.patch.object(self.policy, 'subsidy_record', return_value=mock_subsidy_record):
1168+
expire_assignment(
1169+
assignment,
1170+
content_metadata=mock_content_metadata,
1171+
modify_assignment=True,
1172+
)
1173+
1174+
credit_request.refresh_from_db()
1175+
assignment.refresh_from_db()
1176+
1177+
self.assertEqual(assignment.state, LearnerContentAssignmentStateChoices.EXPIRED)
1178+
self.assertEqual(credit_request.state, SubsidyRequestStates.EXPIRED)
1179+
mock_expired_email.delay.assert_not_called()

0 commit comments

Comments
 (0)