Skip to content

Commit 437e069

Browse files
authored
Sync pending statuses when updating Grant/Submission (#4329)
1 parent 16deb18 commit 437e069

File tree

4 files changed

+93
-1
lines changed

4 files changed

+93
-1
lines changed

backend/grants/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ class ApprovedType(models.TextChoices):
230230

231231
def __init__(self, *args, **kwargs):
232232
super().__init__(*args, **kwargs)
233+
self._original_status = self.status
233234
self._original_pending_status = self.pending_status
234235
self._original_approved_type = self.approved_type
235236
self._original_country_type = self.country_type
@@ -241,19 +242,24 @@ def save(self, *args, **kwargs):
241242
self._update_country_type()
242243
self._calculate_grant_amounts()
243244

245+
if self.pending_status == self._original_status:
246+
self.pending_status = self.status
247+
244248
update_fields = kwargs.get("update_fields", None)
245249
if update_fields:
246250
update_fields.append("total_amount")
247251
update_fields.append("ticket_amount")
248252
update_fields.append("accommodation_amount")
249253
update_fields.append("travel_amount")
250254
update_fields.append("country_type")
255+
update_fields.append("pending_status")
251256

252257
super().save(*args, **kwargs)
253258

254259
self._original_approved_type = self.approved_type
255260
self._original_country_type = self.country_type
256261
self._original_pending_status = self.pending_status
262+
self._original_status = self.status
257263

258264
def _calculate_grant_amounts(self):
259265
if self.pending_status != Grant.Status.approved:

backend/grants/tests/test_models.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,35 @@ def test_sets_country_type_does_nothing_if_unset():
160160
grant = GrantFactory(departure_country=None)
161161

162162
assert grant.country_type is None
163+
164+
165+
def test_syncs_pending_status_on_change():
166+
grant = GrantFactory(
167+
pending_status=Grant.Status.pending,
168+
status=Grant.Status.pending,
169+
)
170+
171+
grant.status = Grant.Status.approved
172+
grant.save(update_fields=["status"])
173+
174+
# Pending status should be updated to match the status
175+
grant.refresh_from_db()
176+
177+
assert grant.pending_status == Grant.Status.approved
178+
assert grant.status == Grant.Status.approved
179+
180+
181+
def test_doesnt_sync_pending_status_if_different_values():
182+
grant = GrantFactory(
183+
pending_status=Grant.Status.refused,
184+
status=Grant.Status.pending,
185+
)
186+
187+
grant.status = Grant.Status.waiting_for_confirmation
188+
grant.save()
189+
190+
# Status should not be updated
191+
grant.refresh_from_db()
192+
193+
assert grant.pending_status == Grant.Status.refused
194+
assert grant.status == Grant.Status.waiting_for_confirmation

backend/submissions/models.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ class Submission(TimeStampedModel):
109109

110110
objects = SubmissionQuerySet().as_manager()
111111

112+
def __init__(self, *args, **kwargs):
113+
super().__init__(*args, **kwargs)
114+
self._original_status = self.status
115+
112116
@property
113117
def hashid(self):
114118
return encode_hashid(self.pk)
@@ -185,9 +189,20 @@ def get_admin_url(self):
185189
)
186190

187191
def save(self, *args, **kwargs):
192+
update_fields = kwargs.get("update_fields", None)
193+
188194
if not self.slug:
189195
self.slug = slugify(self.title.localize("en"))
190196

197+
if update_fields:
198+
update_fields.append("slug")
199+
200+
if self.pending_status == self._original_status:
201+
self.pending_status = self.status
202+
203+
if update_fields:
204+
update_fields.append("pending_status")
205+
191206
return super().save(*args, **kwargs)
192207

193208
def __str__(self):

backend/submissions/tests/test_models.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
from submissions.models import Submission
12
from submissions.tests.factories import SubmissionFactory
23
from pytest import mark
34

45
from i18n.strings import LazyI18nString
56

7+
pytestmark = mark.django_db
8+
69

7-
@mark.django_db
810
def test_slug_is_not_regenerated_when_changing_title():
911
submission = SubmissionFactory(title=LazyI18nString({"en": "hello", "it": "hell"}))
1012
assert submission.slug == "hello"
@@ -15,3 +17,40 @@ def test_slug_is_not_regenerated_when_changing_title():
1517
submission.refresh_from_db()
1618

1719
assert submission.slug == "hello"
20+
21+
submission.slug = ""
22+
submission.save(update_fields=["title"])
23+
24+
submission.refresh_from_db()
25+
26+
assert submission.slug == "ciao"
27+
28+
29+
def test_syncs_pending_status_when_changing_status():
30+
submission = SubmissionFactory(
31+
status=Submission.STATUS.accepted,
32+
pending_status=Submission.STATUS.accepted,
33+
)
34+
35+
submission.status = Submission.STATUS.rejected
36+
submission.save(update_fields=["status"])
37+
38+
submission.refresh_from_db()
39+
40+
assert submission.status == Submission.STATUS.rejected
41+
assert submission.pending_status == Submission.STATUS.rejected
42+
43+
44+
def test_leaves_pending_status_unchanged_if_different():
45+
submission = SubmissionFactory(
46+
status=Submission.STATUS.proposed,
47+
pending_status=Submission.STATUS.rejected,
48+
)
49+
50+
submission.status = Submission.STATUS.waiting_list
51+
submission.save()
52+
53+
submission.refresh_from_db()
54+
55+
assert submission.status == Submission.STATUS.waiting_list
56+
assert submission.pending_status == Submission.STATUS.rejected

0 commit comments

Comments
 (0)