From 5fca25584c19dbdb5394cd20c87097fa3c725e97 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Sun, 3 Aug 2025 17:54:32 +0000 Subject: [PATCH 1/5] Change submission pending_status to work like grants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../reviews/templates/proposals-recap.html | 6 ++-- backend/submissions/admin.py | 2 +- ...alter_submission_pending_status_to_null.py | 18 ++++++++++++ backend/submissions/models.py | 16 +++++----- backend/submissions/tests/test_models.py | 29 ++++++++++--------- 5 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 backend/submissions/migrations/0028_alter_submission_pending_status_to_null.py diff --git a/backend/reviews/templates/proposals-recap.html b/backend/reviews/templates/proposals-recap.html index fad90845ad..f22ba08e20 100644 --- a/backend/reviews/templates/proposals-recap.html +++ b/backend/reviews/templates/proposals-recap.html @@ -394,14 +394,14 @@

Show proposals with pending status:

- + {{forloop.counter}} Date: Sat, 1 Nov 2025 19:50:41 +0100 Subject: [PATCH 2/5] update migration --- ...tus_to_null.py => 0028_alter_submission_pending_status.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename backend/submissions/migrations/{0028_alter_submission_pending_status_to_null.py => 0028_alter_submission_pending_status.py} (91%) diff --git a/backend/submissions/migrations/0028_alter_submission_pending_status_to_null.py b/backend/submissions/migrations/0028_alter_submission_pending_status.py similarity index 91% rename from backend/submissions/migrations/0028_alter_submission_pending_status_to_null.py rename to backend/submissions/migrations/0028_alter_submission_pending_status.py index 17f41eb310..2f1256ac5a 100644 --- a/backend/submissions/migrations/0028_alter_submission_pending_status_to_null.py +++ b/backend/submissions/migrations/0028_alter_submission_pending_status.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.4 on 2025-08-03 17:52 +# Generated by Django 5.1.4 on 2025-11-01 18:50 from django.db import migrations, models @@ -15,4 +15,4 @@ class Migration(migrations.Migration): name='pending_status', 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'), ), - ] \ No newline at end of file + ] From b4a3beae5513a3afee93f543bd0a90e74411fa92 Mon Sep 17 00:00:00 2001 From: Marco Acierno Date: Sat, 1 Nov 2025 20:12:50 +0100 Subject: [PATCH 3/5] remove unnecessary fields --- backend/submissions/models.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/backend/submissions/models.py b/backend/submissions/models.py index 954a976aa7..66066c306b 100644 --- a/backend/submissions/models.py +++ b/backend/submissions/models.py @@ -109,11 +109,6 @@ class Submission(TimeStampedModel): objects = SubmissionQuerySet().as_manager() - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._original_status = self.status - self._original_pending_status = self.pending_status - @property def hashid(self): return encode_hashid(self.pk) @@ -199,9 +194,6 @@ def save(self, *args, **kwargs): update_fields.append("slug") super().save(*args, **kwargs) - - self._original_pending_status = self.pending_status - self._original_status = self.status @property def current_or_pending_status(self): From 5e064481d70b570015d816c3843e28e9d9feb8dd Mon Sep 17 00:00:00 2001 From: Marco Acierno Date: Sat, 1 Nov 2025 20:16:02 +0100 Subject: [PATCH 4/5] fix apply_and_notify_status_change --- backend/submissions/admin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/submissions/admin.py b/backend/submissions/admin.py index f1354b1135..7201ad726e 100644 --- a/backend/submissions/admin.py +++ b/backend/submissions/admin.py @@ -9,7 +9,6 @@ from import_export.resources import ModelResource from django import forms -from django.db.models import F from django.db import transaction from django.contrib import admin, messages from django.utils.html import mark_safe @@ -356,6 +355,7 @@ def apply_and_notify_status_change(modeladmin, request, queryset): for submission in objs: submission.status = submission.pending_status + submission.pending_status = None placeholders = { "conference_name": conference.name.localize("en"), "proposal_title": submission.title.localize("en"), @@ -374,7 +374,7 @@ def apply_and_notify_status_change(modeladmin, request, queryset): Submission.objects.bulk_update( objs, - ["status"], + ["status", "pending_status"], ) messages.add_message( From 4a843253dc0503fab02675b1082103612a23c9ca Mon Sep 17 00:00:00 2001 From: Marco Acierno Date: Sat, 1 Nov 2025 20:26:48 +0100 Subject: [PATCH 5/5] test coverage --- backend/api/tests/fixtures.py | 6 ++++-- backend/submissions/tests/test_admin.py | 11 +++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/backend/api/tests/fixtures.py b/backend/api/tests/fixtures.py index 1f99d0316b..0b717f6cba 100644 --- a/backend/api/tests/fixtures.py +++ b/backend/api/tests/fixtures.py @@ -101,9 +101,11 @@ def create_languages(db): from languages.languages import LANGUAGES for language in LANGUAGES: - Language.objects.create(name=language["English"], code=language["alpha2"]) + Language.objects.get_or_create( + name=language["English"], code=language["alpha2"] + ) - Locale.objects.create( + Locale.objects.get_or_create( language_code=get_supported_content_language_variant(settings.LANGUAGE_CODE), ) diff --git a/backend/submissions/tests/test_admin.py b/backend/submissions/tests/test_admin.py index e89ec8817e..12f8577a04 100644 --- a/backend/submissions/tests/test_admin.py +++ b/backend/submissions/tests/test_admin.py @@ -109,6 +109,17 @@ def test_apply_and_notify_status_change(rf, mocker): queryset=Submission.objects.filter(status=Submission.STATUS.proposed), ) + accepted_submission.refresh_from_db() + rejected_submission.refresh_from_db() + waiting_list_proposal.refresh_from_db() + + assert accepted_submission.status == Submission.STATUS.accepted + assert accepted_submission.pending_status is None + assert rejected_submission.status == Submission.STATUS.rejected + assert rejected_submission.pending_status is None + assert waiting_list_proposal.status == Submission.STATUS.waiting_list + assert waiting_list_proposal.pending_status is None + assert SentEmail.objects.filter( recipient=accepted_submission.speaker, email_template=proposal_accepted_template,