staging: normalize Services menu across locales

This commit is contained in:
2026-05-02 20:33:16 +02:00
parent 348d14c330
commit e7bcbe53ab
2 changed files with 128 additions and 0 deletions

13
Jenkinsfile vendored
View File

@@ -152,6 +152,19 @@ PY
parameters: [string(name: 'PROJECT_NAME', value: 'mandelstudio')] parameters: [string(name: 'PROJECT_NAME', value: 'mandelstudio')]
} }
} }
stage('Normalize Services Menu') {
agent { label 'built-in' }
options {
timeout(time: 5, unit: 'MINUTES')
}
steps {
sh '''
set -e
REMOTE_CMD="cd '${STAGING_AUDIT_PROJECT_DIR}' && '${STAGING_AUDIT_MANAGE}' normalize_services_menu"
sudo -n -u mandel -g www-data /srv/apps/mandel-dashboard/.venv/bin/python /srv/apps/mandel-dashboard/bin/deploy_stg_from_jenkins.py "${STAGING_AUDIT_PROJECT_NAME}" --command "$REMOTE_CMD"
'''
}
}
stage('Post-Deploy Multilingual Audit') { stage('Post-Deploy Multilingual Audit') {
agent { label 'built-in' } agent { label 'built-in' }
options { options {

View File

@@ -0,0 +1,115 @@
from __future__ import annotations
from dataclasses import dataclass
from django.core.management.base import BaseCommand
from wagtail.models import Locale, Page
@dataclass(frozen=True)
class _MenuChange:
page_id: int
locale: str
title: str
before: bool
after: bool
def _services_root(default_locale: Locale) -> Page | None:
page = (
Page.objects.filter(locale=default_locale, slug="diensten")
.specific()
.first()
)
if page is not None:
return page
return (
Page.objects.filter(locale=default_locale, title__iexact="Diensten")
.specific()
.first()
)
class Command(BaseCommand):
help = (
"Normalize the Services/Diensten dropdown across locales by using the "
"default-locale in-menu children as the allowlist and applying that to "
"all translated Services pages."
)
def add_arguments(self, parser):
parser.add_argument(
"--dry-run",
action="store_true",
help="Print the changes without writing to the database.",
)
def handle(self, *args, **options):
dry_run: bool = options["dry_run"]
default_locale = Locale.get_default()
services = _services_root(default_locale)
if services is None:
self.stderr.write(
"Could not find the default-locale Services/Diensten page "
f"(locale={default_locale.language_code})."
)
return 1
allowed_keys = set(
Page.objects.child_of(services)
.live()
.in_menu()
.values_list("translation_key", flat=True)
)
if not allowed_keys:
self.stderr.write(
"Default-locale Services page has no in-menu children; "
"refusing to hide menu items across locales."
)
return 2
changes: list[_MenuChange] = []
translated_services_pages = Page.objects.filter(
translation_key=services.translation_key
).specific()
for translated_services in translated_services_pages:
children = Page.objects.child_of(translated_services).specific()
for child in children:
before = bool(child.show_in_menus)
after = bool(child.translation_key in allowed_keys and child.live)
if before == after:
continue
changes.append(
_MenuChange(
page_id=child.id,
locale=child.locale.language_code,
title=child.title,
before=before,
after=after,
)
)
if not dry_run:
child.show_in_menus = after
child.save(update_fields=["show_in_menus"])
if not changes:
self.stdout.write("No changes needed.")
return 0
for change in changes:
self.stdout.write(
f"[{change.locale}] #{change.page_id} {change.title}: "
f"show_in_menus {change.before} -> {change.after}"
)
self.stdout.write(
f"Done. Changed {len(changes)} page(s). dry_run={dry_run}"
)
return 0