From 36c5953fed9319c4ee715ebbfc60d2b6fd39f6ea Mon Sep 17 00:00:00 2001 From: Kalob Taulien Date: Wed, 17 Mar 2021 12:37:26 -0600 Subject: [PATCH 1/3] Localize categories --- .../networkapi/wagtailpages/pagemodels/products.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/network-api/networkapi/wagtailpages/pagemodels/products.py b/network-api/networkapi/wagtailpages/pagemodels/products.py index 170f15d414b..a97f9c1dcf8 100644 --- a/network-api/networkapi/wagtailpages/pagemodels/products.py +++ b/network-api/networkapi/wagtailpages/pagemodels/products.py @@ -19,7 +19,7 @@ from wagtail.contrib.routable_page.models import RoutablePageMixin, route from wagtail.images.edit_handlers import ImageChooserPanel from wagtail.snippets.edit_handlers import SnippetChooserPanel -from wagtail.core.models import Orderable, Page +from wagtail.core.models import Locale, Orderable, Page from wagtail.core import hooks from wagtail_localize.fields import SynchronizedField, TranslatableField @@ -1399,7 +1399,15 @@ def get_context(self, request, *args, **kwargs): ProductPage.objects.all() ) - context['categories'] = BuyersGuideProductCategory.objects.filter(hidden=False) + default_language_code = 'en' + if hasattr(request, 'LANGUAGE_CODE'): + default_language_code = request.LANGUAGE_CODE + + categories = BuyersGuideProductCategory.objects.filter( + hidden=False, + locale=Locale.objects.get(language_code=default_language_code) + ) + context['categories'] = categories context['products'] = products context['web_monetization_pointer'] = settings.WEB_MONETIZATION_POINTER return context From 12cf2cb635bacec39bf2c63323c08017ccd0a7c9 Mon Sep 17 00:00:00 2001 From: Kalob Taulien Date: Wed, 17 Mar 2021 13:12:48 -0600 Subject: [PATCH 2/3] Filter categories by language. Filter products by language. --- .../wagtailpages/pagemodels/products.py | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/network-api/networkapi/wagtailpages/pagemodels/products.py b/network-api/networkapi/wagtailpages/pagemodels/products.py index a97f9c1dcf8..49d8a3a91a2 100644 --- a/network-api/networkapi/wagtailpages/pagemodels/products.py +++ b/network-api/networkapi/wagtailpages/pagemodels/products.py @@ -1252,6 +1252,13 @@ def get_banner(self): SynchronizedField('slug'), ] + 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 = 'en' + 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) @@ -1326,6 +1333,7 @@ def product_view(self, request, slug): def categories_page(self, request, slug): context = self.get_context(request, bypass_products=True) slug = slugify(slug) + language_code = self.get_language_code(request) # If getting by slug fails, also try to get it by name. try: @@ -1342,7 +1350,10 @@ def categories_page(self, request, slug): self.cutoff_date, authenticated, key, - ProductPage.objects.filter(product_categories__category__in=[category]) + ProductPage.objects.filter( + product_categories__category__in=[category], + locale=Locale.objects.get(language_code=language_code) + ) ) context['category'] = category.slug @@ -1386,9 +1397,15 @@ 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) authenticated = request.user.is_authenticated - key = 'home_product_dicts_authed' if authenticated else 'home_product_dicts_live' + key = ( + f"home_product_dicts_authed_{language_code}" + if authenticated + else f"home_product_dicts_live_{language_code}" + ) + products = cache.get(key) if not kwargs.get('bypass_products', False) and products is None: @@ -1396,16 +1413,12 @@ def get_context(self, request, *args, **kwargs): self.cutoff_date, authenticated, key, - ProductPage.objects.all() + ProductPage.objects.filter(locale=Locale.objects.get(language_code=language_code)) ) - default_language_code = 'en' - if hasattr(request, 'LANGUAGE_CODE'): - default_language_code = request.LANGUAGE_CODE - categories = BuyersGuideProductCategory.objects.filter( hidden=False, - locale=Locale.objects.get(language_code=default_language_code) + locale=Locale.objects.get(language_code=language_code) ) context['categories'] = categories context['products'] = products From f5489864f3892e34c701431e226eb6ae2bae499d Mon Sep 17 00:00:00 2001 From: Kalob Taulien Date: Mon, 22 Mar 2021 14:28:57 -0600 Subject: [PATCH 3/3] Review feedback --- .../wagtailpages/pagemodels/products.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/network-api/networkapi/wagtailpages/pagemodels/products.py b/network-api/networkapi/wagtailpages/pagemodels/products.py index 49d8a3a91a2..cd71ef86948 100644 --- a/network-api/networkapi/wagtailpages/pagemodels/products.py +++ b/network-api/networkapi/wagtailpages/pagemodels/products.py @@ -57,14 +57,17 @@ ] -def get_product_subset(cutoff_date, authenticated, key, products): +def get_product_subset(cutoff_date, authenticated, key, products, language_code='en'): """ filter a queryset based on our current cutoff date, as well as based on whether a user is authenticated to the system or not (authenticated users get to see all products, including draft products) """ - products = products.filter(review_date__gte=cutoff_date) + products = products.filter( + review_date__gte=cutoff_date, + locale=Locale.objects.get(language_code=language_code) + ) if not authenticated: products = products.live() products = products.specific() @@ -1254,7 +1257,7 @@ def get_banner(self): 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 = 'en' + default_language_code = settings.LANGUAGE_CODE if hasattr(request, 'LANGUAGE_CODE'): default_language_code = request.LANGUAGE_CODE return default_language_code @@ -1332,8 +1335,8 @@ 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) - slug = slugify(slug) language_code = self.get_language_code(request) + slug = slugify(slug) # If getting by slug fails, also try to get it by name. try: @@ -1343,6 +1346,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}' products = cache.get(key) if products is None: @@ -1350,10 +1354,8 @@ def categories_page(self, request, slug): self.cutoff_date, authenticated, key, - ProductPage.objects.filter( - product_categories__category__in=[category], - locale=Locale.objects.get(language_code=language_code) - ) + ProductPage.objects.filter(product_categories__category__in=[category]), + language_code=language_code ) context['category'] = category.slug @@ -1400,11 +1402,8 @@ def get_context(self, request, *args, **kwargs): language_code = self.get_language_code(request) authenticated = request.user.is_authenticated - key = ( - f"home_product_dicts_authed_{language_code}" - if authenticated - else f"home_product_dicts_live_{language_code}" - ) + key = 'home_product_dicts_authed' if authenticated else 'home_product_dicts_live' + key = f'{key}_{language_code}' products = cache.get(key) @@ -1413,7 +1412,8 @@ def get_context(self, request, *args, **kwargs): self.cutoff_date, authenticated, key, - ProductPage.objects.filter(locale=Locale.objects.get(language_code=language_code)) + ProductPage.objects.all(), + language_code=language_code ) categories = BuyersGuideProductCategory.objects.filter(