Skip to content

Commit 5fca255

Browse files
Change submission pending_status to work like grants
Fix #4460: Instead of trying to keep pending_status in sync with status, now assume that if pending_status is None, there isn''t any pending change. While if it is set, it means the submission new pending status is the one set in the variable. Changes: - Update pending_status field to allow null=True - Remove automatic sync logic from save method - Add current_or_pending_status property - Update admin queryset to filter by null pending_status - Update reviews template to use current_or_pending_status - Update tests to reflect new behavior 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Marco Acierno <[email protected]>
1 parent f8a87d3 commit 5fca255

File tree

5 files changed

+47
-24
lines changed

5 files changed

+47
-24
lines changed

backend/reviews/templates/proposals-recap.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -394,14 +394,14 @@ <h3>Show proposals with pending status:</h3>
394394
<script>
395395
submissionsById[{{ item.id }}] = {
396396
id: {{ item.id }},
397-
status: "{{ item.pending_status }}",
398-
originalStatus: "{{ item.pending_status }}",
397+
status: "{{ item.current_or_pending_status }}",
398+
originalStatus: "{{ item.current_or_pending_status }}",
399399
audienceLevel: {{ item.audience_level.id }},
400400
languages: [{% for language in item.languages.all %}"{{language.code}}",{% endfor %}],
401401
numOfVotes: {{item.userreview_set.count}},
402402
};
403403
</script>
404-
<tr class="proposal-item" id="submission-{{item.id}}" data-original-status="{{ item.pending_status }}">
404+
<tr class="proposal-item" id="submission-{{item.id}}" data-original-status="{{ item.current_or_pending_status }}">
405405
<td>{{forloop.counter}}</td>
406406
<td class="results-title">
407407
<a

backend/submissions/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ def get_queryset(self, request):
425425
super()
426426
.get_queryset(request)
427427
.exclude(
428-
pending_status=F("status"),
428+
pending_status__isnull=True,
429429
)
430430
)
431431

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.1.4 on 2025-08-03 17:52
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('submissions', '0027_submissionconfirmpendingstatusproxy'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='submission',
15+
name='pending_status',
16+
field=models.CharField(blank=True, choices=[('proposed', 'Proposed'), ('accepted', 'Accepted'), ('waiting_list', 'Waiting list'), ('rejected', 'Rejected'), ('cancelled', 'Cancelled')], max_length=20, null=True, verbose_name='pending status'),
17+
),
18+
]

backend/submissions/models.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,15 @@ class Submission(TimeStampedModel):
104104
_("status"), choices=STATUS, max_length=20, default=STATUS.proposed
105105
)
106106
pending_status = models.CharField(
107-
_("pending status"), choices=STATUS, max_length=20, default="", blank=True
107+
_("pending status"), choices=STATUS, max_length=20, null=True, blank=True
108108
)
109109

110110
objects = SubmissionQuerySet().as_manager()
111111

112112
def __init__(self, *args, **kwargs):
113113
super().__init__(*args, **kwargs)
114114
self._original_status = self.status
115+
self._original_pending_status = self.pending_status
115116

116117
@property
117118
def hashid(self):
@@ -197,13 +198,14 @@ def save(self, *args, **kwargs):
197198
if update_fields:
198199
update_fields.append("slug")
199200

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")
201+
super().save(*args, **kwargs)
202+
203+
self._original_pending_status = self.pending_status
204+
self._original_status = self.status
205205

206-
return super().save(*args, **kwargs)
206+
@property
207+
def current_or_pending_status(self):
208+
return self.pending_status or self.status
207209

208210
def __str__(self):
209211
return (

backend/submissions/tests/test_models.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,31 +26,34 @@ def test_slug_is_not_regenerated_when_changing_title():
2626
assert submission.slug == "ciao"
2727

2828

29-
def test_syncs_pending_status_when_changing_status():
29+
def test_current_or_pending_status_returns_pending_if_set():
3030
submission = SubmissionFactory(
31-
status=Submission.STATUS.accepted,
31+
status=Submission.STATUS.proposed,
3232
pending_status=Submission.STATUS.accepted,
3333
)
3434

35-
submission.status = Submission.STATUS.rejected
36-
submission.save(update_fields=["status"])
35+
assert submission.current_or_pending_status == Submission.STATUS.accepted
3736

38-
submission.refresh_from_db()
3937

40-
assert submission.status == Submission.STATUS.rejected
41-
assert submission.pending_status == Submission.STATUS.rejected
38+
def test_current_or_pending_status_returns_current_if_pending_none():
39+
submission = SubmissionFactory(
40+
status=Submission.STATUS.rejected,
41+
pending_status=None,
42+
)
4243

44+
assert submission.current_or_pending_status == Submission.STATUS.rejected
4345

44-
def test_leaves_pending_status_unchanged_if_different():
46+
47+
def test_pending_status_not_automatically_synced():
4548
submission = SubmissionFactory(
4649
status=Submission.STATUS.proposed,
47-
pending_status=Submission.STATUS.rejected,
50+
pending_status=Submission.STATUS.accepted,
4851
)
4952

50-
submission.status = Submission.STATUS.waiting_list
51-
submission.save()
53+
submission.status = Submission.STATUS.rejected
54+
submission.save(update_fields=["status"])
5255

5356
submission.refresh_from_db()
5457

55-
assert submission.status == Submission.STATUS.waiting_list
56-
assert submission.pending_status == Submission.STATUS.rejected
58+
assert submission.status == Submission.STATUS.rejected
59+
assert submission.pending_status == Submission.STATUS.accepted # Should remain unchanged

0 commit comments

Comments
 (0)