Skip to content

Commit 57d4112

Browse files
committed
invalidate
1 parent 8df70f3 commit 57d4112

File tree

4 files changed

+141
-12
lines changed

4 files changed

+141
-12
lines changed

backend/api/submissions/mutations.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from urllib.parse import urljoin
22
from django.conf import settings
3+
from conferences.frontend import trigger_frontend_revalidate
34
from grants.tasks import get_name
45
from notifications.models import EmailTemplate, EmailTemplateIdentifier
56
from strawberry.scalars import JSON
@@ -386,6 +387,8 @@ def update_submission(
386387
},
387388
)
388389

390+
trigger_frontend_revalidate(conference, instance)
391+
389392
instance.__strawberry_definition__ = Submission.__strawberry_definition__
390393
return instance
391394

backend/conferences/frontend.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from django.db import models
2+
from submissions.models import Submission
3+
from schedule.models import ScheduleItem
4+
from job_board.models import JobListing
5+
from cms.components.page.tasks import execute_frontend_revalidate
6+
from conferences.models.conference import Conference
7+
8+
9+
def trigger_frontend_revalidate(conference: Conference, object: models.Model):
10+
if not conference.frontend_revalidate_url:
11+
return
12+
13+
for path in get_paths(object):
14+
for locale in ["en", "it"]:
15+
execute_frontend_revalidate.delay(
16+
url=conference.frontend_revalidate_url,
17+
path=f"/{locale}{path}",
18+
secret=conference.frontend_revalidate_secret,
19+
)
20+
21+
22+
def get_paths(object: models.Model) -> list[str]:
23+
match object:
24+
case JobListing():
25+
return [
26+
f"/jobs/{object.id}",
27+
"/jobs/",
28+
]
29+
case ScheduleItem(type=ScheduleItem.TYPES.keynote):
30+
return [
31+
f"/keynotes/{object.slug}",
32+
]
33+
case ScheduleItem():
34+
return [
35+
f"/event/{object.slug}",
36+
]
37+
case Submission(status=Submission.STATUS.accepted):
38+
schedule_items = ScheduleItem.objects.filter(
39+
submission_id=object.id,
40+
conference=object.conference,
41+
)
42+
return [f"/event/{schedule_item.slug}" for schedule_item in schedule_items]
43+
case _:
44+
return []
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
from submissions.models import Submission
2+
from submissions.tests.factories import SubmissionFactory
3+
from conferences.tests.factories import ConferenceFactory
4+
from job_board.tests.factories import JobListingFactory
5+
from schedule.tests.factories import ScheduleItemFactory
6+
from conferences.frontend import get_paths, trigger_frontend_revalidate
7+
from schedule.models import ScheduleItem
8+
9+
10+
def test_get_paths_for_keynote():
11+
keynote = ScheduleItem(
12+
slug="keynote-1",
13+
type=ScheduleItem.TYPES.keynote,
14+
)
15+
16+
assert get_paths(keynote) == [
17+
"/keynotes/keynote-1",
18+
]
19+
20+
21+
def test_get_paths_for_event():
22+
event = ScheduleItemFactory(
23+
slug="event-1",
24+
type=ScheduleItem.TYPES.submission,
25+
)
26+
27+
assert get_paths(event) == [
28+
"/event/event-1",
29+
]
30+
31+
32+
def test_get_paths_for_job_listing():
33+
job_listing = JobListingFactory(
34+
id=1,
35+
)
36+
37+
assert get_paths(job_listing) == [
38+
"/jobs/1",
39+
"/jobs/",
40+
]
41+
42+
43+
def test_get_paths_for_unknown_object():
44+
assert get_paths(object()) == []
45+
46+
47+
def test_get_paths_for_accepted_submission_invalidates_schedule_items():
48+
submission = SubmissionFactory(
49+
status=Submission.STATUS.accepted,
50+
)
51+
52+
schedule_item = ScheduleItemFactory(
53+
submission=submission,
54+
conference=submission.conference,
55+
type=ScheduleItem.TYPES.talk,
56+
)
57+
58+
assert get_paths(submission) == [
59+
f"/event/{schedule_item.slug}",
60+
]
61+
62+
63+
def test_trigger_frontend_revalidate(mocker):
64+
mock_call = mocker.patch("conferences.frontend.execute_frontend_revalidate.delay")
65+
66+
conference = ConferenceFactory(
67+
frontend_revalidate_url="https://example.com",
68+
frontend_revalidate_secret="secret",
69+
)
70+
71+
object = ScheduleItemFactory(
72+
slug="event-1",
73+
type=ScheduleItem.TYPES.submission,
74+
)
75+
76+
trigger_frontend_revalidate(conference, object)
77+
78+
mock_call.assert_has_calls(
79+
[
80+
mocker.call(
81+
url="https://example.com",
82+
path="/en/event/event-1",
83+
secret="secret",
84+
),
85+
mocker.call(
86+
url="https://example.com",
87+
path="/it/event/event-1",
88+
secret="secret",
89+
),
90+
],
91+
any_order=True,
92+
)

backend/job_board/admin.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.contrib import admin
2-
from cms.components.page.tasks import execute_frontend_revalidate
2+
from conferences.frontend import trigger_frontend_revalidate
33
from ordered_model.admin import OrderedModelAdmin
44
from custom_admin.widgets import RichEditorWidget
55

@@ -25,14 +25,4 @@ def save_model(self, request, obj, form, change):
2525
if not conference.frontend_revalidate_url:
2626
return
2727

28-
for locale in ["en", "it"]:
29-
execute_frontend_revalidate.delay(
30-
url=conference.frontend_revalidate_url,
31-
path=f"/{locale}/jobs/",
32-
secret=conference.frontend_revalidate_secret,
33-
)
34-
execute_frontend_revalidate.delay(
35-
url=conference.frontend_revalidate_url,
36-
path=f"/{locale}/jobs/{obj.id}",
37-
secret=conference.frontend_revalidate_secret,
38-
)
28+
trigger_frontend_revalidate(conference, obj)

0 commit comments

Comments
 (0)