Compare commits

42 Commits

Author SHA1 Message Date
leander 2b8197e8a2 generate migrations for photosphere support 2026-04-15 23:44:18 +02:00
leander 3dd2c056b8 add 360 photosphere element support 2026-04-15 23:43:47 +02:00
ponas d0a886a4ae web: bump deps 2026-03-05 22:02:29 +01:00
ponas cc5b53011d dnscms: bump deps 2026-03-05 21:54:58 +01:00
ponas f769898698 dnscms: add django.contrib.postgres 2026-02-16 02:43:23 +01:00
ponas e71db3a0cc dnscms: switch from 1 to 3 gunicorn workers 2026-02-16 02:38:45 +01:00
ponas 355c0b38a5 dnscms: bump deps 2026-02-16 02:37:33 +01:00
ponas bba98fe868 web: fix missing content for accordion blocks inside page section blocks 2026-02-04 20:44:39 +01:00
ponas 978aae4fc3 web: bump deps 2026-02-04 19:59:29 +01:00
ponas ffc3a583b2 web: bump all deps 2025-12-12 15:25:53 +01:00
ponas 12aea04779 web: bump all deps, notably next to v16.0.7 to fix CVE-2025-55182 2025-12-03 21:08:44 +01:00
leander 6bcf9bbfbd fix url parameter organizer replacing first dropdown item
add organizer at the end instead of during filtering. Probably not the
optimal way to do this but works for now.
2025-11-19 23:24:08 +01:00
leander 2e4ca34f5c make association featured link in navbar 2025-11-19 23:12:45 +01:00
leander d76b16781d switch member and volunteer links in navbar 2025-11-19 23:06:04 +01:00
ponas 8942bcc9da web: allow filtering on venues and organizers with no upcoming events, reset filter if invalid 2025-11-19 21:08:56 +01:00
ponas 196f000a2d web: fix organizer filtering 2025-11-19 20:23:32 +01:00
ponas 4655f67a9e web: set turbopack root 2025-11-19 20:23:04 +01:00
ponas 8506fd1c2d dnscms: increase page size and max page size for wagtail-grapple 2025-11-19 20:09:55 +01:00
ponas ca341f5f22 workaround number of event occurrences somehow being limited to 10 2025-11-17 03:34:04 +01:00
ponas 1431b8d6ff web: regenerate types 2025-11-14 02:42:13 +01:00
ponas 3c225aa68a web: bump everything, notably node to v14 and nextjs to v16.0.3 2025-11-14 02:41:49 +01:00
ponas 16629a2fc0 dnscms: bump python to 3.14, bump deps, notably wagtail to 7.2 2025-11-14 02:32:43 +01:00
ponas b18f9ec54f fix build 2025-10-06 21:53:25 +02:00
ponas 2a00d21717 temporarily use the DNS pig with hat 2025-10-06 21:08:48 +02:00
ponas 09e69a7093 avoid double timezone conversion to fix showing the wrong date for faraway spiders and users 2025-09-14 01:21:39 +02:00
ponas d3f8b8f0bb allow wider paragraph in newsletter block 2025-08-11 18:57:21 +02:00
ponas fcd5231c28 change newsletter text 2025-08-11 18:50:32 +02:00
ponas 1b25bad850 add sponsors to menu 2025-08-11 18:45:29 +02:00
ponas c8b0c99d8d only show newsletter block on front page for now 2025-08-11 00:04:24 +02:00
elisejakob 55d9bcbef8 add newsletter block 2025-08-10 22:01:40 +02:00
elisejakob 1209562e0b fix event item line height 2025-08-10 21:10:40 +02:00
elisejakob d5d3c6b936 style sponsor list 2025-08-08 15:21:00 +02:00
ponas 87562b491d disable turbopack to fix css issues 2025-08-08 14:56:55 +02:00
ponas c54196d487 bump next, react, sass 2025-08-08 14:53:30 +02:00
ponas 37104e7a0c add keys to blocks 2025-08-08 14:53:17 +02:00
ponas ed3388e2bf set sponsor logo image sizes 2025-08-08 14:40:16 +02:00
ponas 8444bd018e remove stray logs 2025-08-08 14:40:08 +02:00
ponas 1a3f031d5f web: add unstyled sponsors page 2025-07-28 03:54:41 +02:00
ponas 8e8ca4f147 dnscms: add sponsors page 2025-07-28 03:38:54 +02:00
ponas 7d1836f973 dnscms: remove accidentally committed local configuration 2025-07-21 14:17:33 +02:00
ponas a7bbc0730d dnscms: migrate to uv, remove wagtail-wordpress-import dependency 2025-07-21 03:52:30 +02:00
ponas 90f658a77e web: remove import from fonts.net 2025-07-21 00:57:36 +02:00
56 changed files with 11152 additions and 4887 deletions
+1
View File
@@ -9,6 +9,7 @@ __pycache__
.DS_Store
*.swp
/venv/
/.venv/
/tmp/
/.vagrant/
/Vagrantfile.local
+1
View File
@@ -7,3 +7,4 @@
/static/
/media/
db.sqlite3
dnscms/settings/local.py
-3
View File
@@ -1,3 +0,0 @@
[tools]
python = "3.12.4"
poetry = "latest"
+17 -18
View File
@@ -1,11 +1,14 @@
FROM python:3.12-slim-bullseye
FROM python:3.14-slim-trixie
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
RUN useradd wagtail
EXPOSE 8000
ENV PYTHONUNBUFFERED=1 \
PORT=8000
PORT=8000 \
UV_COMPILE_BYTECODE=1 \
UV_LINK_MODE=copy
RUN apt-get update --yes --quiet && apt-get install --yes --quiet --no-install-recommends \
build-essential \
@@ -13,29 +16,25 @@ RUN apt-get update --yes --quiet && apt-get install --yes --quiet --no-install-r
libjpeg62-turbo-dev \
zlib1g-dev \
libwebp-dev \
git \
&& rm -rf /var/lib/apt/lists/*
ENV POETRY_VERSION=""
ENV POETRY_HOME="/opt/poetry"
ENV PIP_NO_CACHE_DIR=1
ENV POETRY_VIRTUALENVS_CREATE=false
ENV POETRY_NO_INTERACTION=1
ENV PATH="$POETRY_HOME/bin:$PATH"
WORKDIR /app
RUN apt-get update \
&& apt-get install --no-install-recommends --assume-yes curl
RUN curl -sSL https://install.python-poetry.org | python3 -
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv version && uv sync --locked --no-install-project
WORKDIR /app
COPY pyproject.toml poetry.lock README.md /app/
RUN pip install gunicorn
RUN poetry install --without=dev
COPY . /app
ADD . /app
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --locked --no-dev
RUN chown wagtail:wagtail /app
COPY --chown=wagtail:wagtail . .
USER wagtail
ENV PATH="/app/.venv/bin:$PATH"
RUN python manage.py collectstatic --noinput --clear
CMD set -xe; python manage.py migrate --noinput && gunicorn dnscms.wsgi:application
CMD ["sh", "-c", "set -xe; python manage.py migrate --noinput && gunicorn dnscms.wsgi:application --workers 3"]
@@ -0,0 +1,492 @@
# Generated by Django 6.0.3 on 2026-04-15 20:21
import wagtail.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("associations", "0025_associationpage_lead"),
]
operations = [
migrations.AlterField(
model_name="associationindex",
name="body",
field=wagtail.fields.StreamField(
[
("paragraph", 0),
("image", 4),
("image_slider", 8),
("horizontal_rule", 10),
("featured", 18),
("page_section_navigation", 19),
("accordion", 23),
("fact_box", 26),
("photo_sphere", 29),
("embed", 30),
("raw_html", 31),
],
block_lookup={
0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rik tekst"}),
1: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "Bilde"},
),
2: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("fullwidth", "Fullbredde"),
("bleed", "Utfallende"),
("original", "Uendret størrelse"),
],
"icon": "cup",
"label": "Bildeformat",
},
),
3: (
"wagtail.blocks.CharBlock",
(),
{"label": "Bildetekst", "max_length": 512, "required": False},
),
4: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{},
),
5: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tekst", "max_length": 512, "required": False},
),
6: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("text", 5)]],
{},
),
7: (
"wagtail.blocks.ListBlock",
(6,),
{"label": "Bilder", "min_num": 1},
),
8: ("wagtail.blocks.StructBlock", [[("images", 7)]], {}),
9: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Farge",
"required": False,
},
),
10: ("wagtail.blocks.StructBlock", [[("color", 9)]], {}),
11: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tittel", "max_length": 64, "required": True},
),
12: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": ["bold", "italic", "link"],
"label": "Tekst",
"required": True,
},
),
13: (
"wagtail.blocks.PageChooserBlock",
(),
{"header": "Fremhevet side", "required": True},
),
14: (
"wagtail.blocks.CharBlock",
(),
{
"default": "Les mer",
"help_text": 'Lenketeksten som tar deg videre til siden. Tips: Ikke start med "Trykk her"',
"label": "Lenketekst",
"max_length": 64,
"required": True,
},
),
15: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
},
),
16: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [("left", "Venstre"), ("right", "Høyre")],
"label": "Bildeplassering",
},
),
17: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{
"header": "Overstyr bilde",
"help_text": "Bildet som er tilknyttet undersiden du vil fremheve, vil automatisk brukes. Om det mangler eller du vil overstyre hvilket bilde som et brukes, kan du velge et her.",
"required": False,
},
),
18: (
"wagtail.blocks.StructBlock",
[
[
("title", 11),
("text", 12),
("featured_page", 13),
("link_text", 14),
("background_color", 15),
("image_position", 16),
("featured_image_override", 17),
]
],
{},
),
19: ("dnscms.blocks.PageSectionNavigationBlock", (), {}),
20: (
"wagtail.blocks.CharBlock",
(),
{"label": "Overskrift", "max_length": 64, "required": True},
),
21: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{"label": "Bilde"},
),
22: (
"wagtail.blocks.StreamBlock",
[[("paragraph", 0), ("image", 21)]],
{},
),
23: (
"wagtail.blocks.StructBlock",
[[("heading", 20), ("body", 22)]],
{},
),
24: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
"required": False,
},
),
25: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": [
"bold",
"italic",
"link",
"ol",
"ul",
"h2",
"h3",
],
"label": "Innhold",
},
),
26: (
"wagtail.blocks.StructBlock",
[[("background_color", 24), ("body", 25)]],
{},
),
27: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "360°-bilde"},
),
28: (
"wagtail.blocks.CharBlock",
(),
{
"help_text": "Beskrivende tittel på bildet (vises også til skjermlesere)",
"label": "Tittel",
"max_length": 256,
},
),
29: (
"wagtail.blocks.StructBlock",
[[("image", 27), ("title", 28)]],
{},
),
30: ("wagtail.embeds.blocks.EmbedBlock", (), {}),
31: ("wagtail.blocks.RawHTMLBlock", (), {}),
},
default=[("paragraph", "")],
),
),
migrations.AlterField(
model_name="associationpage",
name="body",
field=wagtail.fields.StreamField(
[
("paragraph", 0),
("image", 4),
("image_slider", 8),
("horizontal_rule", 10),
("featured", 18),
("page_section_navigation", 19),
("accordion", 23),
("fact_box", 26),
("photo_sphere", 29),
("embed", 30),
("raw_html", 31),
],
block_lookup={
0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rik tekst"}),
1: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "Bilde"},
),
2: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("fullwidth", "Fullbredde"),
("bleed", "Utfallende"),
("original", "Uendret størrelse"),
],
"icon": "cup",
"label": "Bildeformat",
},
),
3: (
"wagtail.blocks.CharBlock",
(),
{"label": "Bildetekst", "max_length": 512, "required": False},
),
4: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{},
),
5: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tekst", "max_length": 512, "required": False},
),
6: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("text", 5)]],
{},
),
7: (
"wagtail.blocks.ListBlock",
(6,),
{"label": "Bilder", "min_num": 1},
),
8: ("wagtail.blocks.StructBlock", [[("images", 7)]], {}),
9: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Farge",
"required": False,
},
),
10: ("wagtail.blocks.StructBlock", [[("color", 9)]], {}),
11: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tittel", "max_length": 64, "required": True},
),
12: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": ["bold", "italic", "link"],
"label": "Tekst",
"required": True,
},
),
13: (
"wagtail.blocks.PageChooserBlock",
(),
{"header": "Fremhevet side", "required": True},
),
14: (
"wagtail.blocks.CharBlock",
(),
{
"default": "Les mer",
"help_text": 'Lenketeksten som tar deg videre til siden. Tips: Ikke start med "Trykk her"',
"label": "Lenketekst",
"max_length": 64,
"required": True,
},
),
15: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
},
),
16: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [("left", "Venstre"), ("right", "Høyre")],
"label": "Bildeplassering",
},
),
17: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{
"header": "Overstyr bilde",
"help_text": "Bildet som er tilknyttet undersiden du vil fremheve, vil automatisk brukes. Om det mangler eller du vil overstyre hvilket bilde som et brukes, kan du velge et her.",
"required": False,
},
),
18: (
"wagtail.blocks.StructBlock",
[
[
("title", 11),
("text", 12),
("featured_page", 13),
("link_text", 14),
("background_color", 15),
("image_position", 16),
("featured_image_override", 17),
]
],
{},
),
19: ("dnscms.blocks.PageSectionNavigationBlock", (), {}),
20: (
"wagtail.blocks.CharBlock",
(),
{"label": "Overskrift", "max_length": 64, "required": True},
),
21: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{"label": "Bilde"},
),
22: (
"wagtail.blocks.StreamBlock",
[[("paragraph", 0), ("image", 21)]],
{},
),
23: (
"wagtail.blocks.StructBlock",
[[("heading", 20), ("body", 22)]],
{},
),
24: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
"required": False,
},
),
25: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": [
"bold",
"italic",
"link",
"ol",
"ul",
"h2",
"h3",
],
"label": "Innhold",
},
),
26: (
"wagtail.blocks.StructBlock",
[[("background_color", 24), ("body", 25)]],
{},
),
27: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "360°-bilde"},
),
28: (
"wagtail.blocks.CharBlock",
(),
{
"help_text": "Beskrivende tittel på bildet (vises også til skjermlesere)",
"label": "Tittel",
"max_length": 256,
},
),
29: (
"wagtail.blocks.StructBlock",
[[("image", 27), ("title", 28)]],
{},
),
30: ("wagtail.embeds.blocks.EmbedBlock", (), {}),
31: ("wagtail.blocks.RawHTMLBlock", (), {}),
},
default=[("paragraph", "")],
),
),
]
+1 -3
View File
@@ -10,9 +10,9 @@ from wagtail.admin.panels import FieldPanel
from wagtail.fields import RichTextField
from wagtail.models import Page
from wagtail.search import index
from wagtail_wordpress_import.models import WPImportedPageMixin
from dnscms.fields import CommonStreamField
from dnscms.wordpress.models import WPImportedPageMixin
@register_singular_query_field("associationIndex")
@@ -88,8 +88,6 @@ class AssociationPage(WPImportedPageMixin, Page):
index.SearchField("body"),
]
settings_panels = Page.settings_panels + WPImportedPageMixin.wordpress_panels
def import_wordpress_data(self, data):
import html
@@ -0,0 +1,289 @@
# Generated by Django 6.0.3 on 2026-04-15 20:21
import wagtail.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("contacts", "0017_alter_contactindex_body"),
]
operations = [
migrations.AlterField(
model_name="contactindex",
name="body",
field=wagtail.fields.StreamField(
[
("paragraph", 0),
("image", 4),
("image_slider", 8),
("horizontal_rule", 10),
("featured", 18),
("page_section_navigation", 19),
("accordion", 23),
("fact_box", 26),
("photo_sphere", 29),
("embed", 30),
("raw_html", 31),
("contact_section", 39),
],
block_lookup={
0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rik tekst"}),
1: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "Bilde"},
),
2: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("fullwidth", "Fullbredde"),
("bleed", "Utfallende"),
("original", "Uendret størrelse"),
],
"icon": "cup",
"label": "Bildeformat",
},
),
3: (
"wagtail.blocks.CharBlock",
(),
{"label": "Bildetekst", "max_length": 512, "required": False},
),
4: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{},
),
5: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tekst", "max_length": 512, "required": False},
),
6: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("text", 5)]],
{},
),
7: (
"wagtail.blocks.ListBlock",
(6,),
{"label": "Bilder", "min_num": 1},
),
8: ("wagtail.blocks.StructBlock", [[("images", 7)]], {}),
9: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Farge",
"required": False,
},
),
10: ("wagtail.blocks.StructBlock", [[("color", 9)]], {}),
11: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tittel", "max_length": 64, "required": True},
),
12: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": ["bold", "italic", "link"],
"label": "Tekst",
"required": True,
},
),
13: (
"wagtail.blocks.PageChooserBlock",
(),
{"header": "Fremhevet side", "required": True},
),
14: (
"wagtail.blocks.CharBlock",
(),
{
"default": "Les mer",
"help_text": 'Lenketeksten som tar deg videre til siden. Tips: Ikke start med "Trykk her"',
"label": "Lenketekst",
"max_length": 64,
"required": True,
},
),
15: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
},
),
16: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [("left", "Venstre"), ("right", "Høyre")],
"label": "Bildeplassering",
},
),
17: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{
"header": "Overstyr bilde",
"help_text": "Bildet som er tilknyttet undersiden du vil fremheve, vil automatisk brukes. Om det mangler eller du vil overstyre hvilket bilde som et brukes, kan du velge et her.",
"required": False,
},
),
18: (
"wagtail.blocks.StructBlock",
[
[
("title", 11),
("text", 12),
("featured_page", 13),
("link_text", 14),
("background_color", 15),
("image_position", 16),
("featured_image_override", 17),
]
],
{},
),
19: ("dnscms.blocks.PageSectionNavigationBlock", (), {}),
20: (
"wagtail.blocks.CharBlock",
(),
{"label": "Overskrift", "max_length": 64, "required": True},
),
21: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{"label": "Bilde"},
),
22: (
"wagtail.blocks.StreamBlock",
[[("paragraph", 0), ("image", 21)]],
{},
),
23: (
"wagtail.blocks.StructBlock",
[[("heading", 20), ("body", 22)]],
{},
),
24: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
"required": False,
},
),
25: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": [
"bold",
"italic",
"link",
"ol",
"ul",
"h2",
"h3",
],
"label": "Innhold",
},
),
26: (
"wagtail.blocks.StructBlock",
[[("background_color", 24), ("body", 25)]],
{},
),
27: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "360°-bilde"},
),
28: (
"wagtail.blocks.CharBlock",
(),
{
"help_text": "Beskrivende tittel på bildet (vises også til skjermlesere)",
"label": "Tittel",
"max_length": 256,
},
),
29: (
"wagtail.blocks.StructBlock",
[[("image", 27), ("title", 28)]],
{},
),
30: ("wagtail.embeds.blocks.EmbedBlock", (), {}),
31: ("wagtail.blocks.RawHTMLBlock", (), {}),
32: (
"wagtail.blocks.RichTextBlock",
(),
{"features": ["bold", "italic", "link"]},
),
33: (
"wagtail.snippets.blocks.SnippetChooserBlock",
("contacts.ContactEntity",),
{},
),
34: ("wagtail.blocks.StructBlock", [[("contact_entity", 33)]], {}),
35: (
"contacts.blocks.ContactListBlock",
(34,),
{"label": "Liste med kontaktpunkter"},
),
36: (
"wagtail.blocks.StreamBlock",
[[("contact_entity_list", 35)]],
{"required": False},
),
37: (
"wagtail.blocks.StructBlock",
[[("title", 11), ("text", 32), ("blocks", 36)]],
{"label": "Kontaktunderseksjon"},
),
38: (
"wagtail.blocks.StreamBlock",
[[("contact_entity_list", 35), ("contact_subsection", 37)]],
{"required": False},
),
39: (
"wagtail.blocks.StructBlock",
[[("title", 11), ("text", 32), ("blocks", 38)]],
{"label": "Kontaktseksjon"},
),
},
),
),
]
+20
View File
@@ -203,6 +203,25 @@ class AccordionBlock(blocks.StructBlock):
label = "Trekkspill"
@register_streamfield_block
class PhotoSphereBlock(blocks.StructBlock):
image = ImageChooserBlock(label="360°-bilde")
title = blocks.CharBlock(
max_length=512,
label="Bildetekst",
required=False,
)
graphql_fields = [
GraphQLImage("image", required=True),
GraphQLString("title", required=False),
]
class Meta:
icon = "globe"
label = "360°-bilde"
@register_streamfield_block
class FactBoxBlock(blocks.StructBlock):
background_color = blocks.ChoiceBlock(
@@ -234,6 +253,7 @@ BASE_BLOCKS = [
("page_section_navigation", PageSectionNavigationBlock()),
("accordion", AccordionBlock()),
("fact_box", FactBoxBlock()),
("photo_sphere", PhotoSphereBlock()),
("embed", EmbedBlock()),
("raw_html", blocks.RawHTMLBlock()),
]
+8 -1
View File
@@ -36,8 +36,8 @@ INSTALLED_APPS = [
"venues",
"news",
"openinghours",
"sponsors",
# end cms apps
"wagtail_wordpress_import",
"grapple",
"graphene_django",
"wagtail.contrib.forms",
@@ -61,6 +61,7 @@ INSTALLED_APPS = [
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"django.contrib.postgres",
]
MIDDLEWARE = [
@@ -188,6 +189,9 @@ WAGTAILADMIN_BASE_URL = "http://example.com"
# Required by wagtail-grapple to make image URLs absolute
BASE_URL = "http://example.com"
# https://docs.wagtail.org/en/latest/releases/6.4.html#data-upload-max-number-fields-update
DATA_UPLOAD_MAX_NUMBER_FIELDS = 10_000
# GraphQL
GRAPHENE = {"SCHEMA": "grapple.schema.schema"}
GRAPPLE = {
@@ -201,8 +205,11 @@ GRAPPLE = {
"venues",
"news",
"openinghours",
"sponsors",
],
"EXPOSE_GRAPHIQL": True,
"PAGE_SIZE": 100,
"MAX_PAGE_SIZE": 5000,
}
# Wgtail WordPress import
+17
View File
@@ -0,0 +1,17 @@
from django.db import models
from wagtail.models import Page
# https://github.com/wagtail/wagtail-wordpress-import/blob/main/wagtail_wordpress_import/models.py
class WPImportedPageMixin(Page):
wp_post_id = models.IntegerField(blank=True, null=True)
wp_post_type = models.CharField(max_length=255, blank=True, null=True)
wp_link = models.TextField(blank=True, null=True)
wp_raw_content = models.TextField(blank=True, null=True)
wp_processed_content = models.TextField(blank=True, null=True)
wp_block_json = models.TextField(blank=True, null=True)
wp_normalized_styles = models.TextField(blank=True, null=True)
wp_post_meta = models.JSONField(blank=True, null=True)
class Meta:
abstract = True
@@ -0,0 +1,253 @@
# Generated by Django 6.0.3 on 2026-04-15 20:21
import wagtail.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("events", "0053_eventpage_lead"),
]
operations = [
migrations.AlterField(
model_name="eventpage",
name="body",
field=wagtail.fields.StreamField(
[
("paragraph", 0),
("image", 4),
("image_slider", 8),
("horizontal_rule", 10),
("featured", 18),
("page_section_navigation", 19),
("accordion", 23),
("fact_box", 26),
("photo_sphere", 29),
("embed", 30),
("raw_html", 31),
],
block_lookup={
0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rik tekst"}),
1: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "Bilde"},
),
2: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("fullwidth", "Fullbredde"),
("bleed", "Utfallende"),
("original", "Uendret størrelse"),
],
"icon": "cup",
"label": "Bildeformat",
},
),
3: (
"wagtail.blocks.CharBlock",
(),
{"label": "Bildetekst", "max_length": 512, "required": False},
),
4: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{},
),
5: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tekst", "max_length": 512, "required": False},
),
6: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("text", 5)]],
{},
),
7: (
"wagtail.blocks.ListBlock",
(6,),
{"label": "Bilder", "min_num": 1},
),
8: ("wagtail.blocks.StructBlock", [[("images", 7)]], {}),
9: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Farge",
"required": False,
},
),
10: ("wagtail.blocks.StructBlock", [[("color", 9)]], {}),
11: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tittel", "max_length": 64, "required": True},
),
12: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": ["bold", "italic", "link"],
"label": "Tekst",
"required": True,
},
),
13: (
"wagtail.blocks.PageChooserBlock",
(),
{"header": "Fremhevet side", "required": True},
),
14: (
"wagtail.blocks.CharBlock",
(),
{
"default": "Les mer",
"help_text": 'Lenketeksten som tar deg videre til siden. Tips: Ikke start med "Trykk her"',
"label": "Lenketekst",
"max_length": 64,
"required": True,
},
),
15: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
},
),
16: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [("left", "Venstre"), ("right", "Høyre")],
"label": "Bildeplassering",
},
),
17: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{
"header": "Overstyr bilde",
"help_text": "Bildet som er tilknyttet undersiden du vil fremheve, vil automatisk brukes. Om det mangler eller du vil overstyre hvilket bilde som et brukes, kan du velge et her.",
"required": False,
},
),
18: (
"wagtail.blocks.StructBlock",
[
[
("title", 11),
("text", 12),
("featured_page", 13),
("link_text", 14),
("background_color", 15),
("image_position", 16),
("featured_image_override", 17),
]
],
{},
),
19: ("dnscms.blocks.PageSectionNavigationBlock", (), {}),
20: (
"wagtail.blocks.CharBlock",
(),
{"label": "Overskrift", "max_length": 64, "required": True},
),
21: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{"label": "Bilde"},
),
22: (
"wagtail.blocks.StreamBlock",
[[("paragraph", 0), ("image", 21)]],
{},
),
23: (
"wagtail.blocks.StructBlock",
[[("heading", 20), ("body", 22)]],
{},
),
24: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
"required": False,
},
),
25: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": [
"bold",
"italic",
"link",
"ol",
"ul",
"h2",
"h3",
],
"label": "Innhold",
},
),
26: (
"wagtail.blocks.StructBlock",
[[("background_color", 24), ("body", 25)]],
{},
),
27: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "360°-bilde"},
),
28: (
"wagtail.blocks.CharBlock",
(),
{
"help_text": "Beskrivende tittel på bildet (vises også til skjermlesere)",
"label": "Tittel",
"max_length": 256,
},
),
29: (
"wagtail.blocks.StructBlock",
[[("image", 27), ("title", 28)]],
{},
),
30: ("wagtail.embeds.blocks.EmbedBlock", (), {}),
31: ("wagtail.blocks.RawHTMLBlock", (), {}),
},
default=[("paragraph", "")],
),
),
]
+2 -4
View File
@@ -30,11 +30,11 @@ from wagtail.fields import RichTextField
from wagtail.models import Orderable, Page, PageManager, PageQuerySet
from wagtail.search import index
from wagtail.snippets.models import register_snippet
from wagtail_wordpress_import.models import WPImportedPageMixin
from associations.widgets import AssociationChooserWidget
from dnscms.fields import CommonStreamField
from dnscms.options import ALL_PIGS
from dnscms.wordpress.models import WPImportedPageMixin
from venues.models import VenuePage
@@ -406,14 +406,12 @@ class EventPage(WPImportedPageMixin, Page):
self.price_student = ""
self.price_member = ""
settings_panels = Page.settings_panels + WPImportedPageMixin.wordpress_panels
def import_wordpress_data(self, data):
import datetime
import html
from zoneinfo import ZoneInfo
from django.core.validators import URLValidator
from zoneinfo import ZoneInfo
validate_url = URLValidator(schemes=["http", "https"])
@@ -0,0 +1,308 @@
# Generated by Django 6.0.3 on 2026-04-15 20:21
import wagtail.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("generic", "0026_alter_genericpage_body"),
]
operations = [
migrations.AlterField(
model_name="genericpage",
name="body",
field=wagtail.fields.StreamField(
[
("paragraph", 0),
("image", 4),
("image_slider", 8),
("horizontal_rule", 10),
("featured", 18),
("page_section_navigation", 19),
("accordion", 23),
("fact_box", 26),
("photo_sphere", 29),
("embed", 30),
("raw_html", 31),
("page_section", 36),
],
block_lookup={
0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rik tekst"}),
1: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "Bilde"},
),
2: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("fullwidth", "Fullbredde"),
("bleed", "Utfallende"),
("original", "Uendret størrelse"),
],
"icon": "cup",
"label": "Bildeformat",
},
),
3: (
"wagtail.blocks.CharBlock",
(),
{"label": "Bildetekst", "max_length": 512, "required": False},
),
4: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{},
),
5: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tekst", "max_length": 512, "required": False},
),
6: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("text", 5)]],
{},
),
7: (
"wagtail.blocks.ListBlock",
(6,),
{"label": "Bilder", "min_num": 1},
),
8: ("wagtail.blocks.StructBlock", [[("images", 7)]], {}),
9: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Farge",
"required": False,
},
),
10: ("wagtail.blocks.StructBlock", [[("color", 9)]], {}),
11: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tittel", "max_length": 64, "required": True},
),
12: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": ["bold", "italic", "link"],
"label": "Tekst",
"required": True,
},
),
13: (
"wagtail.blocks.PageChooserBlock",
(),
{"header": "Fremhevet side", "required": True},
),
14: (
"wagtail.blocks.CharBlock",
(),
{
"default": "Les mer",
"help_text": 'Lenketeksten som tar deg videre til siden. Tips: Ikke start med "Trykk her"',
"label": "Lenketekst",
"max_length": 64,
"required": True,
},
),
15: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
},
),
16: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [("left", "Venstre"), ("right", "Høyre")],
"label": "Bildeplassering",
},
),
17: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{
"header": "Overstyr bilde",
"help_text": "Bildet som er tilknyttet undersiden du vil fremheve, vil automatisk brukes. Om det mangler eller du vil overstyre hvilket bilde som et brukes, kan du velge et her.",
"required": False,
},
),
18: (
"wagtail.blocks.StructBlock",
[
[
("title", 11),
("text", 12),
("featured_page", 13),
("link_text", 14),
("background_color", 15),
("image_position", 16),
("featured_image_override", 17),
]
],
{},
),
19: ("dnscms.blocks.PageSectionNavigationBlock", (), {}),
20: (
"wagtail.blocks.CharBlock",
(),
{"label": "Overskrift", "max_length": 64, "required": True},
),
21: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{"label": "Bilde"},
),
22: (
"wagtail.blocks.StreamBlock",
[[("paragraph", 0), ("image", 21)]],
{},
),
23: (
"wagtail.blocks.StructBlock",
[[("heading", 20), ("body", 22)]],
{},
),
24: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
"required": False,
},
),
25: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": [
"bold",
"italic",
"link",
"ol",
"ul",
"h2",
"h3",
],
"label": "Innhold",
},
),
26: (
"wagtail.blocks.StructBlock",
[[("background_color", 24), ("body", 25)]],
{},
),
27: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "360°-bilde"},
),
28: (
"wagtail.blocks.CharBlock",
(),
{
"help_text": "Beskrivende tittel på bildet (vises også til skjermlesere)",
"label": "Tittel",
"max_length": 256,
},
),
29: (
"wagtail.blocks.StructBlock",
[[("image", 27), ("title", 28)]],
{},
),
30: ("wagtail.embeds.blocks.EmbedBlock", (), {}),
31: ("wagtail.blocks.RawHTMLBlock", (), {}),
32: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("pigHeadLogo", "Grisehodelogo"),
("key", "Nøkkel"),
("ticket", "Billett"),
("shield", "Skjold"),
("bottle", "Flaske"),
("lostProperty", "Hittegods"),
("pigsty", "Grisebinge"),
("wheelchair", "Rullestol"),
("clock", "Klokke"),
("parking", "Parkering"),
("coins", "Mynter"),
],
"label": "Ikon",
"required": False,
},
),
33: ("dnscms.blocks.NeufAddressSectionBlock", (), {}),
34: ("dnscms.blocks.OpeningHoursSectionBlock", (), {}),
35: (
"wagtail.blocks.StreamBlock",
[
[
("paragraph", 0),
("image", 4),
("image_slider", 8),
("horizontal_rule", 10),
("featured", 18),
("accordion", 23),
("fact_box", 26),
("photo_sphere", 29),
("embed", 30),
("raw_html", 31),
("neuf_address", 33),
("opening_hours", 34),
]
],
{},
),
36: (
"wagtail.blocks.StructBlock",
[
[
("title", 11),
("background_color", 24),
("icon", 32),
("body", 35),
]
],
{},
),
},
),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 5.2.5 on 2025-08-12 21:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('images', '0004_alter_customimage_alt_alter_customimage_attribution'),
]
operations = [
migrations.AddField(
model_name='customimage',
name='description',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='description'),
),
]
+3
View File
@@ -0,0 +1,3 @@
[tools]
python = "3.14"
uv = "latest"
@@ -0,0 +1,253 @@
# Generated by Django 6.0.3 on 2026-04-15 20:21
import wagtail.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("news", "0018_newspage_wp_block_json_newspage_wp_link_and_more"),
]
operations = [
migrations.AlterField(
model_name="newspage",
name="body",
field=wagtail.fields.StreamField(
[
("paragraph", 0),
("image", 4),
("image_slider", 8),
("horizontal_rule", 10),
("featured", 18),
("page_section_navigation", 19),
("accordion", 23),
("fact_box", 26),
("photo_sphere", 29),
("embed", 30),
("raw_html", 31),
],
block_lookup={
0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rik tekst"}),
1: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "Bilde"},
),
2: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("fullwidth", "Fullbredde"),
("bleed", "Utfallende"),
("original", "Uendret størrelse"),
],
"icon": "cup",
"label": "Bildeformat",
},
),
3: (
"wagtail.blocks.CharBlock",
(),
{"label": "Bildetekst", "max_length": 512, "required": False},
),
4: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{},
),
5: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tekst", "max_length": 512, "required": False},
),
6: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("text", 5)]],
{},
),
7: (
"wagtail.blocks.ListBlock",
(6,),
{"label": "Bilder", "min_num": 1},
),
8: ("wagtail.blocks.StructBlock", [[("images", 7)]], {}),
9: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Farge",
"required": False,
},
),
10: ("wagtail.blocks.StructBlock", [[("color", 9)]], {}),
11: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tittel", "max_length": 64, "required": True},
),
12: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": ["bold", "italic", "link"],
"label": "Tekst",
"required": True,
},
),
13: (
"wagtail.blocks.PageChooserBlock",
(),
{"header": "Fremhevet side", "required": True},
),
14: (
"wagtail.blocks.CharBlock",
(),
{
"default": "Les mer",
"help_text": 'Lenketeksten som tar deg videre til siden. Tips: Ikke start med "Trykk her"',
"label": "Lenketekst",
"max_length": 64,
"required": True,
},
),
15: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
},
),
16: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [("left", "Venstre"), ("right", "Høyre")],
"label": "Bildeplassering",
},
),
17: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{
"header": "Overstyr bilde",
"help_text": "Bildet som er tilknyttet undersiden du vil fremheve, vil automatisk brukes. Om det mangler eller du vil overstyre hvilket bilde som et brukes, kan du velge et her.",
"required": False,
},
),
18: (
"wagtail.blocks.StructBlock",
[
[
("title", 11),
("text", 12),
("featured_page", 13),
("link_text", 14),
("background_color", 15),
("image_position", 16),
("featured_image_override", 17),
]
],
{},
),
19: ("dnscms.blocks.PageSectionNavigationBlock", (), {}),
20: (
"wagtail.blocks.CharBlock",
(),
{"label": "Overskrift", "max_length": 64, "required": True},
),
21: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{"label": "Bilde"},
),
22: (
"wagtail.blocks.StreamBlock",
[[("paragraph", 0), ("image", 21)]],
{},
),
23: (
"wagtail.blocks.StructBlock",
[[("heading", 20), ("body", 22)]],
{},
),
24: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
"required": False,
},
),
25: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": [
"bold",
"italic",
"link",
"ol",
"ul",
"h2",
"h3",
],
"label": "Innhold",
},
),
26: (
"wagtail.blocks.StructBlock",
[[("background_color", 24), ("body", 25)]],
{},
),
27: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "360°-bilde"},
),
28: (
"wagtail.blocks.CharBlock",
(),
{
"help_text": "Beskrivende tittel på bildet (vises også til skjermlesere)",
"label": "Tittel",
"max_length": 256,
},
),
29: (
"wagtail.blocks.StructBlock",
[[("image", 27), ("title", 28)]],
{},
),
30: ("wagtail.embeds.blocks.EmbedBlock", (), {}),
31: ("wagtail.blocks.RawHTMLBlock", (), {}),
},
default=[("paragraph", "")],
),
),
]
+1 -3
View File
@@ -5,9 +5,9 @@ from wagtail.admin.panels import FieldPanel
from wagtail.fields import RichTextField
from wagtail.models import Page
from wagtail.search import index
from wagtail_wordpress_import.models import WPImportedPageMixin
from dnscms.fields import CommonStreamField
from dnscms.wordpress.models import WPImportedPageMixin
@register_singular_query_field("newsIndex")
@@ -76,8 +76,6 @@ class NewsPage(WPImportedPageMixin, Page):
index.SearchField("body"),
]
settings_panels = Page.settings_panels + WPImportedPageMixin.wordpress_panels
def import_wordpress_data(self, data):
import html
+2 -1
View File
@@ -6,7 +6,8 @@ from modelcluster.fields import ParentalKey
from modelcluster.models import ClusterableModel
from wagtail import blocks
from wagtail.admin.panels import FieldPanel, InlinePanel, MultiFieldPanel, TitleFieldPanel
from wagtail.models import Orderable, StreamField
from wagtail.fields import StreamField
from wagtail.models import Orderable
from wagtail.snippets.models import register_snippet
-1220
View File
File diff suppressed because it is too large Load Diff
+22 -18
View File
@@ -1,23 +1,31 @@
[tool.poetry]
[project]
name = "dnscms"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
authors = [{ name = "EDB", email = "edb@neuf.no" }]
requires-python = ">=3.14, <3.15"
readme = "README.md"
package-mode = false
dependencies = [
"wagtail>=7.3.1",
"wagtail-grapple>=0.29.0",
"django>=6.0.3",
"django-extensions>=4.1",
"psycopg2-binary>=2.9.11,<3",
"gunicorn>=25.1.0",
"whitenoise>=6.12.0",
]
[tool.poetry.dependencies]
python = "^3.12"
wagtail = "^6.1.3"
django = "^5.0.7"
wagtail-grapple = "^0.26.0"
psycopg2-binary = "^2.9.9"
django-extensions = "^3.2.3"
wagtail-wordpress-import = { git = "https://github.com/ponas/wagtail-wordpress-import.git", branch = "make-it-work" }
whitenoise = "^6.7.0"
[dependency-groups]
dev = [
"ruff>=0.15.1",
]
[tool.poetry.group.dev.dependencies]
ruff = "*"
[tool.uv]
package = false
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.ruff]
line-length = 99
@@ -26,7 +34,3 @@ line-length = 99
select = ["F", "E", "W", "Q", "UP", "DJ"]
ignore = []
exclude = ["**/migrations/*.py"]
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
View File
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class SponsorsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'sponsors'
@@ -0,0 +1,30 @@
# Generated by Django 5.1 on 2025-07-23 08:42
import django.db.models.deletion
import wagtail.fields
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('wagtailcore', '0094_alter_page_locale'),
]
operations = [
migrations.CreateModel(
name='SponsorsPage',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')),
('lead', wagtail.fields.RichTextField(blank=True)),
('sponsors', wagtail.fields.StreamField([('sponsor', 4)], blank=True, block_lookup={0: ('wagtail.blocks.CharBlock', (), {'label': 'Navn', 'max_length': 255}), 1: ('wagtail.images.blocks.ImageChooserBlock', (), {'label': 'Logo', 'required': False}), 2: ('wagtail.blocks.URLBlock', (), {'label': 'Nettside', 'required': False}), 3: ('wagtail.blocks.RichTextBlock', (), {'features': ['bold', 'italic', 'link', 'ul', 'ol'], 'label': 'Beskrivelse', 'required': False}), 4: ('wagtail.blocks.StructBlock', [[('name', 0), ('logo', 1), ('website', 2), ('text', 3)]], {})})),
('body', wagtail.fields.StreamField([('paragraph', 0), ('image', 4), ('image_slider', 8), ('horizontal_rule', 10), ('featured', 18), ('page_section_navigation', 19), ('accordion', 23), ('fact_box', 26), ('embed', 27), ('raw_html', 28)], block_lookup={0: ('wagtail.blocks.RichTextBlock', (), {'label': 'Rik tekst'}), 1: ('wagtail.images.blocks.ImageChooserBlock', (), {'label': 'Bilde'}), 2: ('wagtail.blocks.ChoiceBlock', [], {'choices': [('fullwidth', 'Fullbredde'), ('bleed', 'Utfallende'), ('original', 'Uendret størrelse')], 'icon': 'cup', 'label': 'Bildeformat'}), 3: ('wagtail.blocks.CharBlock', (), {'label': 'Bildetekst', 'max_length': 512, 'required': False}), 4: ('wagtail.blocks.StructBlock', [[('image', 1), ('image_format', 2), ('text', 3)]], {}), 5: ('wagtail.blocks.CharBlock', (), {'label': 'Tekst', 'max_length': 512, 'required': False}), 6: ('wagtail.blocks.StructBlock', [[('image', 1), ('text', 5)]], {}), 7: ('wagtail.blocks.ListBlock', (6,), {'label': 'Bilder', 'min_num': 1}), 8: ('wagtail.blocks.StructBlock', [[('images', 7)]], {}), 9: ('wagtail.blocks.ChoiceBlock', [], {'choices': [('deepBrick', 'Dyp tegl'), ('neufPink', 'Griserosa'), ('goldenOrange', 'Gyllen oransje'), ('goldenBeige', 'Gyllen beige'), ('chateauBlue', 'Slottsblå')], 'label': 'Farge', 'required': False}), 10: ('wagtail.blocks.StructBlock', [[('color', 9)]], {}), 11: ('wagtail.blocks.CharBlock', (), {'label': 'Tittel', 'max_length': 64, 'required': True}), 12: ('wagtail.blocks.RichTextBlock', (), {'features': ['bold', 'italic', 'link'], 'label': 'Tekst', 'required': True}), 13: ('wagtail.blocks.PageChooserBlock', (), {'header': 'Fremhevet side', 'required': True}), 14: ('wagtail.blocks.CharBlock', (), {'default': 'Les mer', 'help_text': 'Lenketeksten som tar deg videre til siden. Tips: Ikke start med "Trykk her"', 'label': 'Lenketekst', 'max_length': 64, 'required': True}), 15: ('wagtail.blocks.ChoiceBlock', [], {'choices': [('betongGray', 'Betonggrå'), ('deepBrick', 'Dyp tegl'), ('neufPink', 'Griserosa'), ('goldenOrange', 'Gyllen oransje'), ('goldenBeige', 'Gyllen beige'), ('chateauBlue', 'Slottsblå')], 'label': 'Bakgrunnsfarge'}), 16: ('wagtail.blocks.ChoiceBlock', [], {'choices': [('left', 'Venstre'), ('right', 'Høyre')], 'label': 'Bildeplassering'}), 17: ('wagtail.images.blocks.ImageChooserBlock', (), {'header': 'Overstyr bilde', 'help_text': 'Bildet som er tilknyttet undersiden du vil fremheve, vil automatisk brukes. Om det mangler eller du vil overstyre hvilket bilde som et brukes, kan du velge et her.', 'required': False}), 18: ('wagtail.blocks.StructBlock', [[('title', 11), ('text', 12), ('featured_page', 13), ('link_text', 14), ('background_color', 15), ('image_position', 16), ('featured_image_override', 17)]], {}), 19: ('dnscms.blocks.PageSectionNavigationBlock', (), {}), 20: ('wagtail.blocks.CharBlock', (), {'label': 'Overskrift', 'max_length': 64, 'required': True}), 21: ('wagtail.blocks.StructBlock', [[('image', 1), ('image_format', 2), ('text', 3)]], {'label': 'Bilde'}), 22: ('wagtail.blocks.StreamBlock', [[('paragraph', 0), ('image', 21)]], {}), 23: ('wagtail.blocks.StructBlock', [[('heading', 20), ('body', 22)]], {}), 24: ('wagtail.blocks.ChoiceBlock', [], {'choices': [('betongGray', 'Betonggrå'), ('deepBrick', 'Dyp tegl'), ('neufPink', 'Griserosa'), ('goldenOrange', 'Gyllen oransje'), ('goldenBeige', 'Gyllen beige'), ('chateauBlue', 'Slottsblå')], 'label': 'Bakgrunnsfarge', 'required': False}), 25: ('wagtail.blocks.RichTextBlock', (), {'features': ['bold', 'italic', 'link', 'ol', 'ul', 'h2', 'h3'], 'label': 'Innhold'}), 26: ('wagtail.blocks.StructBlock', [[('background_color', 24), ('body', 25)]], {}), 27: ('wagtail.embeds.blocks.EmbedBlock', (), {}), 28: ('wagtail.blocks.RawHTMLBlock', (), {})})),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
]
@@ -0,0 +1,252 @@
# Generated by Django 6.0.3 on 2026-04-15 20:21
import wagtail.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("sponsors", "0001_initial"),
]
operations = [
migrations.AlterField(
model_name="sponsorspage",
name="body",
field=wagtail.fields.StreamField(
[
("paragraph", 0),
("image", 4),
("image_slider", 8),
("horizontal_rule", 10),
("featured", 18),
("page_section_navigation", 19),
("accordion", 23),
("fact_box", 26),
("photo_sphere", 29),
("embed", 30),
("raw_html", 31),
],
block_lookup={
0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rik tekst"}),
1: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "Bilde"},
),
2: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("fullwidth", "Fullbredde"),
("bleed", "Utfallende"),
("original", "Uendret størrelse"),
],
"icon": "cup",
"label": "Bildeformat",
},
),
3: (
"wagtail.blocks.CharBlock",
(),
{"label": "Bildetekst", "max_length": 512, "required": False},
),
4: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{},
),
5: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tekst", "max_length": 512, "required": False},
),
6: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("text", 5)]],
{},
),
7: (
"wagtail.blocks.ListBlock",
(6,),
{"label": "Bilder", "min_num": 1},
),
8: ("wagtail.blocks.StructBlock", [[("images", 7)]], {}),
9: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Farge",
"required": False,
},
),
10: ("wagtail.blocks.StructBlock", [[("color", 9)]], {}),
11: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tittel", "max_length": 64, "required": True},
),
12: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": ["bold", "italic", "link"],
"label": "Tekst",
"required": True,
},
),
13: (
"wagtail.blocks.PageChooserBlock",
(),
{"header": "Fremhevet side", "required": True},
),
14: (
"wagtail.blocks.CharBlock",
(),
{
"default": "Les mer",
"help_text": 'Lenketeksten som tar deg videre til siden. Tips: Ikke start med "Trykk her"',
"label": "Lenketekst",
"max_length": 64,
"required": True,
},
),
15: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
},
),
16: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [("left", "Venstre"), ("right", "Høyre")],
"label": "Bildeplassering",
},
),
17: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{
"header": "Overstyr bilde",
"help_text": "Bildet som er tilknyttet undersiden du vil fremheve, vil automatisk brukes. Om det mangler eller du vil overstyre hvilket bilde som et brukes, kan du velge et her.",
"required": False,
},
),
18: (
"wagtail.blocks.StructBlock",
[
[
("title", 11),
("text", 12),
("featured_page", 13),
("link_text", 14),
("background_color", 15),
("image_position", 16),
("featured_image_override", 17),
]
],
{},
),
19: ("dnscms.blocks.PageSectionNavigationBlock", (), {}),
20: (
"wagtail.blocks.CharBlock",
(),
{"label": "Overskrift", "max_length": 64, "required": True},
),
21: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{"label": "Bilde"},
),
22: (
"wagtail.blocks.StreamBlock",
[[("paragraph", 0), ("image", 21)]],
{},
),
23: (
"wagtail.blocks.StructBlock",
[[("heading", 20), ("body", 22)]],
{},
),
24: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
"required": False,
},
),
25: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": [
"bold",
"italic",
"link",
"ol",
"ul",
"h2",
"h3",
],
"label": "Innhold",
},
),
26: (
"wagtail.blocks.StructBlock",
[[("background_color", 24), ("body", 25)]],
{},
),
27: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "360°-bilde"},
),
28: (
"wagtail.blocks.CharBlock",
(),
{
"help_text": "Beskrivende tittel på bildet (vises også til skjermlesere)",
"label": "Tittel",
"max_length": 256,
},
),
29: (
"wagtail.blocks.StructBlock",
[[("image", 27), ("title", 28)]],
{},
),
30: ("wagtail.embeds.blocks.EmbedBlock", (), {}),
31: ("wagtail.blocks.RawHTMLBlock", (), {}),
},
),
),
]
+62
View File
@@ -0,0 +1,62 @@
from grapple.helpers import register_singular_query_field, register_streamfield_block
from grapple.models import GraphQLImage, GraphQLRichText, GraphQLStreamfield, GraphQLString
from wagtail import blocks
from wagtail.admin.panels import (
FieldPanel,
)
from wagtail.fields import RichTextField, StreamField
from wagtail.images.blocks import ImageChooserBlock
from wagtail.models import Page
from wagtail.search import index
from dnscms.blocks import BASE_BLOCKS
@register_streamfield_block
class SponsorBlock(blocks.StructBlock):
name = blocks.CharBlock(max_length=255, label="Navn")
logo = ImageChooserBlock(required=False, label="Logo")
website = blocks.URLBlock(required=False, label="Nettside")
text = blocks.RichTextBlock(
features=["bold", "italic", "link", "ul", "ol"], required=False, label="Beskrivelse"
)
graphql_fields = [
GraphQLString("name", required=False),
GraphQLImage("logo", required=False),
GraphQLString("website", required=False),
GraphQLString("text", required=False),
]
class Meta:
label = "Sponsor"
icon = "tag"
@register_singular_query_field("sponsorsPage")
class SponsorsPage(Page):
max_count = 1
subpage_types = []
lead = RichTextField(features=["italic", "link"], blank=True)
sponsors = StreamField(
[
("sponsor", SponsorBlock()),
],
blank=True,
)
body = StreamField(BASE_BLOCKS)
content_panels = Page.content_panels + [
FieldPanel("lead", heading="Ingress"),
FieldPanel("body", heading="Innhold"),
FieldPanel("sponsors", heading="Sponsorer"),
]
graphql_fields = [
GraphQLRichText("lead"),
GraphQLStreamfield("body"),
GraphQLStreamfield("sponsors"),
]
search_fields = Page.search_fields + [index.SearchField("body"), index.SearchField("sponsors")]
+659
View File
@@ -0,0 +1,659 @@
version = 1
revision = 3
requires-python = "==3.14.*"
[[package]]
name = "anyascii"
version = "0.3.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/db/ba/edebda727008390936da4a9bf677c19cd63b32d51e864656d2cbd1028e25/anyascii-0.3.3.tar.gz", hash = "sha256:c94e9dd9d47b3d9494eca305fef9447d00b4bf1a32aff85aa746fa3ec7fb95c3", size = 264680, upload-time = "2025-06-29T03:33:30.427Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c2/76/783b75a21ce3563b8709050de030ae253853b147bd52e141edc1025aa268/anyascii-0.3.3-py3-none-any.whl", hash = "sha256:f5ab5e53c8781a36b5a40e1296a0eeda2f48c649ef10c3921c1381b1d00dee7a", size = 345090, upload-time = "2025-06-29T03:33:28.356Z" },
]
[[package]]
name = "asgiref"
version = "3.9.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/90/61/0aa957eec22ff70b830b22ff91f825e70e1ef732c06666a805730f28b36b/asgiref-3.9.1.tar.gz", hash = "sha256:a5ab6582236218e5ef1648f242fd9f10626cfd4de8dc377db215d5d5098e3142", size = 36870, upload-time = "2025-07-08T09:07:43.344Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/7c/3c/0464dcada90d5da0e71018c04a140ad6349558afb30b3051b4264cc5b965/asgiref-3.9.1-py3-none-any.whl", hash = "sha256:f3bba7092a48005b5f5bacd747d36ee4a5a61f4a269a6df590b43144355ebd2c", size = 23790, upload-time = "2025-07-08T09:07:41.548Z" },
]
[[package]]
name = "beautifulsoup4"
version = "4.13.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "soupsieve" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload-time = "2025-04-15T17:05:13.836Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" },
]
[[package]]
name = "certifi"
version = "2025.8.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" },
]
[[package]]
name = "charset-normalizer"
version = "3.4.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" },
{ url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" },
{ url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" },
{ url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" },
{ url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" },
{ url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" },
{ url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" },
{ url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" },
{ url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" },
{ url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" },
{ url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" },
{ url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" },
]
[[package]]
name = "defusedxml"
version = "0.7.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" },
]
[[package]]
name = "django"
version = "6.0.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "asgiref" },
{ name = "sqlparse" },
{ name = "tzdata", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/80/e1/894115c6bd70e2c8b66b0c40a3c367d83a5a48c034a4d904d31b62f7c53a/django-6.0.3.tar.gz", hash = "sha256:90be765ee756af8a6cbd6693e56452404b5ad15294f4d5e40c0a55a0f4870fe1", size = 10872701, upload-time = "2026-03-03T13:55:15.026Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/72/b1/23f2556967c45e34d3d3cf032eb1bd3ef925ee458667fb99052a0b3ea3a6/django-6.0.3-py3-none-any.whl", hash = "sha256:2e5974441491ddb34c3f13d5e7a9f97b07ba03bf70234c0a9c68b79bbb235bc3", size = 8358527, upload-time = "2026-03-03T13:55:10.552Z" },
]
[[package]]
name = "django-extensions"
version = "4.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
]
sdist = { url = "https://files.pythonhosted.org/packages/6d/b3/ed0f54ed706ec0b54fd251cc0364a249c6cd6c6ec97f04dc34be5e929eac/django_extensions-4.1.tar.gz", hash = "sha256:7b70a4d28e9b840f44694e3f7feb54f55d495f8b3fa6c5c0e5e12bcb2aa3cdeb", size = 283078, upload-time = "2025-04-11T01:15:39.617Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/64/96/d967ca440d6a8e3861120f51985d8e5aec79b9a8bdda16041206adfe7adc/django_extensions-4.1-py3-none-any.whl", hash = "sha256:0699a7af28f2523bf8db309a80278519362cd4b6e1fd0a8cd4bf063e1e023336", size = 232980, upload-time = "2025-04-11T01:15:37.701Z" },
]
[[package]]
name = "django-filter"
version = "25.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
]
sdist = { url = "https://files.pythonhosted.org/packages/b5/40/c702a6fe8cccac9bf426b55724ebdf57d10a132bae80a17691d0cf0b9bac/django_filter-25.1.tar.gz", hash = "sha256:1ec9eef48fa8da1c0ac9b411744b16c3f4c31176c867886e4c48da369c407153", size = 143021, upload-time = "2025-02-14T16:30:53.238Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/07/a6/70dcd68537c434ba7cb9277d403c5c829caf04f35baf5eb9458be251e382/django_filter-25.1-py3-none-any.whl", hash = "sha256:4fa48677cf5857b9b1347fed23e355ea792464e0fe07244d1fdfb8a806215b80", size = 94114, upload-time = "2025-02-14T16:30:50.435Z" },
]
[[package]]
name = "django-modelcluster"
version = "6.4.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
]
sdist = { url = "https://files.pythonhosted.org/packages/5b/f7/51efcea27d74665230be07b63e631e16204893ef32338a0e671c5ee0cd40/django_modelcluster-6.4.1.tar.gz", hash = "sha256:e736fcee925f83b63218dbf9c869ab50618b0f5e98869a5aa497f7a5331aa263", size = 29029, upload-time = "2025-12-04T12:21:41.907Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a5/e4/ec99d52aa04e204e938564b603f4591e2e82e236ed59af664fee35179e75/django_modelcluster-6.4.1-py2.py3-none-any.whl", hash = "sha256:ccc190cd9e22c24900ea2410bff64d444d48f43f0f4aedeed0f6cd94e2536698", size = 29315, upload-time = "2025-12-04T12:21:39.911Z" },
]
[[package]]
name = "django-permissionedforms"
version = "0.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
]
sdist = { url = "https://files.pythonhosted.org/packages/94/4b/364fe61a161ead607dc6af311901ba8e62f537f8fdab94b5252cb6efe6d7/django-permissionedforms-0.1.tar.gz", hash = "sha256:4340bb20c4477fffb13b4cc5cccf9f1b1010b64f79956c291c72d2ad2ed243f8", size = 5856, upload-time = "2022-02-28T19:40:27.892Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e6/5b/216157ff053f955b15b9dcdc13bfb6e406666445164fee9e332e141be96d/django_permissionedforms-0.1-py2.py3-none-any.whl", hash = "sha256:d341a961a27cc77fde8cc42141c6ab55cc1f0cb886963cc2d6967b9674fa47d6", size = 5744, upload-time = "2022-02-28T19:40:26.337Z" },
]
[[package]]
name = "django-stubs-ext"
version = "5.2.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/fc/06/5e94715d103e6cc72380cb0d0b6682a7d5ad2c366cee478c94d77aad777d/django_stubs_ext-5.2.2.tar.gz", hash = "sha256:d9d151b919fe2438760f5bd938f03e1cb08c84d0651f9e5917f1313907e42683", size = 6244, upload-time = "2025-07-17T08:34:35.054Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/4e/38/2903676f97f7902ee31984a06756b0e8836e897f4b617e1a03be4a43eb4f/django_stubs_ext-5.2.2-py3-none-any.whl", hash = "sha256:8833bbe32405a2a0ce168d3f75a87168f61bd16939caf0e8bf173bccbd8a44c5", size = 8816, upload-time = "2025-07-17T08:34:33.715Z" },
]
[[package]]
name = "django-taggit"
version = "6.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
]
sdist = { url = "https://files.pythonhosted.org/packages/34/a6/f1beaf8f552fe90c153cc039316ebab942c23dfbc88588dde081fefca816/django_taggit-6.1.0.tar.gz", hash = "sha256:c4d1199e6df34125dd36db5eb0efe545b254dec3980ce5dd80e6bab3e78757c3", size = 38151, upload-time = "2024-09-29T08:07:39.477Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6b/34/4185c345530b91d05cb82e05d07148f481a5eb5dc2ac44e092b3daa6f206/django_taggit-6.1.0-py3-none-any.whl", hash = "sha256:ab776264bbc76cb3d7e49e1bf9054962457831bd21c3a42db9138b41956e4cf0", size = 75749, upload-time = "2024-09-29T08:07:14.612Z" },
]
[[package]]
name = "django-tasks"
version = "0.9.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
{ name = "django-stubs-ext" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/60/b1/064645bf246a1f5b46d9638755b1869ea44a6d05e7c7c12841fddebb71f6/django_tasks-0.9.0.tar.gz", hash = "sha256:971b3829efeee68147f7deced8d21b907131b11ec7953af83eb94b11f128a24d", size = 32343, upload-time = "2025-10-17T16:21:08.58Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/71/e1/ce539ce1e21be71696649f84b6dbd508b2c0b89b559a6e620478bb126f7c/django_tasks-0.9.0-py3-none-any.whl", hash = "sha256:fddc344934a605d9eafa08ac8ba32c0cde9da23ef534e03a41f09fa0417b535a", size = 44057, upload-time = "2025-10-17T16:21:07.283Z" },
]
[[package]]
name = "django-treebeard"
version = "4.7.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
]
sdist = { url = "https://files.pythonhosted.org/packages/bb/24/eaccbce17355380cb3a8fe6ad92a85b76453dc1f0ecd04f48bfe8929065b/django-treebeard-4.7.1.tar.gz", hash = "sha256:846e462904b437155f76e04907ba4e48480716855f88b898df4122bdcfbd6e98", size = 294139, upload-time = "2024-01-31T16:35:19.751Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/87/79/259966820614746cc4d81762edf97a53bf1e3b8e74797c010d310c6f4a8f/django_treebeard-4.7.1-py3-none-any.whl", hash = "sha256:995c7120153ab999898fe3043bbdcd8a0fc77cc106eb94de7350e9d02c885135", size = 93210, upload-time = "2024-01-31T16:35:17.843Z" },
]
[[package]]
name = "djangorestframework"
version = "3.16.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
]
sdist = { url = "https://files.pythonhosted.org/packages/8a/95/5376fe618646fde6899b3cdc85fd959716bb67542e273a76a80d9f326f27/djangorestframework-3.16.1.tar.gz", hash = "sha256:166809528b1aced0a17dc66c24492af18049f2c9420dbd0be29422029cfc3ff7", size = 1089735, upload-time = "2025-08-06T17:50:53.251Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b0/ce/bf8b9d3f415be4ac5588545b5fcdbbb841977db1c1d923f7568eeabe1689/djangorestframework-3.16.1-py3-none-any.whl", hash = "sha256:33a59f47fb9c85ede792cbf88bde71893bcda0667bc573f784649521f1102cec", size = 1080442, upload-time = "2025-08-06T17:50:50.667Z" },
]
[[package]]
name = "dnscms"
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "django" },
{ name = "django-extensions" },
{ name = "gunicorn" },
{ name = "psycopg2-binary" },
{ name = "wagtail" },
{ name = "wagtail-grapple" },
{ name = "whitenoise" },
]
[package.dev-dependencies]
dev = [
{ name = "ruff" },
]
[package.metadata]
requires-dist = [
{ name = "django", specifier = ">=6.0.3" },
{ name = "django-extensions", specifier = ">=4.1" },
{ name = "gunicorn", specifier = ">=25.1.0" },
{ name = "psycopg2-binary", specifier = ">=2.9.11,<3" },
{ name = "wagtail", specifier = ">=7.3.1" },
{ name = "wagtail-grapple", specifier = ">=0.29.0" },
{ name = "whitenoise", specifier = ">=6.12.0" },
]
[package.metadata.requires-dev]
dev = [{ name = "ruff", specifier = ">=0.15.1" }]
[[package]]
name = "draftjs-exporter"
version = "5.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d1/52/8b98525ab5477410bdbaf279c5fe0a99108211d40818bb769460784c1c41/draftjs_exporter-5.1.0.tar.gz", hash = "sha256:9f44b8dcecb702540e3aab24af2fad8683aec910fe0034c12cfab5d716ac5f84", size = 33500, upload-time = "2025-02-21T17:32:57.175Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/dc/99/26d5524aaa3e89266e0af19332053aa9f8a61b1c39b29c0dc709f43fbb29/draftjs_exporter-5.1.0-py3-none-any.whl", hash = "sha256:c32932b7933b994fd5ea74c1decf47b5c41e13ba06363f5b69b76ef10137d4e9", size = 26302, upload-time = "2025-02-21T17:32:54.4Z" },
]
[[package]]
name = "et-xmlfile"
version = "2.0.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload-time = "2024-10-25T17:25:40.039Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload-time = "2024-10-25T17:25:39.051Z" },
]
[[package]]
name = "filetype"
version = "1.2.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/bb/29/745f7d30d47fe0f251d3ad3dc2978a23141917661998763bebb6da007eb1/filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb", size = 998020, upload-time = "2022-11-02T17:34:04.141Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/18/79/1b8fa1bb3568781e84c9200f951c735f3f157429f44be0495da55894d620/filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25", size = 19970, upload-time = "2022-11-02T17:34:01.425Z" },
]
[[package]]
name = "graphene"
version = "3.4.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "graphql-core" },
{ name = "graphql-relay" },
{ name = "python-dateutil" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/cc/f6/bf62ff950c317ed03e77f3f6ddd7e34aaa98fe89d79ebd660c55343d8054/graphene-3.4.3.tar.gz", hash = "sha256:2a3786948ce75fe7e078443d37f609cbe5bb36ad8d6b828740ad3b95ed1a0aaa", size = 44739, upload-time = "2024-11-09T20:44:25.757Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/66/e0/61d8e98007182e6b2aca7cf65904721fb2e4bce0192272ab9cb6f69d8812/graphene-3.4.3-py2.py3-none-any.whl", hash = "sha256:820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71", size = 114894, upload-time = "2024-11-09T20:44:23.851Z" },
]
[[package]]
name = "graphene-django"
version = "3.2.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
{ name = "graphene" },
{ name = "graphql-core" },
{ name = "graphql-relay" },
{ name = "promise" },
{ name = "text-unidecode" },
]
sdist = { url = "https://files.pythonhosted.org/packages/6f/7a/8aef131349329dcd167578720f6364412f1728bfda14bba22c1e7b5d8365/graphene-django-3.2.3.tar.gz", hash = "sha256:d831bfe8e9a6e77e477b7854faef4addb318f386119a69ee4c57b74560f3e07d", size = 88393, upload-time = "2025-03-13T08:33:03.949Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/18/35/ab9c668222f6271a0b71efb147c46816229dbb9fa5d15ee6b025eb08d4b2/graphene_django-3.2.3-py2.py3-none-any.whl", hash = "sha256:0c673a4dad315b26b4d18eb379ad0c7027fd6a36d23a1848b7c7c09a14a9271e", size = 114959, upload-time = "2025-03-13T08:33:02.453Z" },
]
[[package]]
name = "graphql-core"
version = "3.2.6"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/c4/16/7574029da84834349b60ed71614d66ca3afe46e9bf9c7b9562102acb7d4f/graphql_core-3.2.6.tar.gz", hash = "sha256:c08eec22f9e40f0bd61d805907e3b3b1b9a320bc606e23dc145eebca07c8fbab", size = 505353, upload-time = "2025-01-26T16:36:27.374Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ae/4f/7297663840621022bc73c22d7d9d80dbc78b4db6297f764b545cd5dd462d/graphql_core-3.2.6-py3-none-any.whl", hash = "sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f", size = 203416, upload-time = "2025-01-26T16:36:24.868Z" },
]
[[package]]
name = "graphql-relay"
version = "3.2.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "graphql-core" },
]
sdist = { url = "https://files.pythonhosted.org/packages/d1/13/98fbf8d67552f102488ffc16c6f559ce71ea15f6294728d33928ab5ff14d/graphql-relay-3.2.0.tar.gz", hash = "sha256:1ff1c51298356e481a0be009ccdff249832ce53f30559c1338f22a0e0d17250c", size = 50027, upload-time = "2022-04-16T11:03:45.447Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/74/16/a4cf06adbc711bd364a73ce043b0b08d8fa5aae3df11b6ee4248bcdad2e0/graphql_relay-3.2.0-py3-none-any.whl", hash = "sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5", size = 16940, upload-time = "2022-04-16T11:03:43.895Z" },
]
[[package]]
name = "gunicorn"
version = "25.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "packaging" },
]
sdist = { url = "https://files.pythonhosted.org/packages/66/13/ef67f59f6a7896fdc2c1d62b5665c5219d6b0a9a1784938eb9a28e55e128/gunicorn-25.1.0.tar.gz", hash = "sha256:1426611d959fa77e7de89f8c0f32eed6aa03ee735f98c01efba3e281b1c47616", size = 594377, upload-time = "2026-02-13T11:09:58.989Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/da/73/4ad5b1f6a2e21cf1e85afdaad2b7b1a933985e2f5d679147a1953aaa192c/gunicorn-25.1.0-py3-none-any.whl", hash = "sha256:d0b1236ccf27f72cfe14bce7caadf467186f19e865094ca84221424e839b8b8b", size = 197067, upload-time = "2026-02-13T11:09:57.146Z" },
]
[[package]]
name = "idna"
version = "3.10"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
]
[[package]]
name = "laces"
version = "0.1.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
]
sdist = { url = "https://files.pythonhosted.org/packages/74/9a/9192d6a74e2c6db4f705dd98f56be488e47373172c13f4916aeabc4d68b8/laces-0.1.2.tar.gz", hash = "sha256:3218e09c1889ae5cf3fc7a82f5bb63ec0c7879889b6a9760bfc42323c694b84d", size = 29264, upload-time = "2025-01-14T04:37:34.805Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/60/fe/31f76f5cb2579bdda208aa257ce5482653f22ab1bad3e128fe2f803fa2f1/laces-0.1.2-py3-none-any.whl", hash = "sha256:980cdaf9a31e883a2b8198132e2388931a4eb8814f5bfa5d8bba13ff9f657b7c", size = 22462, upload-time = "2025-01-14T04:37:30.636Z" },
]
[[package]]
name = "modelsearch"
version = "1.1.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "django" },
{ name = "django-tasks" },
]
sdist = { url = "https://files.pythonhosted.org/packages/3f/49/751b8872bb9c1ec667d0d312ab90022f0426326109163ade4719466c2e4d/modelsearch-1.1.1.tar.gz", hash = "sha256:25f329c4d93572729c931f65c46cedb5cfc32d368690ebdabc223aa6205251d6", size = 87514, upload-time = "2025-11-10T14:29:57.223Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/88/4b/e3eb1f4e4f7ca4bfa9b71cea497352c1ce13261254d59cb33a36bcbff335/modelsearch-1.1.1-py3-none-any.whl", hash = "sha256:d2580790af76c3a6404f651c9d8ca8695b284551583bb8ca6ddeb17eca0cfb52", size = 106987, upload-time = "2025-11-10T14:29:55.946Z" },
]
[[package]]
name = "openpyxl"
version = "3.1.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "et-xmlfile" },
]
sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload-time = "2024-06-28T14:03:44.161Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" },
]
[[package]]
name = "packaging"
version = "24.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788, upload-time = "2024-06-09T23:19:24.956Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985, upload-time = "2024-06-09T23:19:21.909Z" },
]
[[package]]
name = "pillow"
version = "11.3.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" },
{ url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" },
{ url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" },
{ url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" },
{ url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" },
{ url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" },
{ url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" },
{ url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" },
{ url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" },
{ url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" },
{ url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" },
{ url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" },
{ url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" },
{ url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" },
{ url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" },
{ url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" },
{ url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" },
{ url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" },
{ url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" },
{ url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" },
{ url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" },
{ url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" },
]
[[package]]
name = "pillow-heif"
version = "1.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pillow" },
]
sdist = { url = "https://files.pythonhosted.org/packages/6f/d4/597cf8c54d1ed494a46cc12e358d2f73a993b5f139402b35681f56beffde/pillow_heif-1.1.0.tar.gz", hash = "sha256:6c0c5f81a780185bbddc56e0d5537c53aa6cb5fb6018f5a60534a47c53f5455d", size = 18271020, upload-time = "2025-08-02T09:58:32.54Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/cf/93/e32cd695bca9750f6fa166f28a4c84fd8a23209f99d56712359c0b42f2e6/pillow_heif-1.1.0-cp314-cp314-macosx_13_0_x86_64.whl", hash = "sha256:c47f12a30a86c43f714353d0fb8478dc4da7915d678642e0b6cf6f0fd53d711e", size = 3384304, upload-time = "2025-08-02T09:57:55.997Z" },
{ url = "https://files.pythonhosted.org/packages/62/88/3e7cda3383c165a5eebf9a0193450de2b810b7654dbc363c8c26a87be6f2/pillow_heif-1.1.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3cc4a7a808b659f657c5144aeec8152d261d8f3c4a859eba66ef31dab26982d2", size = 2261529, upload-time = "2025-08-02T09:57:57.6Z" },
{ url = "https://files.pythonhosted.org/packages/bf/f2/469d9ef5c64efecbc0559aa56ebe6539007f478d8aee83253037dc203567/pillow_heif-1.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f3b0df4a03f9c7f150d801f3644961df5af0739503d6fc5d3e0aeb540d16c3d", size = 5780880, upload-time = "2025-08-02T09:57:59.408Z" },
{ url = "https://files.pythonhosted.org/packages/13/74/a5c13f96ba06f4ec7d85a6d343b91c2767bd5a3fd90c146cf3c59fbcb12c/pillow_heif-1.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44fcd3a171337788bf672882484725f124143d2f290cfdbf029c22c113a15c79", size = 5502822, upload-time = "2025-08-02T09:58:00.841Z" },
{ url = "https://files.pythonhosted.org/packages/57/04/1a6a88647dbb0eec95fa8b9d5cac501f690cdd83479e7cacf56772f1189f/pillow_heif-1.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f07f28e99ae74dffca936e24d8881f3e7e572233cf1f7bc16fe42fb08a795be", size = 6822779, upload-time = "2025-08-02T09:58:02.238Z" },
{ url = "https://files.pythonhosted.org/packages/ae/37/8873625e681505940381cff6a4a191301f98d9a5c1499f60a2e892ad8c89/pillow_heif-1.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7a6de39cfba4037479aa5deb65a6bb0b27da0a11b95f740202f03b578ee8932f", size = 6429866, upload-time = "2025-08-02T09:58:03.637Z" },
{ url = "https://files.pythonhosted.org/packages/6b/3c/63cbbe3a6a54e3ec925d2433bb431a4bf61695f34b5f1e689db642fb20c1/pillow_heif-1.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:514c856230995dc2f918fb12d83906885d42829e911868e23035e2d916c4c7c5", size = 5573890, upload-time = "2025-08-02T09:58:05.049Z" },
]
[[package]]
name = "promise"
version = "2.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "six" },
]
sdist = { url = "https://files.pythonhosted.org/packages/cf/9c/fb5d48abfe5d791cd496e4242ebcf87a4bb2e0c3dcd6e0ae68c11426a528/promise-2.3.tar.gz", hash = "sha256:dfd18337c523ba4b6a58801c164c1904a9d4d1b1747c7d5dbf45b693a49d93d0", size = 19534, upload-time = "2019-12-18T07:31:43.07Z" }
[[package]]
name = "psycopg2-binary"
version = "2.9.11"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/ac/6c/8767aaa597ba424643dc87348c6f1754dd9f48e80fdc1b9f7ca5c3a7c213/psycopg2-binary-2.9.11.tar.gz", hash = "sha256:b6aed9e096bf63f9e75edf2581aa9a7e7186d97ab5c177aa6c87797cd591236c", size = 379620, upload-time = "2025-10-10T11:14:48.041Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/64/12/93ef0098590cf51d9732b4f139533732565704f45bdc1ffa741b7c95fb54/psycopg2_binary-2.9.11-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:92e3b669236327083a2e33ccfa0d320dd01b9803b3e14dd986a4fc54aa00f4e1", size = 3756567, upload-time = "2025-10-10T11:13:11.885Z" },
{ url = "https://files.pythonhosted.org/packages/7c/a9/9d55c614a891288f15ca4b5209b09f0f01e3124056924e17b81b9fa054cc/psycopg2_binary-2.9.11-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e0deeb03da539fa3577fcb0b3f2554a97f7e5477c246098dbb18091a4a01c16f", size = 3864755, upload-time = "2025-10-10T11:13:17.727Z" },
{ url = "https://files.pythonhosted.org/packages/13/1e/98874ce72fd29cbde93209977b196a2edae03f8490d1bd8158e7f1daf3a0/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b52a3f9bb540a3e4ec0f6ba6d31339727b2950c9772850d6545b7eae0b9d7c5", size = 4411646, upload-time = "2025-10-10T11:13:24.432Z" },
{ url = "https://files.pythonhosted.org/packages/5a/bd/a335ce6645334fb8d758cc358810defca14a1d19ffbc8a10bd38a2328565/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:db4fd476874ccfdbb630a54426964959e58da4c61c9feba73e6094d51303d7d8", size = 4468701, upload-time = "2025-10-10T11:13:29.266Z" },
{ url = "https://files.pythonhosted.org/packages/44/d6/c8b4f53f34e295e45709b7568bf9b9407a612ea30387d35eb9fa84f269b4/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47f212c1d3be608a12937cc131bd85502954398aaa1320cb4c14421a0ffccf4c", size = 4166293, upload-time = "2025-10-10T11:13:33.336Z" },
{ url = "https://files.pythonhosted.org/packages/4b/e0/f8cc36eadd1b716ab36bb290618a3292e009867e5c97ce4aba908cb99644/psycopg2_binary-2.9.11-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e35b7abae2b0adab776add56111df1735ccc71406e56203515e228a8dc07089f", size = 3983184, upload-time = "2025-10-30T02:55:32.483Z" },
{ url = "https://files.pythonhosted.org/packages/53/3e/2a8fe18a4e61cfb3417da67b6318e12691772c0696d79434184a511906dc/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fcf21be3ce5f5659daefd2b3b3b6e4727b028221ddc94e6c1523425579664747", size = 3652650, upload-time = "2025-10-10T11:13:38.181Z" },
{ url = "https://files.pythonhosted.org/packages/76/36/03801461b31b29fe58d228c24388f999fe814dfc302856e0d17f97d7c54d/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:9bd81e64e8de111237737b29d68039b9c813bdf520156af36d26819c9a979e5f", size = 3298663, upload-time = "2025-10-10T11:13:44.878Z" },
{ url = "https://files.pythonhosted.org/packages/97/77/21b0ea2e1a73aa5fa9222b2a6b8ba325c43c3a8d54272839c991f2345656/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:32770a4d666fbdafab017086655bcddab791d7cb260a16679cc5a7338b64343b", size = 3044737, upload-time = "2025-10-30T02:55:35.69Z" },
{ url = "https://files.pythonhosted.org/packages/67/69/f36abe5f118c1dca6d3726ceae164b9356985805480731ac6712a63f24f0/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3cb3a676873d7506825221045bd70e0427c905b9c8ee8d6acd70cfcbd6e576d", size = 3347643, upload-time = "2025-10-10T11:13:53.499Z" },
{ url = "https://files.pythonhosted.org/packages/e1/36/9c0c326fe3a4227953dfb29f5d0c8ae3b8eb8c1cd2967aa569f50cb3c61f/psycopg2_binary-2.9.11-cp314-cp314-win_amd64.whl", hash = "sha256:4012c9c954dfaccd28f94e84ab9f94e12df76b4afb22331b1f0d3154893a6316", size = 2803913, upload-time = "2025-10-10T11:13:57.058Z" },
]
[[package]]
name = "python-dateutil"
version = "2.9.0.post0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "six" },
]
sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
]
[[package]]
name = "requests"
version = "2.32.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
{ name = "charset-normalizer" },
{ name = "idna" },
{ name = "urllib3" },
]
sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" },
]
[[package]]
name = "ruff"
version = "0.15.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/04/dc/4e6ac71b511b141cf626357a3946679abeba4cf67bc7cc5a17920f31e10d/ruff-0.15.1.tar.gz", hash = "sha256:c590fe13fb57c97141ae975c03a1aedb3d3156030cabd740d6ff0b0d601e203f", size = 4540855, upload-time = "2026-02-12T23:09:09.998Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/23/bf/e6e4324238c17f9d9120a9d60aa99a7daaa21204c07fcd84e2ef03bb5fd1/ruff-0.15.1-py3-none-linux_armv6l.whl", hash = "sha256:b101ed7cf4615bda6ffe65bdb59f964e9f4a0d3f85cbf0e54f0ab76d7b90228a", size = 10367819, upload-time = "2026-02-12T23:09:03.598Z" },
{ url = "https://files.pythonhosted.org/packages/b3/ea/c8f89d32e7912269d38c58f3649e453ac32c528f93bb7f4219258be2e7ed/ruff-0.15.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:939c995e9277e63ea632cc8d3fae17aa758526f49a9a850d2e7e758bfef46602", size = 10798618, upload-time = "2026-02-12T23:09:22.928Z" },
{ url = "https://files.pythonhosted.org/packages/5e/0f/1d0d88bc862624247d82c20c10d4c0f6bb2f346559d8af281674cf327f15/ruff-0.15.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1d83466455fdefe60b8d9c8df81d3c1bbb2115cede53549d3b522ce2bc703899", size = 10148518, upload-time = "2026-02-12T23:08:58.339Z" },
{ url = "https://files.pythonhosted.org/packages/f5/c8/291c49cefaa4a9248e986256df2ade7add79388fe179e0691be06fae6f37/ruff-0.15.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9457e3c3291024866222b96108ab2d8265b477e5b1534c7ddb1810904858d16", size = 10518811, upload-time = "2026-02-12T23:09:31.865Z" },
{ url = "https://files.pythonhosted.org/packages/c3/1a/f5707440e5ae43ffa5365cac8bbb91e9665f4a883f560893829cf16a606b/ruff-0.15.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92c92b003e9d4f7fbd33b1867bb15a1b785b1735069108dfc23821ba045b29bc", size = 10196169, upload-time = "2026-02-12T23:09:17.306Z" },
{ url = "https://files.pythonhosted.org/packages/2a/ff/26ddc8c4da04c8fd3ee65a89c9fb99eaa5c30394269d424461467be2271f/ruff-0.15.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe5c41ab43e3a06778844c586251eb5a510f67125427625f9eb2b9526535779", size = 10990491, upload-time = "2026-02-12T23:09:25.503Z" },
{ url = "https://files.pythonhosted.org/packages/fc/00/50920cb385b89413f7cdb4bb9bc8fc59c1b0f30028d8bccc294189a54955/ruff-0.15.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66a6dd6df4d80dc382c6484f8ce1bcceb55c32e9f27a8b94c32f6c7331bf14fb", size = 11843280, upload-time = "2026-02-12T23:09:19.88Z" },
{ url = "https://files.pythonhosted.org/packages/5d/6d/2f5cad8380caf5632a15460c323ae326f1e1a2b5b90a6ee7519017a017ca/ruff-0.15.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a4a42cbb8af0bda9bcd7606b064d7c0bc311a88d141d02f78920be6acb5aa83", size = 11274336, upload-time = "2026-02-12T23:09:14.907Z" },
{ url = "https://files.pythonhosted.org/packages/a3/1d/5f56cae1d6c40b8a318513599b35ea4b075d7dc1cd1d04449578c29d1d75/ruff-0.15.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab064052c31dddada35079901592dfba2e05f5b1e43af3954aafcbc1096a5b2", size = 11137288, upload-time = "2026-02-12T23:09:07.475Z" },
{ url = "https://files.pythonhosted.org/packages/cd/20/6f8d7d8f768c93b0382b33b9306b3b999918816da46537d5a61635514635/ruff-0.15.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5631c940fe9fe91f817a4c2ea4e81f47bee3ca4aa646134a24374f3c19ad9454", size = 11070681, upload-time = "2026-02-12T23:08:55.43Z" },
{ url = "https://files.pythonhosted.org/packages/9a/67/d640ac76069f64cdea59dba02af2e00b1fa30e2103c7f8d049c0cff4cafd/ruff-0.15.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:68138a4ba184b4691ccdc39f7795c66b3c68160c586519e7e8444cf5a53e1b4c", size = 10486401, upload-time = "2026-02-12T23:09:27.927Z" },
{ url = "https://files.pythonhosted.org/packages/65/3d/e1429f64a3ff89297497916b88c32a5cc88eeca7e9c787072d0e7f1d3e1e/ruff-0.15.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:518f9af03bfc33c03bdb4cb63fabc935341bb7f54af500f92ac309ecfbba6330", size = 10197452, upload-time = "2026-02-12T23:09:12.147Z" },
{ url = "https://files.pythonhosted.org/packages/78/83/e2c3bade17dad63bf1e1c2ffaf11490603b760be149e1419b07049b36ef2/ruff-0.15.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:da79f4d6a826caaea95de0237a67e33b81e6ec2e25fc7e1993a4015dffca7c61", size = 10693900, upload-time = "2026-02-12T23:09:34.418Z" },
{ url = "https://files.pythonhosted.org/packages/a1/27/fdc0e11a813e6338e0706e8b39bb7a1d61ea5b36873b351acee7e524a72a/ruff-0.15.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3dd86dccb83cd7d4dcfac303ffc277e6048600dfc22e38158afa208e8bf94a1f", size = 11227302, upload-time = "2026-02-12T23:09:36.536Z" },
{ url = "https://files.pythonhosted.org/packages/f6/58/ac864a75067dcbd3b95be5ab4eb2b601d7fbc3d3d736a27e391a4f92a5c1/ruff-0.15.1-py3-none-win32.whl", hash = "sha256:660975d9cb49b5d5278b12b03bb9951d554543a90b74ed5d366b20e2c57c2098", size = 10462555, upload-time = "2026-02-12T23:09:29.899Z" },
{ url = "https://files.pythonhosted.org/packages/e0/5e/d4ccc8a27ecdb78116feac4935dfc39d1304536f4296168f91ed3ec00cd2/ruff-0.15.1-py3-none-win_amd64.whl", hash = "sha256:c820fef9dd5d4172a6570e5721704a96c6679b80cf7be41659ed439653f62336", size = 11599956, upload-time = "2026-02-12T23:09:01.157Z" },
{ url = "https://files.pythonhosted.org/packages/2a/07/5bda6a85b220c64c65686bc85bd0bbb23b29c62b3a9f9433fa55f17cda93/ruff-0.15.1-py3-none-win_arm64.whl", hash = "sha256:5ff7d5f0f88567850f45081fac8f4ec212be8d0b963e385c3f7d0d2eb4899416", size = 10874604, upload-time = "2026-02-12T23:09:05.515Z" },
]
[[package]]
name = "six"
version = "1.17.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
]
[[package]]
name = "soupsieve"
version = "2.7"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload-time = "2025-04-20T18:50:08.518Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload-time = "2025-04-20T18:50:07.196Z" },
]
[[package]]
name = "sqlparse"
version = "0.5.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/e5/40/edede8dd6977b0d3da179a342c198ed100dd2aba4be081861ee5911e4da4/sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272", size = 84999, upload-time = "2024-12-10T12:05:30.728Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca", size = 44415, upload-time = "2024-12-10T12:05:27.824Z" },
]
[[package]]
name = "telepath"
version = "0.3.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/65/58/5de8765687d6f9dfcbb72c89251036c3b901126404f872b936b13377a3fe/telepath-0.3.1.tar.gz", hash = "sha256:925c0609e0a8a6488ec4a55b19d485882cf72223b2b19fe2359a50fddd813c9c", size = 11622, upload-time = "2023-06-12T12:07:42.559Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/5f/50/0f246d316f223b14ba5a88fbe2ff0b480d4a6064b866d48008dd57fd5930/telepath-0.3.1-py38-none-any.whl", hash = "sha256:c280aa8e77ad71ce80e96500a4e4d4a32f35b7e0b52e896bb5fde9a5bcf0699a", size = 10926, upload-time = "2023-06-12T12:07:41.443Z" },
]
[[package]]
name = "text-unidecode"
version = "1.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload-time = "2019-08-30T21:36:45.405Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload-time = "2019-08-30T21:37:03.543Z" },
]
[[package]]
name = "typing-extensions"
version = "4.14.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" },
]
[[package]]
name = "tzdata"
version = "2025.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" },
]
[[package]]
name = "urllib3"
version = "2.5.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
]
[[package]]
name = "wagtail"
version = "7.3.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyascii" },
{ name = "beautifulsoup4" },
{ name = "django" },
{ name = "django-filter" },
{ name = "django-modelcluster" },
{ name = "django-permissionedforms" },
{ name = "django-taggit" },
{ name = "django-tasks" },
{ name = "django-treebeard" },
{ name = "djangorestframework" },
{ name = "draftjs-exporter" },
{ name = "laces" },
{ name = "modelsearch" },
{ name = "openpyxl" },
{ name = "pillow" },
{ name = "requests" },
{ name = "telepath" },
{ name = "willow", extra = ["heif"] },
]
sdist = { url = "https://files.pythonhosted.org/packages/4e/f9/e28a1b87ea61c68b74990c9f5c8cb11da9a689e07c8b769acc89121f8523/wagtail-7.3.1.tar.gz", hash = "sha256:2ce131d9a4e7d55fdb5b592d320a758a189174b2cc3966b70a34a1b3dc56f449", size = 6855119, upload-time = "2026-03-03T15:54:48.523Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/bb/0e/5efc903966b966df2261a66cce8cb88909e4ade86f1173a156aadbbd1a06/wagtail-7.3.1-py3-none-any.whl", hash = "sha256:eab131e15ab9edc7ed24143d44271e92af79239e105bc3e173d26c95d2b489b3", size = 9479191, upload-time = "2026-03-03T15:54:42.644Z" },
]
[[package]]
name = "wagtail-grapple"
version = "0.29.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "graphene-django" },
{ name = "wagtail" },
{ name = "wagtail-headless-preview" },
]
sdist = { url = "https://files.pythonhosted.org/packages/c0/66/abe1b5ad7c335ff3969190c38ac259285b9f107d8273a18cc8c0ba0d36c5/wagtail_grapple-0.29.0.tar.gz", hash = "sha256:56b023dcfdce72532fba00610507b2705bf3a0be068946275c7658314de5431a", size = 39112, upload-time = "2025-07-02T10:25:19.811Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/48/ae/a7a26e331f9207ed864ebea292aac6af1e19a221391d2f833cd4fbe70f68/wagtail_grapple-0.29.0-py3-none-any.whl", hash = "sha256:d9c8c76bd9ba8c52ba1796b86043360d5ab083b24db6caaf2b1e6e41a7a2503e", size = 49124, upload-time = "2025-07-02T10:25:18.345Z" },
]
[[package]]
name = "wagtail-headless-preview"
version = "0.8.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "wagtail" },
]
sdist = { url = "https://files.pythonhosted.org/packages/b4/28/87fda34fd89999bee03519a614ddca608def6d07b69d93365833c434b9c5/wagtail_headless_preview-0.8.0.tar.gz", hash = "sha256:581d8419cd1ef1f7de88235445e9695e5591d46259283d56bfe814e8620fa1d5", size = 13957, upload-time = "2024-02-23T15:53:44.986Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/62/57/bb6c10a11f7a0ec0d8e10ec99b4c7b5a6036e8846e61d145966b6c72113d/wagtail_headless_preview-0.8.0-py3-none-any.whl", hash = "sha256:91b305c36573490856e212f9e5645ada81f72ad37f1bb00e6feddc5537252358", size = 12301, upload-time = "2024-02-23T15:53:43.904Z" },
]
[[package]]
name = "whitenoise"
version = "6.12.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/cb/2a/55b3f3a4ec326cd077c1c3defeee656b9298372a69229134d930151acd01/whitenoise-6.12.0.tar.gz", hash = "sha256:f723ebb76a112e98816ff80fcea0a6c9b8ecde835f8ddda25df7a30a3c2db6ad", size = 26841, upload-time = "2026-02-27T00:05:42.028Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/db/eb/d5583a11486211f3ebd4b385545ae787f32363d453c19fffd81106c9c138/whitenoise-6.12.0-py3-none-any.whl", hash = "sha256:fc5e8c572e33ebf24795b47b6a7da8da3c00cff2349f5b04c02f28d0cc5a3cc2", size = 20302, upload-time = "2026-02-27T00:05:40.086Z" },
]
[[package]]
name = "willow"
version = "1.11.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "defusedxml" },
{ name = "filetype" },
]
sdist = { url = "https://files.pythonhosted.org/packages/a3/bd/2a383be24c3e47423aa9b0aa5b4ca818ef193506b58800dd51e1b89d7bb3/willow-1.11.0.tar.gz", hash = "sha256:70292b2d0cd2d5bb4076f0b3d61308aeaa0b225f3970d00752f08a8fd386c3d1", size = 113827, upload-time = "2025-07-16T08:46:26.939Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c1/05/b3f1b443c31ad871c48e19ea2be189681c2df4ccf594b1dd83d6775c032b/willow-1.11.0-py3-none-any.whl", hash = "sha256:0a4388dbf18726eef8f27449659047689c39b7023045ca5a8a75410d3864ee6f", size = 119459, upload-time = "2025-07-16T08:46:25.596Z" },
]
[package.optional-dependencies]
heif = [
{ name = "pillow-heif" },
]
@@ -0,0 +1,731 @@
# Generated by Django 6.0.3 on 2026-04-15 20:21
import wagtail.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("venues", "0024_venuepage_show_in_overview_and_more"),
]
operations = [
migrations.AlterField(
model_name="venueindex",
name="body",
field=wagtail.fields.StreamField(
[
("paragraph", 0),
("image", 4),
("image_slider", 8),
("horizontal_rule", 10),
("featured", 18),
("page_section_navigation", 19),
("accordion", 23),
("fact_box", 26),
("photo_sphere", 29),
("embed", 30),
("raw_html", 31),
],
block_lookup={
0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rik tekst"}),
1: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "Bilde"},
),
2: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("fullwidth", "Fullbredde"),
("bleed", "Utfallende"),
("original", "Uendret størrelse"),
],
"icon": "cup",
"label": "Bildeformat",
},
),
3: (
"wagtail.blocks.CharBlock",
(),
{"label": "Bildetekst", "max_length": 512, "required": False},
),
4: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{},
),
5: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tekst", "max_length": 512, "required": False},
),
6: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("text", 5)]],
{},
),
7: (
"wagtail.blocks.ListBlock",
(6,),
{"label": "Bilder", "min_num": 1},
),
8: ("wagtail.blocks.StructBlock", [[("images", 7)]], {}),
9: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Farge",
"required": False,
},
),
10: ("wagtail.blocks.StructBlock", [[("color", 9)]], {}),
11: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tittel", "max_length": 64, "required": True},
),
12: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": ["bold", "italic", "link"],
"label": "Tekst",
"required": True,
},
),
13: (
"wagtail.blocks.PageChooserBlock",
(),
{"header": "Fremhevet side", "required": True},
),
14: (
"wagtail.blocks.CharBlock",
(),
{
"default": "Les mer",
"help_text": 'Lenketeksten som tar deg videre til siden. Tips: Ikke start med "Trykk her"',
"label": "Lenketekst",
"max_length": 64,
"required": True,
},
),
15: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
},
),
16: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [("left", "Venstre"), ("right", "Høyre")],
"label": "Bildeplassering",
},
),
17: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{
"header": "Overstyr bilde",
"help_text": "Bildet som er tilknyttet undersiden du vil fremheve, vil automatisk brukes. Om det mangler eller du vil overstyre hvilket bilde som et brukes, kan du velge et her.",
"required": False,
},
),
18: (
"wagtail.blocks.StructBlock",
[
[
("title", 11),
("text", 12),
("featured_page", 13),
("link_text", 14),
("background_color", 15),
("image_position", 16),
("featured_image_override", 17),
]
],
{},
),
19: ("dnscms.blocks.PageSectionNavigationBlock", (), {}),
20: (
"wagtail.blocks.CharBlock",
(),
{"label": "Overskrift", "max_length": 64, "required": True},
),
21: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{"label": "Bilde"},
),
22: (
"wagtail.blocks.StreamBlock",
[[("paragraph", 0), ("image", 21)]],
{},
),
23: (
"wagtail.blocks.StructBlock",
[[("heading", 20), ("body", 22)]],
{},
),
24: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
"required": False,
},
),
25: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": [
"bold",
"italic",
"link",
"ol",
"ul",
"h2",
"h3",
],
"label": "Innhold",
},
),
26: (
"wagtail.blocks.StructBlock",
[[("background_color", 24), ("body", 25)]],
{},
),
27: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "360°-bilde"},
),
28: (
"wagtail.blocks.CharBlock",
(),
{
"help_text": "Beskrivende tittel på bildet (vises også til skjermlesere)",
"label": "Tittel",
"max_length": 256,
},
),
29: (
"wagtail.blocks.StructBlock",
[[("image", 27), ("title", 28)]],
{},
),
30: ("wagtail.embeds.blocks.EmbedBlock", (), {}),
31: ("wagtail.blocks.RawHTMLBlock", (), {}),
},
default=[("paragraph", "")],
),
),
migrations.AlterField(
model_name="venuepage",
name="body",
field=wagtail.fields.StreamField(
[
("paragraph", 0),
("image", 4),
("image_slider", 8),
("horizontal_rule", 10),
("featured", 18),
("page_section_navigation", 19),
("accordion", 23),
("fact_box", 26),
("photo_sphere", 29),
("embed", 30),
("raw_html", 31),
],
block_lookup={
0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rik tekst"}),
1: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "Bilde"},
),
2: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("fullwidth", "Fullbredde"),
("bleed", "Utfallende"),
("original", "Uendret størrelse"),
],
"icon": "cup",
"label": "Bildeformat",
},
),
3: (
"wagtail.blocks.CharBlock",
(),
{"label": "Bildetekst", "max_length": 512, "required": False},
),
4: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{},
),
5: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tekst", "max_length": 512, "required": False},
),
6: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("text", 5)]],
{},
),
7: (
"wagtail.blocks.ListBlock",
(6,),
{"label": "Bilder", "min_num": 1},
),
8: ("wagtail.blocks.StructBlock", [[("images", 7)]], {}),
9: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Farge",
"required": False,
},
),
10: ("wagtail.blocks.StructBlock", [[("color", 9)]], {}),
11: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tittel", "max_length": 64, "required": True},
),
12: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": ["bold", "italic", "link"],
"label": "Tekst",
"required": True,
},
),
13: (
"wagtail.blocks.PageChooserBlock",
(),
{"header": "Fremhevet side", "required": True},
),
14: (
"wagtail.blocks.CharBlock",
(),
{
"default": "Les mer",
"help_text": 'Lenketeksten som tar deg videre til siden. Tips: Ikke start med "Trykk her"',
"label": "Lenketekst",
"max_length": 64,
"required": True,
},
),
15: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
},
),
16: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [("left", "Venstre"), ("right", "Høyre")],
"label": "Bildeplassering",
},
),
17: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{
"header": "Overstyr bilde",
"help_text": "Bildet som er tilknyttet undersiden du vil fremheve, vil automatisk brukes. Om det mangler eller du vil overstyre hvilket bilde som et brukes, kan du velge et her.",
"required": False,
},
),
18: (
"wagtail.blocks.StructBlock",
[
[
("title", 11),
("text", 12),
("featured_page", 13),
("link_text", 14),
("background_color", 15),
("image_position", 16),
("featured_image_override", 17),
]
],
{},
),
19: ("dnscms.blocks.PageSectionNavigationBlock", (), {}),
20: (
"wagtail.blocks.CharBlock",
(),
{"label": "Overskrift", "max_length": 64, "required": True},
),
21: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{"label": "Bilde"},
),
22: (
"wagtail.blocks.StreamBlock",
[[("paragraph", 0), ("image", 21)]],
{},
),
23: (
"wagtail.blocks.StructBlock",
[[("heading", 20), ("body", 22)]],
{},
),
24: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
"required": False,
},
),
25: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": [
"bold",
"italic",
"link",
"ol",
"ul",
"h2",
"h3",
],
"label": "Innhold",
},
),
26: (
"wagtail.blocks.StructBlock",
[[("background_color", 24), ("body", 25)]],
{},
),
27: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "360°-bilde"},
),
28: (
"wagtail.blocks.CharBlock",
(),
{
"help_text": "Beskrivende tittel på bildet (vises også til skjermlesere)",
"label": "Tittel",
"max_length": 256,
},
),
29: (
"wagtail.blocks.StructBlock",
[[("image", 27), ("title", 28)]],
{},
),
30: ("wagtail.embeds.blocks.EmbedBlock", (), {}),
31: ("wagtail.blocks.RawHTMLBlock", (), {}),
},
default=[("paragraph", "")],
),
),
migrations.AlterField(
model_name="venuerentalindex",
name="body",
field=wagtail.fields.StreamField(
[
("paragraph", 0),
("image", 4),
("image_slider", 8),
("horizontal_rule", 10),
("featured", 18),
("page_section_navigation", 19),
("accordion", 23),
("fact_box", 26),
("photo_sphere", 29),
("embed", 30),
("raw_html", 31),
],
block_lookup={
0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rik tekst"}),
1: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "Bilde"},
),
2: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("fullwidth", "Fullbredde"),
("bleed", "Utfallende"),
("original", "Uendret størrelse"),
],
"icon": "cup",
"label": "Bildeformat",
},
),
3: (
"wagtail.blocks.CharBlock",
(),
{"label": "Bildetekst", "max_length": 512, "required": False},
),
4: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{},
),
5: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tekst", "max_length": 512, "required": False},
),
6: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("text", 5)]],
{},
),
7: (
"wagtail.blocks.ListBlock",
(6,),
{"label": "Bilder", "min_num": 1},
),
8: ("wagtail.blocks.StructBlock", [[("images", 7)]], {}),
9: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Farge",
"required": False,
},
),
10: ("wagtail.blocks.StructBlock", [[("color", 9)]], {}),
11: (
"wagtail.blocks.CharBlock",
(),
{"label": "Tittel", "max_length": 64, "required": True},
),
12: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": ["bold", "italic", "link"],
"label": "Tekst",
"required": True,
},
),
13: (
"wagtail.blocks.PageChooserBlock",
(),
{"header": "Fremhevet side", "required": True},
),
14: (
"wagtail.blocks.CharBlock",
(),
{
"default": "Les mer",
"help_text": 'Lenketeksten som tar deg videre til siden. Tips: Ikke start med "Trykk her"',
"label": "Lenketekst",
"max_length": 64,
"required": True,
},
),
15: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
},
),
16: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [("left", "Venstre"), ("right", "Høyre")],
"label": "Bildeplassering",
},
),
17: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{
"header": "Overstyr bilde",
"help_text": "Bildet som er tilknyttet undersiden du vil fremheve, vil automatisk brukes. Om det mangler eller du vil overstyre hvilket bilde som et brukes, kan du velge et her.",
"required": False,
},
),
18: (
"wagtail.blocks.StructBlock",
[
[
("title", 11),
("text", 12),
("featured_page", 13),
("link_text", 14),
("background_color", 15),
("image_position", 16),
("featured_image_override", 17),
]
],
{},
),
19: ("dnscms.blocks.PageSectionNavigationBlock", (), {}),
20: (
"wagtail.blocks.CharBlock",
(),
{"label": "Overskrift", "max_length": 64, "required": True},
),
21: (
"wagtail.blocks.StructBlock",
[[("image", 1), ("image_format", 2), ("text", 3)]],
{"label": "Bilde"},
),
22: (
"wagtail.blocks.StreamBlock",
[[("paragraph", 0), ("image", 21)]],
{},
),
23: (
"wagtail.blocks.StructBlock",
[[("heading", 20), ("body", 22)]],
{},
),
24: (
"wagtail.blocks.ChoiceBlock",
[],
{
"choices": [
("betongGray", "Betonggrå"),
("deepBrick", "Dyp tegl"),
("neufPink", "Griserosa"),
("goldenOrange", "Gyllen oransje"),
("goldenBeige", "Gyllen beige"),
("chateauBlue", "Slottsblå"),
],
"label": "Bakgrunnsfarge",
"required": False,
},
),
25: (
"wagtail.blocks.RichTextBlock",
(),
{
"features": [
"bold",
"italic",
"link",
"ol",
"ul",
"h2",
"h3",
],
"label": "Innhold",
},
),
26: (
"wagtail.blocks.StructBlock",
[[("background_color", 24), ("body", 25)]],
{},
),
27: (
"wagtail.images.blocks.ImageChooserBlock",
(),
{"label": "360°-bilde"},
),
28: (
"wagtail.blocks.CharBlock",
(),
{
"help_text": "Beskrivende tittel på bildet (vises også til skjermlesere)",
"label": "Tittel",
"max_length": 256,
},
),
29: (
"wagtail.blocks.StructBlock",
[[("image", 27), ("title", 28)]],
{},
),
30: ("wagtail.embeds.blocks.EmbedBlock", (), {}),
31: ("wagtail.blocks.RawHTMLBlock", (), {}),
},
default=[("paragraph", "")],
),
),
]
+1 -3
View File
@@ -11,10 +11,10 @@ from wagtail.admin.panels import FieldPanel, FieldRowPanel, MultiFieldPanel
from wagtail.fields import RichTextField, StreamField
from wagtail.models import Page
from wagtail.search import index
from wagtail_wordpress_import.models import WPImportedPageMixin
from dnscms.blocks import ImageSliderBlock
from dnscms.fields import CommonStreamField
from dnscms.wordpress.models import WPImportedPageMixin
@register_singular_query_field("venueIndex")
@@ -178,8 +178,6 @@ class VenuePage(WPImportedPageMixin, Page):
index.SearchField("body"),
]
settings_panels = Page.settings_panels + WPImportedPageMixin.wordpress_panels
def import_wordpress_data(self, data):
import html
+1 -1
View File
@@ -1,6 +1,6 @@
# Based on https://github.com/vercel/next.js/tree/canary/examples/with-docker
FROM node:22-alpine AS base
FROM node:24-alpine AS base
# Install dependencies only when needed
FROM base AS deps
+1 -1
View File
@@ -1,2 +1,2 @@
[tools]
node = "22"
node = "24"
+7
View File
@@ -1,4 +1,8 @@
/** @type {import('next').NextConfig} */
import path from "path";
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const nextConfig = {
output: "standalone",
images: {
@@ -13,6 +17,9 @@ const nextConfig = {
},
],
},
turbopack: {
root: __dirname,
},
};
export default nextConfig;
+2323 -1724
View File
File diff suppressed because it is too large Load Diff
+28 -22
View File
@@ -3,38 +3,44 @@
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev --turbopack",
"build": "next build --turbopack",
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"codegen": "graphql-codegen"
},
"dependencies": {
"@graphql-codegen/cli": "^5.0.7",
"@graphql-codegen/client-preset": "^4.8.3",
"@parcel/watcher": "^2.5.1",
"@sindresorhus/slugify": "^2.2.1",
"@urql/next": "^1.1.5",
"@graphql-codegen/cli": "^6.1.2",
"@graphql-codegen/client-preset": "^5.2.3",
"@parcel/watcher": "^2.5.6",
"@sindresorhus/slugify": "^3.0.0",
"@urql/next": "^2.0.0",
"date-fns": "^4.1.0",
"date-fns-tz": "^3.2.0",
"graphql": "^16.11.0",
"next": "^15.4.2",
"nuqs": "^2.4.3",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-intersection-observer": "^9.16.0",
"sass": "^1.89.2",
"sharp": "^0.34.3",
"swiper": "^11.2.10",
"urql": "^4.2.2",
"use-debounce": "^10.0.5"
"graphql": "^16.13.1",
"next": "^16.1.6",
"nuqs": "^2.8.9",
"react": "19.2.4",
"react-dom": "19.2.4",
"react-intersection-observer": "^10.0.3",
"react-photo-sphere-viewer": "^6.2.3",
"sass": "^1.97.3",
"sharp": "^0.34.5",
"swiper": "^12.1.2",
"urql": "^5.0.1",
"use-debounce": "^10.1.0"
},
"devDependencies": {
"@types/node": "^22",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"@types/node": "^24",
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3",
"baseline-browser-mapping": "^2.10.0",
"eslint": "^9",
"eslint-config-next": "15.4.2",
"eslint-config-next": "16.1.6",
"typescript": "^5"
},
"overrides": {
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3"
}
}
+4
View File
@@ -5,6 +5,7 @@ import { HomeFragment } from "@/gql/graphql";
import { getClient } from "@/app/client";
import { FeaturedEvents } from "@/components/events/FeaturedEvents";
import { NewsList } from "@/components/news/NewsList";
import { Newsletter } from "@/components/general/Newsletter";
import { UpcomingEvents } from "@/components/events/UpcomingEvents";
import { Pig } from "@/components/general/Pig";
import Link from "next/link";
@@ -58,6 +59,7 @@ export default async function Home() {
];
return (
<>
<main className="site-main index" id="main">
<FeaturedEvents events={featuredEvents} />
<UpcomingEvents events={events} />
@@ -89,5 +91,7 @@ export default async function Home() {
</div>
<NewsList heading="Siste nytt" featured news={news} />
</main>
<Newsletter />
</>
);
}
+82
View File
@@ -0,0 +1,82 @@
import { Metadata, ResolvingMetadata } from "next";
import { graphql } from "@/gql";
import { SponsorsPage, SponsorBlock } from "@/gql/graphql";
import { getClient } from "@/app/client";
import { PageHeader } from "@/components/general/PageHeader";
import { PageContent } from "@/components/general/PageContent";
import { getSeoMetadata } from "@/lib/seo";
import { SponsorList } from "@/components/sponsor/SponsorList";
const sponsorsPageQuery = graphql(`
query sponsors {
page: sponsorsPage {
... on SponsorsPage {
...SponsorsPage
}
}
}
`);
export async function generateMetadata(
{ params }: { params: Promise<{}> },
parent: ResolvingMetadata
): Promise<Metadata | null> {
const { data, error } = await getClient().query(sponsorsPageQuery, {});
if (error) {
throw new Error(error.message);
}
if (!data?.page) {
return null;
}
const index = data.page as SponsorsPage;
const metadata = await getSeoMetadata(index, parent);
return metadata;
}
const SponsorsPageFragmentDefinition = graphql(`
fragment SponsorsPage on SponsorsPage {
... on SponsorsPage {
title
seoTitle
searchDescription
lead
body {
...Blocks
}
sponsors {
... on SponsorBlock {
id
name
logo {
...Image
}
text
website
}
}
}
}
`);
export default async function Page() {
const { data, error } = await getClient().query(sponsorsPageQuery, {});
if (error) {
throw new Error(error.message);
}
if (!data?.page) {
throw new Error("Failed to render /sponsorer");
}
const page = data.page as SponsorsPage;
return (
<main className="site-main" id="main">
<PageHeader heading={page.title} lead={page.lead} />
{page.body && <PageContent blocks={page.body} />}
<SponsorList sponsors={page.sponsors as SponsorBlock[]} />
</main>
);
}
+17 -13
View File
@@ -6,6 +6,7 @@ import { FeaturedBlock } from "./FeaturedBlock";
import { AccordionBlock } from "./AccordionBlock";
import { EmbedBlock } from "./EmbedBlock";
import { FactBoxBlock } from "./FactBoxBlock";
import { PhotoSphereBlock } from "./PhotoSphereBlock";
import { PageSectionBlock, PageSectionNavigationBlock } from "./PageSection";
import { ContactSectionBlock, ContactSubsectionBlock } from "./ContactSection";
import { ContactListBlock } from "./ContactListBlock";
@@ -21,46 +22,49 @@ export const Blocks = ({ blocks, pageContent }: { blocks: any, pageContent?: boo
return blocks.map((block: any) => {
switch (block?.blockType) {
case "RichTextBlock":
return <RichTextBlock block={block} />;
return <RichTextBlock key={block.id} block={block} />;
break;
case "ImageWithTextBlock":
return <ImageWithTextBlock block={block} />;
return <ImageWithTextBlock key={block.id} block={block} />;
break;
case "EmbedBlock":
return <EmbedBlock block={block} />;
return <EmbedBlock key={block.id} block={block} />;
break;
case "ImageSliderBlock":
return <ImageSliderBlock block={block} pageContent />;
return <ImageSliderBlock key={block.id} block={block} pageContent />;
break;
case "HorizontalRuleBlock":
return <HorizontalRuleBlock block={block} />;
return <HorizontalRuleBlock key={block.id} block={block} />;
break;
case "FeaturedBlock":
return <FeaturedBlock block={block} />;
return <FeaturedBlock key={block.id} block={block} />;
break;
case "AccordionBlock":
return <AccordionBlock block={block} />;
return <AccordionBlock key={block.id} block={block} />;
break;
case "FactBoxBlock":
return <FactBoxBlock block={block} />;
return <FactBoxBlock key={block.id} block={block} />;
break;
case "PhotoSphereBlock":
return <PhotoSphereBlock key={block.id} block={block} />;
break;
case "PageSectionBlock":
return <PageSectionBlock block={block} />;
return <PageSectionBlock key={block.id} block={block} />;
break;
case "PageSectionNavigationBlock":
return <PageSectionNavigationBlock sections={sections} />;
break;
case "ContactSectionBlock":
return <ContactSectionBlock block={block} />;
return <ContactSectionBlock key={block.id} block={block} />;
break;
case "ContactSubsectionBlock":
return <ContactSubsectionBlock block={block} />;
return <ContactSubsectionBlock key={block.id} block={block} />;
break;
case "ContactListBlock":
return <ContactListBlock block={block} />;
return <ContactListBlock key={block.id} block={block} />;
break;
case "ContactEntityBlock":
return <ContactEntityBlock block={block} />;
return <ContactEntityBlock key={block.id} block={block} />;
break;
case "NeufAddressSectionBlock":
return <NeufAddressSectionBlock />;
@@ -0,0 +1,65 @@
"use client";
import dynamic from "next/dynamic";
import { PhotoSphereBlock as PhotoSphereBlockType } from "@/gql/graphql";
import styles from "./photoSphereBlock.module.scss";
const ReactPhotoSphereViewer = dynamic(
() =>
import("react-photo-sphere-viewer").then(
(mod) => mod.ReactPhotoSphereViewer
),
{
ssr: false,
loading: () => (
<div className={styles.loading} aria-busy="true" aria-label="Laster 360°-bilde">
<span className={styles.loadingText}>Laster 360°-bilde</span>
</div>
),
}
);
type PhotoSphereBlockTypeWithAlias = PhotoSphereBlockType & {
photoSphereImage?: PhotoSphereBlockType["image"];
photoSphereTitle?: string | null;
};
export const PhotoSphereBlock = ({
block,
}: {
block: PhotoSphereBlockTypeWithAlias;
}) => {
const image = block.photoSphereImage ?? block.image;
if (!image?.url) {
return <></>;
}
return (
<figure className={styles.photoSphereWrapper}>
<div
className={styles.photoSphereViewer}
role="img"
aria-label={block.photoSphereTitle ?? image.alt ?? "360°-bilde"}
>
<ReactPhotoSphereViewer
src={image.url}
height="500px"
width="100%"
navbar={["zoom", "fullscreen"]}
littlePlanet={false}
touchmoveTwoFingers
/>
<noscript>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img
src={image.url}
alt={block.photoSphereTitle ?? image.alt ?? "360°-bilde"}
className={styles.fallbackImage}
/>
</noscript>
</div>
{block.photoSphereTitle && <figcaption>{block.photoSphereTitle}</figcaption>}
</figure>
);
};
@@ -0,0 +1,42 @@
.photoSphereWrapper {
max-width: var(--size-width-p);
margin: 0 auto var(--spacing-m);
}
.photoSphereViewer {
width: 100%;
overflow: hidden;
border-radius: 2px;
background: var(--color-betongGray);
position: relative;
}
.loading {
display: flex;
align-items: center;
justify-content: center;
height: 500px;
width: 100%;
background: var(--color-background-secondary);
}
.loadingText {
font-size: var(--font-size-body);
color: var(--color-text-secondary, currentColor);
}
.photoSphereWrapper figcaption {
width: 100%;
max-width: var(--size-width-p);
margin: 0 auto;
padding: var(--spacing-xs) 0 var(--spacing-s);
font-size: var(--font-size-caption);
line-height: 1.4;
opacity: .8;
}
.fallbackImage {
width: 100%;
height: auto;
display: block;
}
+31 -2
View File
@@ -1,5 +1,6 @@
"use client";
import { useEffect } from "react";
import {
useQueryState,
parseAsStringLiteral,
@@ -71,7 +72,8 @@ export const EventContainer = ({
/*
Allow filtering on all organizers that have upcoming events
Filtering on an organizer with no upcoming events will work, but be hidden from dropdown
Filtering on an organizer with no upcoming events will work,
and in that case it's included in the dropdown
*/
const uniqueOrganizers: string[] = unique(
events
@@ -79,12 +81,32 @@ export const EventContainer = ({
.flat()
.filter((x) => x.__typename === "EventOrganizer")
.map((x) => x.slug)
.filter((x) => typeof x === "string")
.filter((x) => typeof x === "string" && x !== "")
);
const filterableOrganizers = uniqueOrganizers
.map((slug) => eventOrganizers.find((haystack) => haystack.slug === slug))
.filter((x) => x !== undefined) as EventOrganizer[];
// If an organizer is selected that's not in the upcoming list, add it
if (
organizer &&
!filterableOrganizers.some((org) => org.slug === organizer)
) {
const selectedOrganizer = eventOrganizers.find(
(org) => org.slug === organizer,
);
if (selectedOrganizer) {
filterableOrganizers.push(selectedOrganizer);
}
}
/* Reset organizer if slug is invalid */
useEffect(() => {
if (!eventOrganizers.find((haystack) => haystack.slug === organizer)) {
setOrganizer(null);
}
}, [eventOrganizers, organizer]);
/*
Allow filtering on all venues that have upcoming events
Filtering on a venue with no upcoming events will work,
@@ -105,6 +127,13 @@ export const EventContainer = ({
.map((x) => venues.find((haystack) => haystack.slug === x.slug))
.filter((x) => x !== undefined) as VenueFragment[];
/* Reset venue if slug is invalid */
useEffect(() => {
if (!venues.find((haystack) => haystack.slug === venue)) {
setVenue(null);
}
}, [venues, venue]);
const filteredEvents = events
.filter(
(x) =>
@@ -157,6 +157,7 @@
.dates,
.details {
font-family: var(--font-serif);
line-height: 1.24;
}
+6
View File
@@ -318,6 +318,12 @@ export function DecorativeIcon ({
<path d="M271.35 281.16C271.68 277.97 272.05 276.11 272.57 276.99C272.86 277.49 273.18 276.92 273.48 276.94C275.53 277.04 277.58 277.21 279.63 277.27C280.51 277.3 281.39 277.12 282.27 277.05C283.76 276.94 285.25 276.8 286.73 276.78C287.49 276.77 288.25 277.09 289.01 277.09C290.53 277.09 292.06 276.89 293.58 276.89C294.36 276.89 295.14 277.19 295.91 277.27C296.2 277.3 296.48 277.04 296.77 276.98C296.89 276.96 297.01 276.94 297.12 277.26C297.43 278.14 297.53 280.9 297.34 283.41C297.2 285.33 297.01 286.62 296.74 286.61C295.48 286.54 294.23 286.5 292.97 286.53C292.46 286.54 291.96 286.86 291.45 286.86C290.65 286.86 289.86 286.67 289.06 286.59C287.89 286.48 286.72 286.32 285.56 286.35C284.22 286.38 282.88 286.58 281.54 286.7C281.12 286.74 280.7 286.76 280.27 286.76C278.95 286.78 277.62 286.78 276.3 286.82C274.93 286.87 273.55 286.96 272.18 287.02C272.08 287.02 271.98 287.03 271.87 286.92C271.46 286.46 271.41 285.87 271.32 281.15L271.35 281.16Z" fill="currentColor"/>
</svg>
)}
{type === "email" && (
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.79833 18.8515C6.39828 18.9115 6.03892 18.8236 5.72025 18.5879C5.40157 18.3523 5.21228 18.0344 5.15237 17.6344L3.80227 8.61883C3.74237 8.21879 3.83024 7.85943 4.0659 7.54075C4.30157 7.22207 4.61942 7.03278 5.01947 6.97287L17.2026 5.14841C17.6027 5.0885 17.962 5.17638 18.2807 5.41204C18.5994 5.64771 18.7887 5.96556 18.8486 6.36561L20.1987 15.3811C20.2586 15.7812 20.1707 16.1405 19.9351 16.4592C19.6994 16.7779 19.3815 16.9672 18.9815 17.0271L6.79833 18.8515ZM12.0666 12.4417L5.12468 9.33937L6.34024 17.4565C6.35089 17.5276 6.38247 17.5826 6.43498 17.6214C6.48748 17.6602 6.54931 17.6743 6.62045 17.6637L18.8036 15.8392C18.8748 15.8286 18.9297 15.797 18.9686 15.7445C19.0074 15.692 19.0215 15.6302 19.0108 15.559L17.7953 7.44192L12.0666 12.4417ZM11.8819 11.2081L17.5025 6.31802L5.0754 8.179L11.8819 11.2081ZM5.12468 9.33937L4.95364 8.19724L6.34024 17.4565C6.35089 17.5276 6.38247 17.5826 6.43498 17.6214C6.48748 17.6602 6.54931 17.6743 6.62045 17.6637L6.37674 17.7002L5.12468 9.33937Z" fill="currentColor"/>
</svg>
)}
</div>
);
}
File diff suppressed because one or more lines are too long
+23
View File
@@ -0,0 +1,23 @@
import { DecorativeIcon, Icon } from "./Icon";
import styles from "./newsletter.module.scss";
export const Newsletter = ({ url }: { url?: string }) => {
const link = url ?? "https://pub.dialogapi.no/s/MjQ0NTc6MmQyZjNjY2MtOGMzYy00NWQ0LThkY2MtZmUxYWQyODNhN2Vi";
return (
<div className={styles.newsletterWrapper}>
<div className={styles.newsletter}>
<div className={styles.textWrapper}>
<div className={styles.icon}>
<DecorativeIcon type="email" />
</div>
<h2>Nyhetsbrev</h2>
<p>Meld deg vårt nyhetsbrev og hold deg oppdatert arrangementer og siste nytt!</p>
</div>
<a href={link} target="_blank" className="button primary">
Meld deg
<Icon type="arrowRight" />
</a>
</div>
</div>
);
};
@@ -0,0 +1,68 @@
.newsletterWrapper {
padding: var(--spacing-sitepadding-block) var(--spacing-sitepadding-inline);
}
.newsletter {
width: 100%;
background: var(--color-background-secondary);
display: flex;
justify-content: space-between;
align-items: center;
gap: 4rem;
padding: var(--spacing-l);
a {
white-space: nowrap;
}
}
.textWrapper {
display: grid;
grid-template-columns: auto 1fr;
column-gap: calc(var(--spacing-l)*0.9);
align-items: center;
h2 {
margin-bottom: .5rem;
}
p {
max-width: 48rem;
}
}
.icon {
grid-column: 1;
grid-row: span 2;
flex: none;
width: var(--size-icon-large);
height: var(--size-icon-large);
background: var(--color-goldenBeige);
border-radius: 100%;
display: flex;
align-items: center;
justify-content: center;
img, svg {
width: 100%;
}
}
@media (max-width: 800px) {
.newsletter {
padding: var(--spacing-m);
flex-wrap: wrap;
gap: 1rem;
justify-content: flex-end;
}
.icon {
grid-row: span 1;
}
.textWrapper {
column-gap: 1rem;
row-gap: 1rem;
p {
grid-column: span 2;
}
}
}
+40 -15
View File
@@ -49,6 +49,13 @@ export const Header = () => {
// let's add a santa hat during December
const isChristmas = new Date().getMonth() === 11;
// let's add the student hat during grisefestuka
const pigWearsHat =
new Date().getFullYear() === 2025 &&
new Date().getMonth() === 9 &&
new Date().getDate() >= 6 &&
new Date().getDate() <= 12;
return (
<>
<header
@@ -57,7 +64,7 @@ export const Header = () => {
data-small={!isInView}
>
<Link href="/" aria-label="Hjem">
<Logo christmas={isChristmas} />
<Logo christmas={isChristmas} studentHat={pigWearsHat} />
</Link>
<nav className={styles.siteMenu}>
<ul className={styles.mainMenu}>
@@ -80,8 +87,13 @@ export const Header = () => {
</Link>
</li>
<li>
<Link href="/medlem" data-active={pathname === "/medlem"}>
Bli medlem
<Link href="/frivillig" data-active={pathname === "/frivillig"}>
Bli frivillig
</Link>
</li>
<li>
<Link href="/foreninger" data-active={pathname === "/foreninger"}>
Foreninger
</Link>
</li>
</ul>
@@ -113,8 +125,16 @@ export const Header = () => {
</Link>
</li>
<li className={styles.menuItemLarge}>
<Link href="/medlem" data-active={pathname === "/medlem"}>
Bli medlem
<Link href="/frivillig" data-active={pathname === "/frivillig"}>
Bli frivillig
</Link>
</li>
<li className={styles.menuItemLarge}>
<Link
href="/foreninger"
data-active={pathname === "/foreninger"}
>
Foreninger
</Link>
</li>
<li className={styles.divider}>
@@ -133,16 +153,13 @@ export const Header = () => {
</Link>
</li>
<li>
<Link href="/frivillig" data-active={pathname === "/frivillig"}>
Bli frivillig
<Link href="/medlem" data-active={pathname === "/medlem"}>
Bli medlem
</Link>
</li>
<li>
<Link
href="/foreninger"
data-active={pathname === "/foreninger"}
>
Foreninger
<Link href="/sponsorer" data-active={pathname === "/sponsorer"}>
Sponsorer
</Link>
</li>
<li className={styles.galtinn}>
@@ -173,7 +190,7 @@ export const Header = () => {
{!isInView ? (
<LogoIcon face="left" christmas={isChristmas} />
) : (
<Logo christmas={isChristmas} />
<Logo christmas={isChristmas} studentHat={pigWearsHat} />
)}
</Link>
<nav className={styles.siteMenu}>
@@ -197,8 +214,16 @@ export const Header = () => {
</Link>
</li>
<li>
<Link href="/medlem" data-active={pathname === "/medlem"}>
Bli medlem
<Link href="/frivillig" data-active={pathname === "/frivillig"}>
Bli frivillig
</Link>
</li>
<li>
<Link
href="/foreninger"
data-active={pathname === "/foreninger"}
>
Foreninger
</Link>
</li>
</ul>
@@ -49,7 +49,6 @@ function capitalizeFirstLetter(s: string) {
}
function linkTo(page: any): string | null {
console.log(page)
if (page.__typename === "EventPage") {
return `/arrangementer/${page.slug}`;
}
@@ -0,0 +1,51 @@
import { SponsorBlock } from "@/gql/graphql";
import { Blocks } from "../blocks/Blocks";
import { Image } from "../general/Image";
import styles from "./sponsorList.module.scss";
const SponsorItem = ({ sponsor }: { sponsor: SponsorBlock }) => {
const { name, logo, website, text } = sponsor;
return (
<li className={styles.sponsorItem}>
<div className={styles.image}>
{logo && (
<Image
src={logo.url}
alt={`Logoen til ${name}`}
width={logo.width}
height={logo.height}
sizes="20vw"
/>
)}
</div>
<div className={styles.text}>
<h2>{name}</h2>
{text && (
<p
className={styles.sponsorText}
dangerouslySetInnerHTML={{ __html: text }}
/>
)}
{website && (
<p className={styles.website}>
<a href={website} target="_blank" rel="noopener">
Besøk nettside
</a>
</p>
)}
</div>
</li>
);
};
export const SponsorList = ({ sponsors }: { sponsors: SponsorBlock[] }) => {
return (
<section className={styles.sponsorList}>
<ul>
{sponsors.map((sponsor) => (
<SponsorItem key={sponsor.name} sponsor={sponsor} />
))}
</ul>
</section>
);
};
@@ -0,0 +1,57 @@
.sponsorList {
margin-bottom: var(--spacing-section-bottom);
ul {
list-style: none;
}
}
.sponsorItem {
//background: var(--color-background-secondary);
border-top: var(--border);
padding: var(--spacing-m) 0;
display: grid;
grid-template-columns: 1fr var(--size-width-p) 1fr;
align-items: center;
column-gap: var(--spacing-gap-column);
margin-bottom: var(--spacing-gap-row);
min-height: 10rem;
&:last-child {
border-bottom: var(--border);
}
h2 {
font-size: var(--font-size-h3);
margin-bottom: 1rem;
}
p {
font-size: var(--font-size-caption);
}
.website {
display: inline-block;
font-weight: 600;
margin-top: 1rem;
}
}
.image {
width: 10rem;
height: 10rem;
display: flex;
align-items: center;
}
@media (max-width: 1260px) {
.sponsorItem {
grid-template-columns: 10rem 1fr;
}
}
@media (max-width: 600px) {
.sponsorItem {
grid-template-columns: 5rem 1fr;
align-items: flex-start;
}
.image {
width: 5rem;
height: 5rem;
}
}
-2
View File
@@ -1,5 +1,3 @@
@import url("https://cdn.fonts.net/t/1.css?apiType=css&projectid=84b2007c-70ef-4f2d-9bd7-ad88739bae2f");
@font-face {
font-family: "Avenir Next";
font-style: normal;
+27 -9
View File
@@ -36,16 +36,19 @@ type Documents = {
"\n fragment Home on HomePage {\n ... on HomePage {\n featuredEvents {\n id\n }\n }\n }\n": typeof types.HomeFragmentDoc,
"\n query home {\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n home: page(contentType: \"home.HomePage\", urlPath: \"/home/\") {\n ... on HomePage {\n ...Home\n }\n }\n news: pages(contentType: \"news.newsPage\", order: \"-first_published_at\", limit: 4) {\n ... on NewsPage {\n ...News\n }\n }\n }\n ": typeof types.HomeDocument,
"\n query search($query: String) {\n results: search(query: $query) {\n __typename\n ... on PageInterface {\n slug\n }\n ... on NewsPage {\n id\n title\n }\n ... on EventPage {\n id\n title\n }\n ... on GenericPage {\n id\n title\n }\n ... on VenuePage {\n id\n title\n }\n ... on AssociationPage {\n id\n title\n associationType\n }\n }\n }\n ": typeof types.SearchDocument,
"\n query sponsors {\n page: sponsorsPage {\n ... on SponsorsPage {\n ...SponsorsPage\n }\n }\n }\n": typeof types.SponsorsDocument,
"\n fragment SponsorsPage on SponsorsPage {\n ... on SponsorsPage {\n title\n seoTitle\n searchDescription\n lead\n body {\n ...Blocks\n }\n sponsors {\n ... on SponsorBlock {\n id\n name\n logo {\n ...Image\n }\n text\n website\n }\n }\n }\n }\n": typeof types.SponsorsPageFragmentDoc,
"\n query venueRentalIndex {\n index: venueRentalIndex {\n ... on VenueRentalIndex {\n ...VenueRentalIndex\n }\n }\n venues: pages(contentType: \"venues.VenuePage\", limit: 100) {\n ... on VenuePage {\n ...Venue\n }\n }\n }\n": typeof types.VenueRentalIndexDocument,
"\n fragment VenueRentalIndex on VenueRentalIndex {\n ... on VenueRentalIndex {\n title\n seoTitle\n searchDescription\n lead\n body {\n ...Blocks\n }\n }\n }\n": typeof types.VenueRentalIndexFragmentDoc,
"\n fragment OneLevelOfBlocks on StreamFieldInterface {\n id\n blockType\n field\n ... on RichTextBlock {\n rawValue\n value\n }\n ... on ImageWithTextBlock {\n image {\n ...Image\n }\n imageFormat\n text\n }\n ... on ImageSliderBlock {\n images {\n ... on ImageSliderItemBlock {\n image {\n ...Image\n }\n text\n }\n }\n }\n ... on HorizontalRuleBlock {\n color\n }\n ... on FeaturedBlock {\n title\n featuredBlockText: text\n linkText\n imagePosition\n backgroundColor\n featuredPage {\n contentType\n pageType\n url\n ... on EventPage {\n featuredImage {\n ...Image\n }\n }\n ... on NewsPage {\n featuredImage {\n ...Image\n }\n }\n }\n featuredImageOverride {\n ...Image\n }\n }\n ... on ContactListBlock {\n items {\n blockType\n ... on ContactEntityBlock {\n contactEntity {\n ...ContactEntity\n }\n }\n }\n }\n ... on EmbedBlock {\n url\n embed\n rawEmbed\n }\n ... on FactBoxBlock {\n backgroundColor\n factBoxBody: body\n }\n }\n": typeof types.OneLevelOfBlocksFragmentDoc,
"\n fragment LeafBlocks on StreamFieldInterface {\n id\n blockType\n field\n ... on RichTextBlock {\n rawValue\n value\n }\n ... on ImageWithTextBlock {\n image {\n ...Image\n }\n imageFormat\n text\n }\n ... on ImageSliderBlock {\n images {\n ... on ImageSliderItemBlock {\n image {\n ...Image\n }\n text\n }\n }\n }\n ... on HorizontalRuleBlock {\n color\n }\n ... on FeaturedBlock {\n title\n featuredBlockText: text\n linkText\n imagePosition\n backgroundColor\n featuredPage {\n contentType\n pageType\n url\n ... on EventPage {\n featuredImage {\n ...Image\n }\n }\n ... on NewsPage {\n featuredImage {\n ...Image\n }\n }\n }\n featuredImageOverride {\n ...Image\n }\n }\n ... on ContactListBlock {\n items {\n blockType\n ... on ContactEntityBlock {\n contactEntity {\n ...ContactEntity\n }\n }\n }\n }\n ... on EmbedBlock {\n url\n embed\n rawEmbed\n }\n ... on FactBoxBlock {\n backgroundColor\n factBoxBody: body\n }\n ... on PhotoSphereBlock {\n photoSphereImage: image {\n ...Image\n }\n photoSphereTitle: title\n }\n }\n": typeof types.LeafBlocksFragmentDoc,
"\n fragment OneLevelOfBlocks on StreamFieldInterface {\n ...LeafBlocks\n ... on AccordionBlock {\n heading\n body {\n ...LeafBlocks\n }\n }\n ... on PageSectionBlock {\n title\n backgroundColor\n icon\n body {\n ...LeafBlocks\n }\n }\n }\n": typeof types.OneLevelOfBlocksFragmentDoc,
"\n fragment Blocks on StreamFieldInterface {\n ... on AccordionBlock {\n heading\n body {\n ...OneLevelOfBlocks\n }\n }\n ... on PageSectionBlock {\n title\n backgroundColor\n icon\n body {\n ...OneLevelOfBlocks\n }\n }\n ... on ContactSectionBlock {\n title\n text\n blocks {\n ... on ContactSubsectionBlock {\n title\n text\n blocks {\n ...OneLevelOfBlocks\n }\n }\n ...OneLevelOfBlocks\n }\n }\n ...OneLevelOfBlocks\n }\n": typeof types.BlocksFragmentDoc,
"\n fragment Image on CustomImage {\n id\n url\n width\n height\n alt\n attribution\n }\n": typeof types.ImageFragmentDoc,
"\n fragment ContactEntity on ContactEntity {\n id\n name\n contactType\n title\n email\n phoneNumber\n image {\n ...Image\n }\n }\n": typeof types.ContactEntityFragmentDoc,
"\n fragment Event on EventPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n subtitle\n lead\n body {\n ...OneLevelOfBlocks\n }\n featuredImage {\n ...Image\n }\n pig\n facebookUrl\n ticketUrl\n free\n priceRegular\n priceMember\n priceStudent\n categories {\n ... on EventCategory {\n name\n slug\n pig\n }\n }\n occurrences {\n ... on EventOccurrence {\n __typename\n id\n start\n end\n venue {\n __typename\n id\n slug\n title\n preposition\n url\n }\n venueCustom\n }\n }\n organizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n }\n": typeof types.EventFragmentDoc,
"\n fragment Event on EventPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n subtitle\n lead\n body {\n ...OneLevelOfBlocks\n }\n featuredImage {\n ...Image\n }\n pig\n facebookUrl\n ticketUrl\n free\n priceRegular\n priceMember\n priceStudent\n categories {\n ... on EventCategory {\n name\n slug\n pig\n }\n }\n occurrences(limit: 5000) {\n ... on EventOccurrence {\n __typename\n id\n start\n end\n venue {\n __typename\n id\n slug\n title\n preposition\n url\n }\n venueCustom\n }\n }\n organizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n }\n": typeof types.EventFragmentDoc,
"\n fragment EventIndex on EventIndex {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n }\n": typeof types.EventIndexFragmentDoc,
"\n query eventIndexMetadata {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n }\n": typeof types.EventIndexMetadataDocument,
"\n query futureEvents {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n eventCategories: eventCategories {\n ... on EventCategory {\n name\n slug\n showInFilters\n }\n }\n eventOrganizers: eventOrganizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n venues: pages(contentType: \"venues.VenuePage\") {\n ... on VenuePage {\n id\n title\n slug\n preposition\n }\n }\n }\n": typeof types.FutureEventsDocument,
"\n query futureEvents {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n eventCategories: eventCategories(limit: 5000) {\n ... on EventCategory {\n name\n slug\n showInFilters\n }\n }\n eventOrganizers: eventOrganizers(limit: 5000) {\n ... on EventOrganizer {\n id\n name\n slug\n }\n }\n venues: pages(contentType: \"venues.VenuePage\") {\n ... on VenuePage {\n id\n title\n slug\n preposition\n }\n }\n }\n": typeof types.FutureEventsDocument,
"\n fragment News on NewsPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n firstPublishedAt\n excerpt\n lead\n featuredImage {\n ...Image\n }\n body {\n ...Blocks\n }\n }\n": typeof types.NewsFragmentDoc,
"\n fragment NewsIndex on NewsIndex {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n lead\n }\n": typeof types.NewsIndexFragmentDoc,
"\n query news {\n index: newsIndex {\n ... on NewsIndex {\n ...NewsIndex\n }\n }\n news: pages(contentType: \"news.NewsPage\", order: \"-first_published_at\", limit: 1000) {\n ... on NewsPage {\n ...News\n }\n }\n }\n": typeof types.NewsDocument,
@@ -77,16 +80,19 @@ const documents: Documents = {
"\n fragment Home on HomePage {\n ... on HomePage {\n featuredEvents {\n id\n }\n }\n }\n": types.HomeFragmentDoc,
"\n query home {\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n home: page(contentType: \"home.HomePage\", urlPath: \"/home/\") {\n ... on HomePage {\n ...Home\n }\n }\n news: pages(contentType: \"news.newsPage\", order: \"-first_published_at\", limit: 4) {\n ... on NewsPage {\n ...News\n }\n }\n }\n ": types.HomeDocument,
"\n query search($query: String) {\n results: search(query: $query) {\n __typename\n ... on PageInterface {\n slug\n }\n ... on NewsPage {\n id\n title\n }\n ... on EventPage {\n id\n title\n }\n ... on GenericPage {\n id\n title\n }\n ... on VenuePage {\n id\n title\n }\n ... on AssociationPage {\n id\n title\n associationType\n }\n }\n }\n ": types.SearchDocument,
"\n query sponsors {\n page: sponsorsPage {\n ... on SponsorsPage {\n ...SponsorsPage\n }\n }\n }\n": types.SponsorsDocument,
"\n fragment SponsorsPage on SponsorsPage {\n ... on SponsorsPage {\n title\n seoTitle\n searchDescription\n lead\n body {\n ...Blocks\n }\n sponsors {\n ... on SponsorBlock {\n id\n name\n logo {\n ...Image\n }\n text\n website\n }\n }\n }\n }\n": types.SponsorsPageFragmentDoc,
"\n query venueRentalIndex {\n index: venueRentalIndex {\n ... on VenueRentalIndex {\n ...VenueRentalIndex\n }\n }\n venues: pages(contentType: \"venues.VenuePage\", limit: 100) {\n ... on VenuePage {\n ...Venue\n }\n }\n }\n": types.VenueRentalIndexDocument,
"\n fragment VenueRentalIndex on VenueRentalIndex {\n ... on VenueRentalIndex {\n title\n seoTitle\n searchDescription\n lead\n body {\n ...Blocks\n }\n }\n }\n": types.VenueRentalIndexFragmentDoc,
"\n fragment OneLevelOfBlocks on StreamFieldInterface {\n id\n blockType\n field\n ... on RichTextBlock {\n rawValue\n value\n }\n ... on ImageWithTextBlock {\n image {\n ...Image\n }\n imageFormat\n text\n }\n ... on ImageSliderBlock {\n images {\n ... on ImageSliderItemBlock {\n image {\n ...Image\n }\n text\n }\n }\n }\n ... on HorizontalRuleBlock {\n color\n }\n ... on FeaturedBlock {\n title\n featuredBlockText: text\n linkText\n imagePosition\n backgroundColor\n featuredPage {\n contentType\n pageType\n url\n ... on EventPage {\n featuredImage {\n ...Image\n }\n }\n ... on NewsPage {\n featuredImage {\n ...Image\n }\n }\n }\n featuredImageOverride {\n ...Image\n }\n }\n ... on ContactListBlock {\n items {\n blockType\n ... on ContactEntityBlock {\n contactEntity {\n ...ContactEntity\n }\n }\n }\n }\n ... on EmbedBlock {\n url\n embed\n rawEmbed\n }\n ... on FactBoxBlock {\n backgroundColor\n factBoxBody: body\n }\n }\n": types.OneLevelOfBlocksFragmentDoc,
"\n fragment LeafBlocks on StreamFieldInterface {\n id\n blockType\n field\n ... on RichTextBlock {\n rawValue\n value\n }\n ... on ImageWithTextBlock {\n image {\n ...Image\n }\n imageFormat\n text\n }\n ... on ImageSliderBlock {\n images {\n ... on ImageSliderItemBlock {\n image {\n ...Image\n }\n text\n }\n }\n }\n ... on HorizontalRuleBlock {\n color\n }\n ... on FeaturedBlock {\n title\n featuredBlockText: text\n linkText\n imagePosition\n backgroundColor\n featuredPage {\n contentType\n pageType\n url\n ... on EventPage {\n featuredImage {\n ...Image\n }\n }\n ... on NewsPage {\n featuredImage {\n ...Image\n }\n }\n }\n featuredImageOverride {\n ...Image\n }\n }\n ... on ContactListBlock {\n items {\n blockType\n ... on ContactEntityBlock {\n contactEntity {\n ...ContactEntity\n }\n }\n }\n }\n ... on EmbedBlock {\n url\n embed\n rawEmbed\n }\n ... on FactBoxBlock {\n backgroundColor\n factBoxBody: body\n }\n ... on PhotoSphereBlock {\n photoSphereImage: image {\n ...Image\n }\n photoSphereTitle: title\n }\n }\n": types.LeafBlocksFragmentDoc,
"\n fragment OneLevelOfBlocks on StreamFieldInterface {\n ...LeafBlocks\n ... on AccordionBlock {\n heading\n body {\n ...LeafBlocks\n }\n }\n ... on PageSectionBlock {\n title\n backgroundColor\n icon\n body {\n ...LeafBlocks\n }\n }\n }\n": types.OneLevelOfBlocksFragmentDoc,
"\n fragment Blocks on StreamFieldInterface {\n ... on AccordionBlock {\n heading\n body {\n ...OneLevelOfBlocks\n }\n }\n ... on PageSectionBlock {\n title\n backgroundColor\n icon\n body {\n ...OneLevelOfBlocks\n }\n }\n ... on ContactSectionBlock {\n title\n text\n blocks {\n ... on ContactSubsectionBlock {\n title\n text\n blocks {\n ...OneLevelOfBlocks\n }\n }\n ...OneLevelOfBlocks\n }\n }\n ...OneLevelOfBlocks\n }\n": types.BlocksFragmentDoc,
"\n fragment Image on CustomImage {\n id\n url\n width\n height\n alt\n attribution\n }\n": types.ImageFragmentDoc,
"\n fragment ContactEntity on ContactEntity {\n id\n name\n contactType\n title\n email\n phoneNumber\n image {\n ...Image\n }\n }\n": types.ContactEntityFragmentDoc,
"\n fragment Event on EventPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n subtitle\n lead\n body {\n ...OneLevelOfBlocks\n }\n featuredImage {\n ...Image\n }\n pig\n facebookUrl\n ticketUrl\n free\n priceRegular\n priceMember\n priceStudent\n categories {\n ... on EventCategory {\n name\n slug\n pig\n }\n }\n occurrences {\n ... on EventOccurrence {\n __typename\n id\n start\n end\n venue {\n __typename\n id\n slug\n title\n preposition\n url\n }\n venueCustom\n }\n }\n organizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n }\n": types.EventFragmentDoc,
"\n fragment Event on EventPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n subtitle\n lead\n body {\n ...OneLevelOfBlocks\n }\n featuredImage {\n ...Image\n }\n pig\n facebookUrl\n ticketUrl\n free\n priceRegular\n priceMember\n priceStudent\n categories {\n ... on EventCategory {\n name\n slug\n pig\n }\n }\n occurrences(limit: 5000) {\n ... on EventOccurrence {\n __typename\n id\n start\n end\n venue {\n __typename\n id\n slug\n title\n preposition\n url\n }\n venueCustom\n }\n }\n organizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n }\n": types.EventFragmentDoc,
"\n fragment EventIndex on EventIndex {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n }\n": types.EventIndexFragmentDoc,
"\n query eventIndexMetadata {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n }\n": types.EventIndexMetadataDocument,
"\n query futureEvents {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n eventCategories: eventCategories {\n ... on EventCategory {\n name\n slug\n showInFilters\n }\n }\n eventOrganizers: eventOrganizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n venues: pages(contentType: \"venues.VenuePage\") {\n ... on VenuePage {\n id\n title\n slug\n preposition\n }\n }\n }\n": types.FutureEventsDocument,
"\n query futureEvents {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n eventCategories: eventCategories(limit: 5000) {\n ... on EventCategory {\n name\n slug\n showInFilters\n }\n }\n eventOrganizers: eventOrganizers(limit: 5000) {\n ... on EventOrganizer {\n id\n name\n slug\n }\n }\n venues: pages(contentType: \"venues.VenuePage\") {\n ... on VenuePage {\n id\n title\n slug\n preposition\n }\n }\n }\n": types.FutureEventsDocument,
"\n fragment News on NewsPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n firstPublishedAt\n excerpt\n lead\n featuredImage {\n ...Image\n }\n body {\n ...Blocks\n }\n }\n": types.NewsFragmentDoc,
"\n fragment NewsIndex on NewsIndex {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n lead\n }\n": types.NewsIndexFragmentDoc,
"\n query news {\n index: newsIndex {\n ... on NewsIndex {\n ...NewsIndex\n }\n }\n news: pages(contentType: \"news.NewsPage\", order: \"-first_published_at\", limit: 1000) {\n ... on NewsPage {\n ...News\n }\n }\n }\n": types.NewsDocument,
@@ -198,6 +204,14 @@ export function graphql(source: "\n query home {\n events: eventIndex {\
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n query search($query: String) {\n results: search(query: $query) {\n __typename\n ... on PageInterface {\n slug\n }\n ... on NewsPage {\n id\n title\n }\n ... on EventPage {\n id\n title\n }\n ... on GenericPage {\n id\n title\n }\n ... on VenuePage {\n id\n title\n }\n ... on AssociationPage {\n id\n title\n associationType\n }\n }\n }\n "): (typeof documents)["\n query search($query: String) {\n results: search(query: $query) {\n __typename\n ... on PageInterface {\n slug\n }\n ... on NewsPage {\n id\n title\n }\n ... on EventPage {\n id\n title\n }\n ... on GenericPage {\n id\n title\n }\n ... on VenuePage {\n id\n title\n }\n ... on AssociationPage {\n id\n title\n associationType\n }\n }\n }\n "];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n query sponsors {\n page: sponsorsPage {\n ... on SponsorsPage {\n ...SponsorsPage\n }\n }\n }\n"): (typeof documents)["\n query sponsors {\n page: sponsorsPage {\n ... on SponsorsPage {\n ...SponsorsPage\n }\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n fragment SponsorsPage on SponsorsPage {\n ... on SponsorsPage {\n title\n seoTitle\n searchDescription\n lead\n body {\n ...Blocks\n }\n sponsors {\n ... on SponsorBlock {\n id\n name\n logo {\n ...Image\n }\n text\n website\n }\n }\n }\n }\n"): (typeof documents)["\n fragment SponsorsPage on SponsorsPage {\n ... on SponsorsPage {\n title\n seoTitle\n searchDescription\n lead\n body {\n ...Blocks\n }\n sponsors {\n ... on SponsorBlock {\n id\n name\n logo {\n ...Image\n }\n text\n website\n }\n }\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -209,7 +223,11 @@ export function graphql(source: "\n fragment VenueRentalIndex on VenueRentalInd
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n fragment OneLevelOfBlocks on StreamFieldInterface {\n id\n blockType\n field\n ... on RichTextBlock {\n rawValue\n value\n }\n ... on ImageWithTextBlock {\n image {\n ...Image\n }\n imageFormat\n text\n }\n ... on ImageSliderBlock {\n images {\n ... on ImageSliderItemBlock {\n image {\n ...Image\n }\n text\n }\n }\n }\n ... on HorizontalRuleBlock {\n color\n }\n ... on FeaturedBlock {\n title\n featuredBlockText: text\n linkText\n imagePosition\n backgroundColor\n featuredPage {\n contentType\n pageType\n url\n ... on EventPage {\n featuredImage {\n ...Image\n }\n }\n ... on NewsPage {\n featuredImage {\n ...Image\n }\n }\n }\n featuredImageOverride {\n ...Image\n }\n }\n ... on ContactListBlock {\n items {\n blockType\n ... on ContactEntityBlock {\n contactEntity {\n ...ContactEntity\n }\n }\n }\n }\n ... on EmbedBlock {\n url\n embed\n rawEmbed\n }\n ... on FactBoxBlock {\n backgroundColor\n factBoxBody: body\n }\n }\n"): (typeof documents)["\n fragment OneLevelOfBlocks on StreamFieldInterface {\n id\n blockType\n field\n ... on RichTextBlock {\n rawValue\n value\n }\n ... on ImageWithTextBlock {\n image {\n ...Image\n }\n imageFormat\n text\n }\n ... on ImageSliderBlock {\n images {\n ... on ImageSliderItemBlock {\n image {\n ...Image\n }\n text\n }\n }\n }\n ... on HorizontalRuleBlock {\n color\n }\n ... on FeaturedBlock {\n title\n featuredBlockText: text\n linkText\n imagePosition\n backgroundColor\n featuredPage {\n contentType\n pageType\n url\n ... on EventPage {\n featuredImage {\n ...Image\n }\n }\n ... on NewsPage {\n featuredImage {\n ...Image\n }\n }\n }\n featuredImageOverride {\n ...Image\n }\n }\n ... on ContactListBlock {\n items {\n blockType\n ... on ContactEntityBlock {\n contactEntity {\n ...ContactEntity\n }\n }\n }\n }\n ... on EmbedBlock {\n url\n embed\n rawEmbed\n }\n ... on FactBoxBlock {\n backgroundColor\n factBoxBody: body\n }\n }\n"];
export function graphql(source: "\n fragment LeafBlocks on StreamFieldInterface {\n id\n blockType\n field\n ... on RichTextBlock {\n rawValue\n value\n }\n ... on ImageWithTextBlock {\n image {\n ...Image\n }\n imageFormat\n text\n }\n ... on ImageSliderBlock {\n images {\n ... on ImageSliderItemBlock {\n image {\n ...Image\n }\n text\n }\n }\n }\n ... on HorizontalRuleBlock {\n color\n }\n ... on FeaturedBlock {\n title\n featuredBlockText: text\n linkText\n imagePosition\n backgroundColor\n featuredPage {\n contentType\n pageType\n url\n ... on EventPage {\n featuredImage {\n ...Image\n }\n }\n ... on NewsPage {\n featuredImage {\n ...Image\n }\n }\n }\n featuredImageOverride {\n ...Image\n }\n }\n ... on ContactListBlock {\n items {\n blockType\n ... on ContactEntityBlock {\n contactEntity {\n ...ContactEntity\n }\n }\n }\n }\n ... on EmbedBlock {\n url\n embed\n rawEmbed\n }\n ... on FactBoxBlock {\n backgroundColor\n factBoxBody: body\n }\n ... on PhotoSphereBlock {\n photoSphereImage: image {\n ...Image\n }\n photoSphereTitle: title\n }\n }\n"): (typeof documents)["\n fragment LeafBlocks on StreamFieldInterface {\n id\n blockType\n field\n ... on RichTextBlock {\n rawValue\n value\n }\n ... on ImageWithTextBlock {\n image {\n ...Image\n }\n imageFormat\n text\n }\n ... on ImageSliderBlock {\n images {\n ... on ImageSliderItemBlock {\n image {\n ...Image\n }\n text\n }\n }\n }\n ... on HorizontalRuleBlock {\n color\n }\n ... on FeaturedBlock {\n title\n featuredBlockText: text\n linkText\n imagePosition\n backgroundColor\n featuredPage {\n contentType\n pageType\n url\n ... on EventPage {\n featuredImage {\n ...Image\n }\n }\n ... on NewsPage {\n featuredImage {\n ...Image\n }\n }\n }\n featuredImageOverride {\n ...Image\n }\n }\n ... on ContactListBlock {\n items {\n blockType\n ... on ContactEntityBlock {\n contactEntity {\n ...ContactEntity\n }\n }\n }\n }\n ... on EmbedBlock {\n url\n embed\n rawEmbed\n }\n ... on FactBoxBlock {\n backgroundColor\n factBoxBody: body\n }\n ... on PhotoSphereBlock {\n photoSphereImage: image {\n ...Image\n }\n photoSphereTitle: title\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n fragment OneLevelOfBlocks on StreamFieldInterface {\n ...LeafBlocks\n ... on AccordionBlock {\n heading\n body {\n ...LeafBlocks\n }\n }\n ... on PageSectionBlock {\n title\n backgroundColor\n icon\n body {\n ...LeafBlocks\n }\n }\n }\n"): (typeof documents)["\n fragment OneLevelOfBlocks on StreamFieldInterface {\n ...LeafBlocks\n ... on AccordionBlock {\n heading\n body {\n ...LeafBlocks\n }\n }\n ... on PageSectionBlock {\n title\n backgroundColor\n icon\n body {\n ...LeafBlocks\n }\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -225,7 +243,7 @@ export function graphql(source: "\n fragment ContactEntity on ContactEntity {\n
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n fragment Event on EventPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n subtitle\n lead\n body {\n ...OneLevelOfBlocks\n }\n featuredImage {\n ...Image\n }\n pig\n facebookUrl\n ticketUrl\n free\n priceRegular\n priceMember\n priceStudent\n categories {\n ... on EventCategory {\n name\n slug\n pig\n }\n }\n occurrences {\n ... on EventOccurrence {\n __typename\n id\n start\n end\n venue {\n __typename\n id\n slug\n title\n preposition\n url\n }\n venueCustom\n }\n }\n organizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n }\n"): (typeof documents)["\n fragment Event on EventPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n subtitle\n lead\n body {\n ...OneLevelOfBlocks\n }\n featuredImage {\n ...Image\n }\n pig\n facebookUrl\n ticketUrl\n free\n priceRegular\n priceMember\n priceStudent\n categories {\n ... on EventCategory {\n name\n slug\n pig\n }\n }\n occurrences {\n ... on EventOccurrence {\n __typename\n id\n start\n end\n venue {\n __typename\n id\n slug\n title\n preposition\n url\n }\n venueCustom\n }\n }\n organizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n }\n"];
export function graphql(source: "\n fragment Event on EventPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n subtitle\n lead\n body {\n ...OneLevelOfBlocks\n }\n featuredImage {\n ...Image\n }\n pig\n facebookUrl\n ticketUrl\n free\n priceRegular\n priceMember\n priceStudent\n categories {\n ... on EventCategory {\n name\n slug\n pig\n }\n }\n occurrences(limit: 5000) {\n ... on EventOccurrence {\n __typename\n id\n start\n end\n venue {\n __typename\n id\n slug\n title\n preposition\n url\n }\n venueCustom\n }\n }\n organizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n }\n"): (typeof documents)["\n fragment Event on EventPage {\n __typename\n id\n slug\n seoTitle\n searchDescription\n title\n subtitle\n lead\n body {\n ...OneLevelOfBlocks\n }\n featuredImage {\n ...Image\n }\n pig\n facebookUrl\n ticketUrl\n free\n priceRegular\n priceMember\n priceStudent\n categories {\n ... on EventCategory {\n name\n slug\n pig\n }\n }\n occurrences(limit: 5000) {\n ... on EventOccurrence {\n __typename\n id\n start\n end\n venue {\n __typename\n id\n slug\n title\n preposition\n url\n }\n venueCustom\n }\n }\n organizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
@@ -237,7 +255,7 @@ export function graphql(source: "\n query eventIndexMetadata {\n index: even
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n query futureEvents {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n eventCategories: eventCategories {\n ... on EventCategory {\n name\n slug\n showInFilters\n }\n }\n eventOrganizers: eventOrganizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n venues: pages(contentType: \"venues.VenuePage\") {\n ... on VenuePage {\n id\n title\n slug\n preposition\n }\n }\n }\n"): (typeof documents)["\n query futureEvents {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n eventCategories: eventCategories {\n ... on EventCategory {\n name\n slug\n showInFilters\n }\n }\n eventOrganizers: eventOrganizers {\n ... on EventOrganizer {\n id\n name\n slug\n externalUrl\n association {\n ... on AssociationPage {\n url\n }\n }\n }\n }\n venues: pages(contentType: \"venues.VenuePage\") {\n ... on VenuePage {\n id\n title\n slug\n preposition\n }\n }\n }\n"];
export function graphql(source: "\n query futureEvents {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n eventCategories: eventCategories(limit: 5000) {\n ... on EventCategory {\n name\n slug\n showInFilters\n }\n }\n eventOrganizers: eventOrganizers(limit: 5000) {\n ... on EventOrganizer {\n id\n name\n slug\n }\n }\n venues: pages(contentType: \"venues.VenuePage\") {\n ... on VenuePage {\n id\n title\n slug\n preposition\n }\n }\n }\n"): (typeof documents)["\n query futureEvents {\n index: eventIndex {\n ... on EventIndex {\n ...EventIndex\n }\n }\n events: eventIndex {\n ... on EventIndex {\n futureEvents {\n ... on EventPage {\n ...Event\n }\n }\n }\n }\n eventCategories: eventCategories(limit: 5000) {\n ... on EventCategory {\n name\n slug\n showInFilters\n }\n }\n eventOrganizers: eventOrganizers(limit: 5000) {\n ... on EventOrganizer {\n id\n name\n slug\n }\n }\n venues: pages(contentType: \"venues.VenuePage\") {\n ... on VenuePage {\n id\n title\n slug\n preposition\n }\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
+3529 -669
View File
File diff suppressed because one or more lines are too long
+28 -2
View File
@@ -91,8 +91,8 @@ export function formatHumanReadableList(array: (string | number)[]): string {
return array.slice(0, -1).join(", ") + " og " + array[length - 1];
}
const OneLevelOfBlocksFragmentDefinition = graphql(`
fragment OneLevelOfBlocks on StreamFieldInterface {
const LeafBlocksFragmentDefinition = graphql(`
fragment LeafBlocks on StreamFieldInterface {
id
blockType
field
@@ -164,6 +164,32 @@ const OneLevelOfBlocksFragmentDefinition = graphql(`
backgroundColor
factBoxBody: body
}
... on PhotoSphereBlock {
photoSphereImage: image {
...Image
}
photoSphereTitle: title
}
}
`);
const OneLevelOfBlocksFragmentDefinition = graphql(`
fragment OneLevelOfBlocks on StreamFieldInterface {
...LeafBlocks
... on AccordionBlock {
heading
body {
...LeafBlocks
}
}
... on PageSectionBlock {
title
backgroundColor
icon
body {
...LeafBlocks
}
}
}
`);
+3 -1
View File
@@ -44,7 +44,9 @@ export function formatExtendedDateTime(
const timePart = dateOnly ? "" : " 'kl.' HH:mm";
const isCurrentYear = parsed.getFullYear() === new Date().getFullYear();
const yearPart = (!isCurrentYear || alwaysIncludeYear) ? " yyyy" : "";
return formatDate(parsed, `EEEE d. MMMM${yearPart}${timePart}`);
const formatStr = `EEEE d. MMMM${yearPart}${timePart}`;
const formatted = format(parsed, formatStr, { timeZone, locale: nb });
return formatted;
}
export function isTodayOrFuture(
+3 -9
View File
@@ -53,7 +53,7 @@ const EventFragmentDefinition = graphql(`
pig
}
}
occurrences {
occurrences(limit: 5000) {
... on EventOccurrence {
__typename
id
@@ -123,24 +123,18 @@ export const eventsOverviewQuery = graphql(`
}
}
}
eventCategories: eventCategories {
eventCategories: eventCategories(limit: 5000) {
... on EventCategory {
name
slug
showInFilters
}
}
eventOrganizers: eventOrganizers {
eventOrganizers: eventOrganizers(limit: 5000) {
... on EventOrganizer {
id
name
slug
externalUrl
association {
... on AssociationPage {
url
}
}
}
}
venues: pages(contentType: "venues.VenuePage") {
+3 -2
View File
@@ -14,7 +14,7 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"jsx": "react-jsx",
"incremental": true,
"plugins": [
{
@@ -32,7 +32,8 @@
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
".next/types/**/*.ts",
".next/dev/types/**/*.ts"
],
"exclude": [
"node_modules"