Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions enterprise_access/apps/api/serializers/subsidy_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,12 @@ class LearnerCreditRequestDeclineAllSerializer(serializers.Serializer): # pylin
required=True,
help_text="The UUID of the SubsidyAccessPolicy to filter requests by."
)
decline_reason = serializers.CharField(
required=False,
allow_blank=True,
allow_null=True,
help_text="Reason for declining all matching requests.",
)
Comment on lines +407 to +412

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ We should impose max_length=255. Better to fail validation and throw HTTP 400 than to bump against the database limit and raise HTTP 500.



# pylint: disable=abstract-method
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4625,6 +4625,32 @@ def test_decline_all_success(self, _mock_decline_notification_task):
self.assertEqual(len(results['declined']), 5)
self.assertEqual(len(results['non_declinable']), 0)

@mock.patch('enterprise_access.apps.subsidy_request.api.send_learner_credit_bnr_decline_notification_task')
def test_decline_all_forwards_decline_reason(self, _mock_decline_notification_task):
"""Test decline_all persists decline_reason on each declined request."""
self.set_jwt_cookie([{
'system_wide_role': SYSTEM_ENTERPRISE_ADMIN_ROLE,
'context': str(self.enterprise_customer_uuid_1)
}])

response = self.client.post(
reverse('api:v1:learner-credit-requests-decline-all'),
data={
'policy_uuid': str(self.policy.uuid),
'enterprise_customer_uuid': str(self.enterprise_customer_uuid_1),
'decline_reason': 'Budget constraints for Q2',
},
content_type='application/json',
)

self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
self.user_request_1.refresh_from_db()
self.user_request_2.refresh_from_db()
self.enterprise_request.refresh_from_db()
self.assertEqual(self.user_request_1.decline_reason, 'Budget constraints for Q2')
self.assertEqual(self.user_request_2.decline_reason, 'Budget constraints for Q2')
self.assertEqual(self.enterprise_request.decline_reason, 'Budget constraints for Q2')

def test_decline_all_no_declinable_requests(self):
"""Test decline_all returns 404 when no declinable requests exist."""
self.set_jwt_cookie([{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1442,6 +1442,7 @@ def decline_all(self, request, *args, **kwargs):
result = subsidy_request_api.decline_learner_credit_requests(
learner_credit_requests,
reviewer=request.user,
reason=serializer.validated_data.get('decline_reason'),
)
response_data = {
'declined': [str(r.uuid) for r in result.get('declined', [])],
Expand Down
Loading