Skip to content

Commit beaa40b

Browse files
committed
feat(program_v2): add self-linkage to program links
1 parent 7802f56 commit beaa40b

File tree

4 files changed

+58
-5
lines changed

4 files changed

+58
-5
lines changed

backend/program_v2/graphql/program_links.py

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
from __future__ import annotations
2+
3+
from typing import Self
4+
15
import graphene
26
from django.conf import settings
37
from django.http import HttpRequest
@@ -22,6 +26,8 @@ class ProgramLinkType(graphene.Enum):
2226
FEEDBACK = "FEEDBACK"
2327
CALENDAR = "CALENDAR"
2428
OTHER = "OTHER"
29+
GUIDE_V2_LIGHT = "GUIDE_V2_LIGHT"
30+
GUIDE_V2_EMBEDDED = "GUIDE_V2_EMBEDDED"
2531

2632

2733
# This is an interim solution until Program V2 has an editing UI.
@@ -31,11 +37,13 @@ class ProgramLinkType(graphene.Enum):
3137
ProgramLinkType.RESERVATION: "Reserve seats",
3238
ProgramLinkType.TICKETS: "Buy tickets",
3339
ProgramLinkType.RECORDING: "Watch recording",
34-
ProgramLinkType.MATERIAL: "Katso esitysmateriaalit",
40+
ProgramLinkType.MATERIAL: "View presentation materials",
3541
ProgramLinkType.REMOTE: "Participate remotely",
3642
ProgramLinkType.FEEDBACK: "Give feedback",
3743
ProgramLinkType.OTHER: "Link",
3844
ProgramLinkType.CALENDAR: "Add to calendar",
45+
ProgramLinkType.GUIDE_V2_LIGHT: "This program in Kompassi",
46+
ProgramLinkType.GUIDE_V2_EMBEDDED: "This program at the event website",
3947
},
4048
fi={
4149
ProgramLinkType.SIGNUP: "Ilmoittaudu",
@@ -47,6 +55,8 @@ class ProgramLinkType(graphene.Enum):
4755
ProgramLinkType.FEEDBACK: "Anna palautetta",
4856
ProgramLinkType.OTHER: "Linkki",
4957
ProgramLinkType.CALENDAR: "Lisää kalenteriin",
58+
ProgramLinkType.GUIDE_V2_LIGHT: "Tämä ohjelma Kompassissa",
59+
ProgramLinkType.GUIDE_V2_EMBEDDED: "Tämä ohjelma tapahtuman web-sivuilla",
5060
},
5161
sv={
5262
ProgramLinkType.SIGNUP: "Anmäl dig",
@@ -58,6 +68,8 @@ class ProgramLinkType(graphene.Enum):
5868
ProgramLinkType.FEEDBACK: "Ge feedback",
5969
ProgramLinkType.OTHER: "Länk",
6070
ProgramLinkType.CALENDAR: "Lägg till i kalendern",
71+
ProgramLinkType.GUIDE_V2_LIGHT: "Detta program i programguiden",
72+
ProgramLinkType.GUIDE_V2_EMBEDDED: "Detta program på evenemangets webbsida",
6173
},
6274
)
6375

@@ -75,11 +87,21 @@ def from_program(
7587
link_type: ProgramLinkType,
7688
language: str = DEFAULT_LANGUAGE,
7789
include_expired: bool = False,
78-
):
90+
) -> Self | None:
7991
"""
8092
TODO should this be pushed into the Program model?
8193
TODO should this be cached? (probably not, as some links are time-sensitive)
94+
95+
params:
96+
event - performance optimization to avoid O(n) queries
8297
"""
98+
event = program.event
99+
meta = event.program_v2_event_meta
100+
101+
if meta is None:
102+
# This should not happen, but appease the type checker
103+
return None
104+
83105
link_type_str = link_type.value # type: ignore[attr-defined]
84106
title_specifier = ""
85107
link_annotation = f"internal:links:{link_type_str.lower()}"
@@ -106,13 +128,17 @@ def from_program(
106128
href = (
107129
program.annotations.get(
108130
link_annotation,
109-
settings.KOMPASSI_V2_BASE_URL
110-
+ f"/events/{program.event.slug}/programs/{program.slug}/feedback",
131+
settings.KOMPASSI_V2_BASE_URL + f"/events/{event.slug}/programs/{program.slug}/feedback",
111132
)
112133
if program.is_accepting_feedback
113134
else ""
114135
)
115-
136+
case ProgramLinkType.GUIDE_V2_LIGHT:
137+
href = settings.KOMPASSI_V2_BASE_URL + f"/{event.slug}/programs/{program.slug}"
138+
case ProgramLinkType.GUIDE_V2_EMBEDDED:
139+
href = program.annotations.get(link_annotation, "")
140+
if not href and meta.guide_v2_embedded_url:
141+
href = meta.guide_v2_embedded_url + "#prog:" + program.slug
116142
case _:
117143
href = program.annotations.get(link_annotation, "")
118144

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 5.1.5 on 2025-04-22 16:09
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("program_v2", "0036_remove_programv2eventmeta_location_dimension"),
9+
]
10+
11+
operations = [
12+
migrations.AddField(
13+
model_name="programv2eventmeta",
14+
name="guide_v2_embedded_url",
15+
field=models.CharField(
16+
blank=True, help_text="URL to the embedded guide. This is used to form program links.", max_length=255
17+
),
18+
),
19+
]

backend/program_v2/models/meta.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ class ProgramV2EventMeta(ContactEmailMixin, EventMetaBase):
2525
help_text="Foo Bar <foo.bar@example.com>",
2626
)
2727

28+
guide_v2_embedded_url = models.CharField(
29+
max_length=255,
30+
blank=True,
31+
help_text="URL to the embedded guide. This is used to form program links.",
32+
)
33+
2834
use_cbac = True
2935

3036
def __str__(self):

frontend/src/__generated__/graphql.ts

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)