alpinesmuseum-public/cms/utils.py

60 lines
2.0 KiB
Python

from types import SimpleNamespace
from django.contrib.sites.models import Site
from functools import reduce
from django.utils import translation
from django.utils.translation import gettext_lazy as _
from django.conf import settings
class TranslatedField:
def __init__(self, field):
self.en_field = field + "_en"
self.de_field = field + "_de"
self.it_field = field + "_it"
self.fr_field = field + "_fr"
def __get__(self, instance, owner):
lang = translation.get_language()
en = getattr(instance, self.en_field)
if lang == 'de':
return getattr(instance, self.de_field) or en
elif lang == 'it':
return getattr(instance, self.it_field) or en
elif lang == 'fr':
return getattr(instance, self.fr_field) or en
else:
return en
def removeprefix(self: str, prefix: str) -> str:
if self.startswith(prefix):
return self[len(prefix):]
else:
return self[:]
def get_page_url_without_locale(page):
LOCALES = ["en", "fr", "de", "it"]
url = page if isinstance(page, str) else page.get_url()
pathname: str = reduce(lambda acc, l: removeprefix(acc, f"/{l}/"), LOCALES, url)
pathname = pathname if pathname.startswith("/") else f"/{pathname}"
return pathname
def most_strict_site_match(page):
url = get_page_url_without_locale(page)
matches = [site for site in Site.objects.all() if url.startswith(site.domain)]
return max(matches or [SimpleNamespace(domain='/')], key=lambda m: len(m.domain))
def get_current_site(request_or_url):
request_path = getattr(request_or_url, "path", request_or_url)
path = get_page_url_without_locale(request_path)
path_parts = reduce(lambda acc, v: acc + [v] if v else acc, path.split("/"), [])
#FIXME: The following is just a workaround
try:
return Site.objects.get(domain=f"/{path_parts[0]}/")
except Site.DoesNotExist:
return Site.objects.get(domain='/')
def get_language_codes():
return list(dict(settings.LANGUAGES).keys())