Skip to content
Merged
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: 4 additions & 2 deletions backend/api/tests/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -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),
)

Expand Down
6 changes: 3 additions & 3 deletions backend/reviews/templates/proposals-recap.html
Original file line number Diff line number Diff line change
Expand Up @@ -394,14 +394,14 @@ <h3>Show proposals with pending status:</h3>
<script>
submissionsById[{{ item.id }}] = {
id: {{ item.id }},
status: "{{ item.pending_status }}",
originalStatus: "{{ item.pending_status }}",
status: "{{ item.current_or_pending_status }}",
originalStatus: "{{ item.current_or_pending_status }}",
audienceLevel: {{ item.audience_level.id }},
languages: [{% for language in item.languages.all %}"{{language.code}}",{% endfor %}],
numOfVotes: {{item.userreview_set.count}},
};
</script>
<tr class="proposal-item" id="submission-{{item.id}}" data-original-status="{{ item.pending_status }}">
<tr class="proposal-item" id="submission-{{item.id}}" data-original-status="{{ item.current_or_pending_status }}">
<td>{{forloop.counter}}</td>
<td class="results-title">
<a
Expand Down
6 changes: 3 additions & 3 deletions backend/submissions/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"),
Expand All @@ -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(
Expand Down Expand Up @@ -425,7 +425,7 @@ def get_queryset(self, request):
super()
.get_queryset(request)
.exclude(
pending_status=F("status"),
pending_status__isnull=True,
)
)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.1.4 on 2025-11-01 18:50

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('submissions', '0027_submissionconfirmpendingstatusproxy'),
]

operations = [
migrations.AlterField(
model_name='submission',
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'),
),
]
16 changes: 5 additions & 11 deletions backend/submissions/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,11 @@ class Submission(TimeStampedModel):
_("status"), choices=STATUS, max_length=20, default=STATUS.proposed
)
pending_status = models.CharField(
_("pending status"), choices=STATUS, max_length=20, default="", blank=True
_("pending status"), choices=STATUS, max_length=20, null=True, blank=True
)

objects = SubmissionQuerySet().as_manager()

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._original_status = self.status

@property
def hashid(self):
return encode_hashid(self.pk)
Expand Down Expand Up @@ -197,13 +193,11 @@ def save(self, *args, **kwargs):
if update_fields:
update_fields.append("slug")

if self.pending_status == self._original_status:
self.pending_status = self.status

if update_fields:
update_fields.append("pending_status")
super().save(*args, **kwargs)

return super().save(*args, **kwargs)
@property
def current_or_pending_status(self):
return self.pending_status or self.status

def __str__(self):
return (
Expand Down
11 changes: 11 additions & 0 deletions backend/submissions/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
29 changes: 16 additions & 13 deletions backend/submissions/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,31 +26,34 @@ def test_slug_is_not_regenerated_when_changing_title():
assert submission.slug == "ciao"


def test_syncs_pending_status_when_changing_status():
def test_current_or_pending_status_returns_pending_if_set():
submission = SubmissionFactory(
status=Submission.STATUS.accepted,
status=Submission.STATUS.proposed,
pending_status=Submission.STATUS.accepted,
)

submission.status = Submission.STATUS.rejected
submission.save(update_fields=["status"])
assert submission.current_or_pending_status == Submission.STATUS.accepted

submission.refresh_from_db()

assert submission.status == Submission.STATUS.rejected
assert submission.pending_status == Submission.STATUS.rejected
def test_current_or_pending_status_returns_current_if_pending_none():
submission = SubmissionFactory(
status=Submission.STATUS.rejected,
pending_status=None,
)

assert submission.current_or_pending_status == Submission.STATUS.rejected

def test_leaves_pending_status_unchanged_if_different():

def test_pending_status_not_automatically_synced():
submission = SubmissionFactory(
status=Submission.STATUS.proposed,
pending_status=Submission.STATUS.rejected,
pending_status=Submission.STATUS.accepted,
)

submission.status = Submission.STATUS.waiting_list
submission.save()
submission.status = Submission.STATUS.rejected
submission.save(update_fields=["status"])

submission.refresh_from_db()

assert submission.status == Submission.STATUS.waiting_list
assert submission.pending_status == Submission.STATUS.rejected
assert submission.status == Submission.STATUS.rejected
assert submission.pending_status == Submission.STATUS.accepted # Should remain unchanged
Loading