Improve locale_label_from_id caching

pull/7830/head
Dan Braghis 2022-01-13 20:15:51 +00:00 zatwierdzone przez Matt Westcott
rodzic cc9fe1ac90
commit f47a4ae1d3
4 zmienionych plików z 30 dodań i 23 usunięć

Wyświetl plik

@ -40,7 +40,7 @@ from wagtail.core.models import (
from wagtail.core.telepath import JSContext from wagtail.core.telepath import JSContext
from wagtail.core.utils import camelcase_to_underscore from wagtail.core.utils import camelcase_to_underscore
from wagtail.core.utils import cautious_slugify as _cautious_slugify from wagtail.core.utils import cautious_slugify as _cautious_slugify
from wagtail.core.utils import escape_script, get_content_type_label from wagtail.core.utils import escape_script, get_content_type_label, get_locales_display_names
from wagtail.users.utils import get_gravatar_url from wagtail.users.utils import get_gravatar_url
@ -766,22 +766,12 @@ def locales():
]) ])
@register.simple_tag(takes_context=True) @register.simple_tag
def locale_label_from_id(context, locale_id): def locale_label_from_id(locale_id):
""" """
Returns the Locale display name given its id. Returns the Locale display name given its id.
""" """
request = context['request'] return get_locales_display_names().get(locale_id)
# Cache the locale id -> locale display name mapping on the request
if not hasattr(request, '_wagtail_locales'):
locales_map = {}
for locale in Locale.objects.all():
locales_map[locale.pk] = locale.get_display_name()
setattr(request, '_wagtail_locales', locales_map)
context['request'] = request
return context['request']._wagtail_locales.get(locale_id)
@register.simple_tag() @register.simple_tag()

Wyświetl plik

@ -4,7 +4,6 @@ from datetime import timedelta
from unittest import mock from unittest import mock
from django.conf import settings from django.conf import settings
from django.http import HttpRequest
from django.template import Context, Template from django.template import Context, Template
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
@ -196,16 +195,12 @@ class TestInternationalisationTags(TestCase):
) )
def test_locale_label_from_id(self): def test_locale_label_from_id(self):
context = {
"request": HttpRequest()
}
with self.assertNumQueries(1): with self.assertNumQueries(1):
self.assertEqual(locale_label_from_id(context, self.locale_ids[0]), "English") self.assertEqual(locale_label_from_id(self.locale_ids[0]), "English")
with self.assertNumQueries(0): with self.assertNumQueries(0):
self.assertEqual(locale_label_from_id(context, self.locale_ids[1]), "French") self.assertEqual(locale_label_from_id(self.locale_ids[1]), "French")
# check with an invalid id # check with an invalid id
with self.assertNumQueries(0): with self.assertNumQueries(0):
self.assertIsNone(locale_label_from_id(context, self.locale_ids[-1] + 100), None) self.assertIsNone(locale_label_from_id(self.locale_ids[-1] + 100), None)

Wyświetl plik

@ -3,7 +3,8 @@ import logging
from django.core.cache import cache from django.core.cache import cache
from django.db.models.signals import post_delete, post_save, pre_delete from django.db.models.signals import post_delete, post_save, pre_delete
from wagtail.core.models import Page, Site from wagtail.core.models import Locale, Page, Site
from wagtail.core.utils import get_locales_display_names
logger = logging.getLogger('wagtail.core') logger = logging.getLogger('wagtail.core')
@ -29,9 +30,16 @@ def post_delete_page_log_deletion(sender, instance, **kwargs):
logger.info("Page deleted: \"%s\" id=%d", instance.title, instance.id) logger.info("Page deleted: \"%s\" id=%d", instance.title, instance.id)
def reset_locales_display_names_cache(sender, instance, **kwargs):
get_locales_display_names.cache_clear()
def register_signal_handlers(): def register_signal_handlers():
post_save.connect(post_save_site_signal_handler, sender=Site) post_save.connect(post_save_site_signal_handler, sender=Site)
post_delete.connect(post_delete_site_signal_handler, sender=Site) post_delete.connect(post_delete_site_signal_handler, sender=Site)
pre_delete.connect(pre_delete_page_unpublish, sender=Page) pre_delete.connect(pre_delete_page_unpublish, sender=Page)
post_delete.connect(post_delete_page_log_deletion, sender=Page) post_delete.connect(post_delete_page_log_deletion, sender=Page)
post_save.connect(reset_locales_display_names_cache, sender=Locale)
post_delete.connect(reset_locales_display_names_cache, sender=Locale)

Wyświetl plik

@ -309,6 +309,20 @@ def get_supported_content_language_variant(lang_code, strict=False):
raise LookupError(lang_code) raise LookupError(lang_code)
@functools.lru_cache()
def get_locales_display_names() -> dict:
"""
Cache of the locale id -> locale display name mapping
"""
from wagtail.core.models import Locale # inlined to avoid circular imports
locales_map = {
locale.pk: locale.get_display_name()
for locale in Locale.objects.all()
}
return locales_map
@receiver(setting_changed) @receiver(setting_changed)
def reset_cache(**kwargs): def reset_cache(**kwargs):
""" """