From 0e492d0885276893218a120a22f8e0f88d88c231 Mon Sep 17 00:00:00 2001 From: Marco Acierno Date: Sat, 20 Jun 2026 19:57:27 +0200 Subject: [PATCH 1/2] Remove old pages --- backend/api/pages/__init__.py | 0 backend/api/pages/schema.py | 19 --- backend/api/pages/types.py | 16 -- backend/api/schema.py | 2 - backend/api/tests/schema/test_pages.py | 156 ------------------ backend/cms/models.py | 8 - backend/pages/__init__.py | 0 backend/pages/admin.py | 25 --- backend/pages/apps.py | 5 - backend/pages/migrations/0001_initial.py | 36 ---- .../migrations/0002_auto_20190914_1504.py | 33 ---- backend/pages/migrations/__init__.py | 0 backend/pages/models.py | 52 ------ backend/pages/tests/__init__.py | 0 backend/pages/tests/factories.py | 19 --- 15 files changed, 371 deletions(-) delete mode 100644 backend/api/pages/__init__.py delete mode 100644 backend/api/pages/schema.py delete mode 100644 backend/api/pages/types.py delete mode 100644 backend/api/tests/schema/test_pages.py delete mode 100644 backend/pages/__init__.py delete mode 100644 backend/pages/admin.py delete mode 100644 backend/pages/apps.py delete mode 100644 backend/pages/migrations/0001_initial.py delete mode 100644 backend/pages/migrations/0002_auto_20190914_1504.py delete mode 100644 backend/pages/migrations/__init__.py delete mode 100644 backend/pages/models.py delete mode 100644 backend/pages/tests/__init__.py delete mode 100644 backend/pages/tests/factories.py diff --git a/backend/api/pages/__init__.py b/backend/api/pages/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/backend/api/pages/schema.py b/backend/api/pages/schema.py deleted file mode 100644 index f4e726c260..0000000000 --- a/backend/api/pages/schema.py +++ /dev/null @@ -1,19 +0,0 @@ -from api.context import Info -import strawberry -from pages.models import Page - -from .types import Page as PageType - - -@strawberry.type -class PagesQuery: - # TODO: use custom scalar for code and update custom gatsby source to use - # that instead of a generic argument called code - - @strawberry.field - def pages(self, info: Info, code: str) -> list[PageType]: - return Page.published_pages.filter(conference__code=code) - - @strawberry.field - def page(self, info: Info, code: str, slug: str) -> PageType | None: - return Page.published_pages.by_slug(slug).filter(conference__code=code).first() diff --git a/backend/api/pages/types.py b/backend/api/pages/types.py deleted file mode 100644 index e9a302fe95..0000000000 --- a/backend/api/pages/types.py +++ /dev/null @@ -1,16 +0,0 @@ -from typing import Optional - -import strawberry - -from ..helpers.i18n import make_localized_resolver -from ..helpers.images import resolve_image - - -@strawberry.type -class Page: - id: strawberry.ID - title: str = strawberry.field(resolver=make_localized_resolver("title")) - slug: str = strawberry.field(resolver=make_localized_resolver("slug")) - content: str = strawberry.field(resolver=make_localized_resolver("content")) - excerpt: Optional[str] - image: Optional[str] = strawberry.field(resolver=resolve_image) diff --git a/backend/api/schema.py b/backend/api/schema.py index 4491a7020b..a4673c9074 100644 --- a/backend/api/schema.py +++ b/backend/api/schema.py @@ -11,7 +11,6 @@ from .newsletters.schema import NewsletterMutations from .orders.mutations import OrdersMutations from .orders.query import OrdersQuery -from .pages.schema import PagesQuery from .pretix.mutations import AttendeeTicketMutation from .schedule.schema import ScheduleQuery, ScheduleMutations from .submissions.mutations import SubmissionsMutations @@ -33,7 +32,6 @@ class Query( ConferenceQuery, SubmissionsQuery, - PagesQuery, CountryQuery, OrdersQuery, JobBoardQuery, diff --git a/backend/api/tests/schema/test_pages.py b/backend/api/tests/schema/test_pages.py deleted file mode 100644 index da8526c74f..0000000000 --- a/backend/api/tests/schema/test_pages.py +++ /dev/null @@ -1,156 +0,0 @@ -from conferences.tests.factories import ConferenceFactory -from pytest import mark - -from i18n.strings import LazyI18nString -from pages.tests.factories import PageFactory - - -def _query_pages(client, conference_code): - return client.query( - """query Pages($code: String!) { - pages(code: $code) { - id - title - slug - content - image - } - }""", - variables={"code": conference_code}, - ) - - -def _get_image_url(request, image): - if not image: - return None - - return request.build_absolute_uri(image.url) - - -@mark.django_db -def test_query_pages( - rf, - graphql_client, -): - conference_1 = ConferenceFactory(code="pycon11") - conference_2 = ConferenceFactory(code="pycon10") - PageFactory(published=False, conference=conference_1) - PageFactory(published=True, conference=conference_2) - page = PageFactory(published=True, conference=conference_1) - - request = rf.get("/") - - resp = _query_pages(graphql_client, conference_code=conference_1.code) - - assert not resp.get("errors") - - assert len(resp["data"]["pages"]) == 1 - - assert { - "id": str(page.id), - "title": str(page.title), - "slug": str(page.slug), - "content": str(page.content), - "image": _get_image_url(request, page.image), - } == resp["data"]["pages"][0] - - -@mark.django_db -def test_query_single_page( - rf, - graphql_client, -): - request = rf.get("/") - page = PageFactory( - slug=LazyI18nString({"en": "demo"}), - published=True, - image=None, - conference__code="pycon11", - ) - - resp = graphql_client.query( - """query { - page(code: "pycon11", slug: "demo") { - id - title - slug - content - image - } - } """ - ) - - assert not resp.get("errors") - assert { - "id": str(page.id), - "title": str(page.title), - "slug": str(page.slug), - "content": str(page.content), - "image": _get_image_url(request, page.image), - } == resp["data"]["page"] - - resp = graphql_client.query( - """query { - page(slug: "demo", code: "pyconb") { - id - } - } """ - ) - - assert resp["data"]["page"] is None - - -@mark.django_db -def test_passing_language( - graphql_client, -): - PageFactory( - title=LazyI18nString({"en": "this is a test", "it": "questa è una prova"}), - slug=LazyI18nString({"en": "slug", "it": "lumaca"}), - content=LazyI18nString({"en": "content", "it": "contenuto"}), - published=True, - image=None, - conference__code="pycon11", - ) - - resp = graphql_client.query( - """query { - page(code: "pycon11", slug: "slug") { - title(language: "it") - slug(language: "it") - } - } """ - ) - - assert not resp.get("errors") - assert resp["data"]["page"] == {"title": "questa è una prova", "slug": "lumaca"} - - -@mark.django_db -@mark.skip(reason="disabled for now") -def test_defaults_on_browser_language( - graphql_client, -): - PageFactory( - title=LazyI18nString({"en": "this is a test", "it": "questa è una prova"}), - slug=LazyI18nString({"en": "slug", "it": "lumaca"}), - content=LazyI18nString({"en": "content", "it": "contenuto"}), - published=True, - image=None, - conference__code="pycon11", - ) - - headers = {"HTTP_ACCEPT_LANGUAGE": "it;q=0.8,de;q=0.7,la;q=0.6"} - - resp = graphql_client.query( - """query { - page(code: "pycon11", slug: "slug") { - title - slug - } - } """, - headers=headers, - ) - - assert not resp.get("errors") - assert resp["data"]["page"] == {"title": "questa è una prova", "slug": "lumaca"} diff --git a/backend/cms/models.py b/backend/cms/models.py index 860650f118..b2a1fb1396 100644 --- a/backend/cms/models.py +++ b/backend/cms/models.py @@ -67,14 +67,6 @@ class MenuLink(OrderedModel, TimeStampedModel): title = I18nTextField(_("title"), blank=False) href = I18nTextField(_("Link url"), blank=True) is_primary = models.BooleanField(_("Is primary"), default=False) - page = models.ForeignKey( - "pages.Page", - on_delete=models.CASCADE, - verbose_name=_("page"), - related_name="links", - null=True, - blank=True, - ) def __str__(self): return f"{self.title} ({self.menu})" diff --git a/backend/pages/__init__.py b/backend/pages/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/backend/pages/admin.py b/backend/pages/admin.py deleted file mode 100644 index 9190a60d13..0000000000 --- a/backend/pages/admin.py +++ /dev/null @@ -1,25 +0,0 @@ -from django import forms -from django.contrib import admin - -from i18n.forms import I18nTextarea, I18nTextInput - -from .models import Page - - -class PageForm(forms.ModelForm): - class Meta: - model = Page - fields = "__all__" - widgets = { - "title": I18nTextInput, - "slug": I18nTextInput, - "content": I18nTextarea, - } - - -@admin.register(Page) -class PageAdmin(admin.ModelAdmin): - list_display = ("title", "published", "slug", "conference") - form = PageForm - - list_filter = ("conference",) diff --git a/backend/pages/apps.py b/backend/pages/apps.py deleted file mode 100644 index 344e0f0cf6..0000000000 --- a/backend/pages/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class PagesConfig(AppConfig): - name = "pages" diff --git a/backend/pages/migrations/0001_initial.py b/backend/pages/migrations/0001_initial.py deleted file mode 100644 index f00fa86ace..0000000000 --- a/backend/pages/migrations/0001_initial.py +++ /dev/null @@ -1,36 +0,0 @@ -# Generated by Django 2.2.4 on 2019-08-27 22:02 - -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import model_utils.fields - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('conferences', '0007_auto_20190811_1953'), - ] - - operations = [ - migrations.CreateModel( - name='Page', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), - ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), - ('title', models.CharField(max_length=200, verbose_name='title')), - ('slug', models.SlugField(blank=True, max_length=200, verbose_name='slug')), - ('content', models.TextField(verbose_name='content')), - ('published', models.BooleanField(default=False, verbose_name='published')), - ('image', models.ImageField(blank=True, null=True, upload_to='pages', verbose_name='image')), - ('conference', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pages', to='conferences.Conference', verbose_name='conference')), - ], - options={ - 'ordering': ['-published'], - 'unique_together': {('slug', 'conference')}, - }, - ), - ] diff --git a/backend/pages/migrations/0002_auto_20190914_1504.py b/backend/pages/migrations/0002_auto_20190914_1504.py deleted file mode 100644 index 13e233b099..0000000000 --- a/backend/pages/migrations/0002_auto_20190914_1504.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 2.2.5 on 2019-09-14 15:04 - -from django.db import migrations -import i18n.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('pages', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='page', - options={}, - ), - migrations.AlterField( - model_name='page', - name='content', - field=i18n.fields.I18nTextField(verbose_name='content'), - ), - migrations.AlterField( - model_name='page', - name='slug', - field=i18n.fields.I18nCharField(blank=True, max_length=200, verbose_name='slug'), - ), - migrations.AlterField( - model_name='page', - name='title', - field=i18n.fields.I18nCharField(max_length=200, verbose_name='title'), - ), - ] diff --git a/backend/pages/migrations/__init__.py b/backend/pages/migrations/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/backend/pages/models.py b/backend/pages/models.py deleted file mode 100644 index d479e8767e..0000000000 --- a/backend/pages/models.py +++ /dev/null @@ -1,52 +0,0 @@ -from copy import copy - -from django.conf import settings -from django.db import models -from django.db.models import Q -from django.utils.text import slugify -from django.utils.translation import gettext_lazy as _ -from i18n.fields import I18nCharField, I18nTextField -from model_utils.models import TimeStampedModel - - -class PageManager(models.Manager): - def get_queryset(self): - return super().get_queryset().filter(published=True) - - def by_slug(self, slug): - filters = Q() - - for lang, __ in settings.LANGUAGES: - filters |= Q(**{f"slug__{lang}": slug}) - - return self.get_queryset().filter(filters) - - -class Page(TimeStampedModel): - title = I18nCharField(_("title"), max_length=200) - slug = I18nCharField(_("slug"), max_length=200, blank=True) - content = I18nTextField(_("content"), blank=False) - published = models.BooleanField(_("published"), default=False) - image = models.ImageField(_("image"), null=True, blank=True, upload_to="pages") - conference = models.ForeignKey( - "conferences.Conference", - on_delete=models.CASCADE, - verbose_name=_("conference"), - related_name="pages", - ) - - objects = models.Manager() - published_pages = PageManager() - - def __str__(self): - return str(self.title) - - def save(self, *args, **kwargs): - if not self.slug: - self.slug = copy(self.title) - self.slug.map(slugify) - - super().save(*args, **kwargs) - - class Meta: - unique_together = ["slug", "conference"] diff --git a/backend/pages/tests/__init__.py b/backend/pages/tests/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/backend/pages/tests/factories.py b/backend/pages/tests/factories.py deleted file mode 100644 index 35deed1e76..0000000000 --- a/backend/pages/tests/factories.py +++ /dev/null @@ -1,19 +0,0 @@ -import factory -import factory.fuzzy -from conferences.tests.factories import ConferenceFactory -from factory.django import DjangoModelFactory -from i18n.tests.factories import LanguageFactory -from pages.models import Page - - -class PageFactory(DjangoModelFactory): - conference = factory.SubFactory(ConferenceFactory) - factory.Faker - title = LanguageFactory("sentence") - slug = LanguageFactory("slug") - content = LanguageFactory("sentence") - published = True - image = factory.django.ImageField() - - class Meta: - model = Page From c66fc65a76d0a838452831ba1d0f68307912ba5e Mon Sep 17 00:00:00 2001 From: Marco Acierno Date: Sat, 20 Jun 2026 20:01:15 +0200 Subject: [PATCH 2/2] changes --- backend/api/cms/types.py | 2 -- backend/pycon/settings/base.py | 1 - 2 files changed, 3 deletions(-) diff --git a/backend/api/cms/types.py b/backend/api/cms/types.py index 3fb06e4a3e..ae36b4312a 100644 --- a/backend/api/cms/types.py +++ b/backend/api/cms/types.py @@ -2,7 +2,6 @@ from strawberry import ID from api.context import Info -from api.pages.types import Page from ..helpers.i18n import make_localized_resolver @@ -19,7 +18,6 @@ class MenuLink: href: str = strawberry.field(resolver=make_localized_resolver("href")) title: str = strawberry.field(resolver=make_localized_resolver("title")) is_primary: bool - page: Page | None @strawberry.type diff --git a/backend/pycon/settings/base.py b/backend/pycon/settings/base.py index 883498df30..e3e4a54513 100644 --- a/backend/pycon/settings/base.py +++ b/backend/pycon/settings/base.py @@ -95,7 +95,6 @@ "languages.apps.LanguagesConfig", "submissions.apps.SubmissionsConfig", "voting.apps.VotingConfig", - "pages.apps.PagesConfig", "sponsors.apps.SponsorsConfig", "cms.apps.CMSConfig", "events.apps.EventsConfig",