staging: normalize Services menu across locales
This commit is contained in:
13
Jenkinsfile
vendored
13
Jenkinsfile
vendored
@@ -152,6 +152,19 @@ PY
|
||||
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') {
|
||||
agent { label 'built-in' }
|
||||
options {
|
||||
|
||||
115
mandelstudio/management/commands/normalize_services_menu.py
Normal file
115
mandelstudio/management/commands/normalize_services_menu.py
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user