From c3d78612fe1a7d2de49222883bc8b22970b6a997 Mon Sep 17 00:00:00 2001 From: Pomax Date: Mon, 9 Aug 2021 12:04:29 -0700 Subject: [PATCH] show correct categories on product pages, and relocalize urls to point to use the correct locale --- .../wagtailpages/pagemodels/products.py | 46 ++++++++++++------- .../templates/buyersguide/product_page.html | 6 ++- .../templates/fragments/buyersguide_item.html | 7 +-- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/network-api/networkapi/wagtailpages/pagemodels/products.py b/network-api/networkapi/wagtailpages/pagemodels/products.py index 30c39420bd1..91bcd655e1d 100644 --- a/network-api/networkapi/wagtailpages/pagemodels/products.py +++ b/network-api/networkapi/wagtailpages/pagemodels/products.py @@ -47,6 +47,29 @@ DEFAULT_LOCALE_ID = Locale.objects.get(language_code=settings.LANGUAGE_CODE).id +def get_language_code_from_request(request): + """ + Accepts a request. Returns a language code (string) if there is one. Falls back to English. + """ + default_language_code = settings.LANGUAGE_CODE + if hasattr(request, 'LANGUAGE_CODE'): + default_language_code = request.LANGUAGE_CODE + return default_language_code + +def get_categories_for_locale(language_code): + """ + Make sure that we check both the "whatever the current locale" category + for whether or not it's hidden, but also the original English version. + """ + return [ + cat + for cat in BuyersGuideProductCategory.objects.filter( + hidden=False, + locale=Locale.objects.get(language_code=language_code) + ) + if not cat.original.hidden + ] + def get_product_subset(cutoff_date, authenticated, key, products, language_code='en'): """ filter a queryset based on our current cutoff date, @@ -798,7 +821,8 @@ def get_or_create_votes(self): def get_context(self, request, *args, **kwargs): context = super().get_context(request, *args, **kwargs) context['product'] = self - context['categories'] = BuyersGuideProductCategory.objects.filter(hidden=False) + language_code = get_language_code_from_request(request) + context['categories'] = get_categories_for_locale(language_code) context['mediaUrl'] = settings.MEDIA_URL context['use_commento'] = settings.USE_COMMENTO context['pageTitle'] = f'{self.title} | ' + gettext("Privacy & security guide") + ' | Mozilla Foundation' @@ -1375,13 +1399,6 @@ def get_banner(self): SynchronizedField('search_image'), ] - def get_language_code(self, request): - """Accepts a request. Returns a language code (string) if there is one. Falls back to English.""" - default_language_code = settings.LANGUAGE_CODE - if hasattr(request, 'LANGUAGE_CODE'): - default_language_code = request.LANGUAGE_CODE - return default_language_code - @route(r'^about/$', name='how-to-use-view') def about_page(self, request): context = self.get_context(request) @@ -1455,7 +1472,7 @@ def product_view(self, request, slug): @route(r'^categories/(?P[\w\W]+)/', name='category-view') def categories_page(self, request, slug): context = self.get_context(request, bypass_products=True) - language_code = self.get_language_code(request) + language_code = get_language_code_from_request(request) locale_id = Locale.objects.get(language_code=language_code).id slug = slugify(slug) @@ -1481,6 +1498,7 @@ def categories_page(self, request, slug): authenticated = request.user.is_authenticated key = f'cat_product_dicts_{slug}_auth' if authenticated else f'cat_product_dicts_{slug}_live' key = f'{language_code}_{key}' + cache.clear() products = cache.get(key) exclude_cat_ids = [excats.category.id for excats in self.excluded_categories.all()] @@ -1535,7 +1553,7 @@ def get_sitemap_urls(self, request): def get_context(self, request, *args, **kwargs): context = super().get_context(request, *args, **kwargs) - language_code = self.get_language_code(request) + language_code = get_language_code_from_request(request) authenticated = request.user.is_authenticated key = 'home_product_dicts_authed' if authenticated else 'home_product_dicts_live' @@ -1552,13 +1570,7 @@ def get_context(self, request, *args, **kwargs): language_code=language_code ) - # We need to test this to see whether it's actually hiding EN categories in other locales: - categories = BuyersGuideProductCategory.objects.filter( - hidden=False, - locale=Locale.objects.get(language_code=language_code) - ) - - context['categories'] = categories + context['categories'] = get_categories_for_locale(language_code) context['products'] = products context['web_monetization_pointer'] = settings.WEB_MONETIZATION_POINTER pni_home_page = BuyersGuidePage.objects.first() diff --git a/network-api/networkapi/wagtailpages/templates/buyersguide/product_page.html b/network-api/networkapi/wagtailpages/templates/buyersguide/product_page.html index 1c4aa6a196d..5f300e30cac 100644 --- a/network-api/networkapi/wagtailpages/templates/buyersguide/product_page.html +++ b/network-api/networkapi/wagtailpages/templates/buyersguide/product_page.html @@ -1,6 +1,8 @@ {% extends "buyersguide/bg_base.html" %} -{% load bg_selector_tags env l10n i18n static wagtailimages_tags %} +{% load bg_selector_tags env l10n i18n localization static wagtailimages_tags %} + +{% get_current_language as lang_code %} {% block head_extra %} @@ -297,7 +299,7 @@

{% trans "Related products" %}

{% for related_product_page in product.related_product_pages.all %} {% with related_product=related_product_page.related_product.localized %}