Skip to content

Commit 1f3f2f1

Browse files
committed
Forbid update of title and abstract when CFP is closed
1 parent 4cb76dd commit 1f3f2f1

2 files changed

Lines changed: 121 additions & 20 deletions

File tree

backend/api/submissions/mutations.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
1-
from urllib.parse import urljoin
2-
from django.conf import settings
3-
from conferences.frontend import trigger_frontend_revalidate
4-
from grants.tasks import get_name
5-
from notifications.models import EmailTemplate, EmailTemplateIdentifier
6-
from strawberry.scalars import JSON
7-
8-
from django.db import transaction
91
import math
102
import re
11-
from typing import Annotated, Union, Optional
3+
from typing import Annotated, Optional, Union
4+
from urllib.parse import urljoin
125

13-
from privacy_policy.record import record_privacy_policy_acceptance
146
import strawberry
7+
from django.conf import settings
8+
from django.db import transaction
159
from strawberry import ID
10+
from strawberry.scalars import JSON
1611
from strawberry.types import Info
1712

1813
from api.permissions import IsAuthenticated
1914
from api.types import BaseErrorType, MultiLingualInput
15+
from conferences.frontend import trigger_frontend_revalidate
2016
from conferences.models.conference import Conference
17+
from grants.tasks import get_name
2118
from i18n.strings import LazyI18nString
2219
from languages.models import Language
20+
from notifications.models import EmailTemplate, EmailTemplateIdentifier
2321
from participants.models import Participant
24-
from submissions.models import ProposalMaterial, Submission as SubmissionModel
22+
from privacy_policy.record import record_privacy_policy_acceptance
23+
from submissions.models import ProposalMaterial
24+
from submissions.models import Submission as SubmissionModel
2525
from submissions.tasks import notify_new_cfp_submission
2626

2727
from .types import Submission, SubmissionMaterialInput
@@ -263,6 +263,22 @@ class UpdateSubmissionInput(BaseSubmissionInput):
263263
def validate(self, conference: Conference, submission: SubmissionModel):
264264
errors = super().validate(conference)
265265

266+
# Check if CFP is closed and prevent editing of title and abstract
267+
if not conference.is_cfp_open:
268+
if LazyI18nString(self.title.to_dict()) != submission.title:
269+
errors.add_error(
270+
"title",
271+
"You cannot edit the title after the call for proposals deadline has passed.",
272+
)
273+
274+
if LazyI18nString(self.abstract.to_dict()) != submission.abstract:
275+
print(LazyI18nString(self.abstract.to_dict()).data)
276+
print(submission.abstract.data)
277+
errors.add_error(
278+
"abstract",
279+
"You cannot edit the abstract after the call for proposals deadline has passed.",
280+
)
281+
266282
if self.materials:
267283
if len(self.materials) > 3:
268284
errors.add_error(

backend/api/submissions/tests/test_edit_submission.py

Lines changed: 94 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1-
import pytest
21
from uuid import uuid4
3-
from users.tests.factories import UserFactory
2+
3+
import pytest
4+
from pytest import mark
5+
46
from conferences.tests.factories import ConferenceFactory
5-
from submissions.tests.factories import (
6-
ProposalMaterialFactory,
7-
SubmissionFactory,
8-
SubmissionTagFactory,
9-
)
107
from files_upload.tests.factories import (
118
FileFactory,
129
ParticipantAvatarFileFactory,
1310
ProposalMaterialFileFactory,
1411
)
15-
from pytest import mark
16-
1712
from participants.models import Participant
1813
from submissions.models import ProposalMaterial, Submission
14+
from submissions.tests.factories import (
15+
ProposalMaterialFactory,
16+
SubmissionFactory,
17+
SubmissionTagFactory,
18+
)
19+
from users.tests.factories import UserFactory
1920

2021
pytestmark = mark.django_db
2122

@@ -1070,6 +1071,8 @@ def test_can_edit_submission_outside_cfp(graphql_client, user):
10701071
new_duration=new_duration,
10711072
new_type=new_type,
10721073
new_languages=["en"],
1074+
new_title=submission.title.data, # Keep title unchanged
1075+
new_abstract=submission.abstract.data, # Keep abstract unchanged
10731076
)
10741077

10751078
assert response["data"]["updateSubmission"]["__typename"] == "Submission"
@@ -1301,3 +1304,85 @@ def test_update_submission_with_do_not_record_true(graphql_client, user):
13011304

13021305
submission.refresh_from_db()
13031306
assert submission.do_not_record is True
1307+
1308+
1309+
def test_cannot_update_title_after_cfp_deadline(graphql_client, user):
1310+
conference = ConferenceFactory(
1311+
topics=("life", "diy"),
1312+
languages=("en",),
1313+
durations=("10", "20"),
1314+
active_cfp=False, # CFP deadline is in the past
1315+
audience_levels=("adult", "senior"),
1316+
submission_types=("talk", "workshop"),
1317+
)
1318+
1319+
submission = SubmissionFactory(
1320+
speaker_id=user.id,
1321+
custom_topic="life",
1322+
custom_duration="10m",
1323+
custom_audience_level="adult",
1324+
custom_submission_type="talk",
1325+
languages=["en"],
1326+
tags=["python", "ml"],
1327+
conference=conference,
1328+
)
1329+
1330+
original_title = submission.title.localize("en")
1331+
1332+
graphql_client.force_login(user)
1333+
1334+
response = _update_submission(
1335+
graphql_client,
1336+
submission=submission,
1337+
new_title={"en": "Updated Title After Deadline"},
1338+
)
1339+
1340+
assert response["data"]["updateSubmission"]["__typename"] == "SendSubmissionErrors"
1341+
assert response["data"]["updateSubmission"]["errors"]["validationTitle"] == [
1342+
"You cannot edit the title after the call for proposals deadline has passed."
1343+
]
1344+
1345+
# Verify the title was not updated
1346+
submission.refresh_from_db()
1347+
assert submission.title.localize("en") == original_title
1348+
1349+
1350+
def test_cannot_update_abstract_after_cfp_deadline(graphql_client, user):
1351+
conference = ConferenceFactory(
1352+
topics=("life", "diy"),
1353+
languages=("en",),
1354+
durations=("10", "20"),
1355+
active_cfp=False, # CFP deadline is in the past
1356+
audience_levels=("adult", "senior"),
1357+
submission_types=("talk", "workshop"),
1358+
)
1359+
1360+
submission = SubmissionFactory(
1361+
speaker_id=user.id,
1362+
custom_topic="life",
1363+
custom_duration="10m",
1364+
custom_audience_level="adult",
1365+
custom_submission_type="talk",
1366+
languages=["en"],
1367+
tags=["python", "ml"],
1368+
conference=conference,
1369+
)
1370+
1371+
original_abstract = submission.abstract.localize("en")
1372+
1373+
graphql_client.force_login(user)
1374+
1375+
response = _update_submission(
1376+
graphql_client,
1377+
submission=submission,
1378+
new_abstract={"en": "Updated abstract after deadline"},
1379+
)
1380+
1381+
assert response["data"]["updateSubmission"]["__typename"] == "SendSubmissionErrors"
1382+
assert response["data"]["updateSubmission"]["errors"]["validationAbstract"] == [
1383+
"You cannot edit the abstract after the call for proposals deadline has passed."
1384+
]
1385+
1386+
# Verify the abstract was not updated
1387+
submission.refresh_from_db()
1388+
assert submission.abstract.localize("en") == original_abstract

0 commit comments

Comments
 (0)