1 Commits

Author SHA1 Message Date
Mark
8138acb7f7 feat: replace hardcoded navigation with CMS-managed models
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Failing after 14s
CI / pr-e2e (pull_request) Failing after 1m19s
Replace static nav/footer links with Wagtail-managed NavigationMenuItem
and SocialMediaLink orderables on SiteSettings. Unpublished pages are
automatically excluded from rendering, fixing the dead-link problem.

- Extend SiteSettings with site_name, tagline, footer_description,
  copyright_text branding fields
- Add NavigationMenuItem orderable (link_page/link_url, show_in_header,
  show_in_footer, sort_order) with automatic live-page filtering
- Add SocialMediaLink orderable with platform icon templates
- New template tags: get_nav_items, get_social_links
- Update nav.html and footer.html to render from CMS data
- Data migration seeds existing hardcoded values for zero-change deploy
- Update seed_e2e_content command for test/dev environments
- 18 new tests covering models, template tags, and rendered output

Closes #32

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 18:45:03 +00:00
3 changed files with 6 additions and 15 deletions

View File

@@ -150,10 +150,7 @@ class Command(BaseCommand):
] ]
if article_index_page: if article_index_page:
nav_items.append( nav_items.append(
NavigationMenuItem( NavigationMenuItem(settings=settings, link_page=article_index_page, link_title="Articles", sort_order=1)
settings=settings, link_page=article_index_page,
link_title="Articles", sort_order=1,
)
) )
if about_page: if about_page:
nav_items.append( nav_items.append(
@@ -164,15 +161,8 @@ class Command(BaseCommand):
if not SocialMediaLink.objects.filter(settings=settings).exists(): if not SocialMediaLink.objects.filter(settings=settings).exists():
SocialMediaLink.objects.bulk_create( SocialMediaLink.objects.bulk_create(
[ [
SocialMediaLink( SocialMediaLink(settings=settings, platform="twitter", url="https://twitter.com/nohypeai", label="Twitter (X)", sort_order=0),
settings=settings, platform="twitter", SocialMediaLink(settings=settings, platform="rss", url="/feed/", label="RSS Feed", sort_order=1),
url="https://twitter.com/nohypeai",
label="Twitter (X)", sort_order=0,
),
SocialMediaLink(
settings=settings, platform="rss",
url="/feed/", label="RSS Feed", sort_order=1,
),
] ]
) )

View File

@@ -6,6 +6,7 @@ from wagtail.admin.panels import FieldPanel, InlinePanel, MultiFieldPanel
from wagtail.contrib.settings.models import BaseSiteSetting, register_setting from wagtail.contrib.settings.models import BaseSiteSetting, register_setting
from wagtail.models import Orderable from wagtail.models import Orderable
SOCIAL_ICON_CHOICES = [ SOCIAL_ICON_CHOICES = [
("twitter", "Twitter / X"), ("twitter", "Twitter / X"),
("github", "GitHub"), ("github", "GitHub"),

View File

@@ -1,7 +1,7 @@
import pytest import pytest
from wagtail.models import Site from wagtail.models import Site
from apps.blog.models import AboutPage, ArticleIndexPage from apps.blog.models import AboutPage, ArticleIndexPage, HomePage
from apps.core.models import NavigationMenuItem, SiteSettings, SocialMediaLink from apps.core.models import NavigationMenuItem, SiteSettings, SocialMediaLink
@@ -133,7 +133,7 @@ class TestSocialMediaLink:
def test_ordering(self, site_with_nav): def test_ordering(self, site_with_nav):
links = list(site_with_nav.social_links.all().order_by("sort_order")) links = list(site_with_nav.social_links.all().order_by("sort_order"))
assert [link.platform for link in links] == ["twitter", "rss"] assert [l.platform for l in links] == ["twitter", "rss"]
@pytest.mark.django_db @pytest.mark.django_db