kopia lustrzana https://github.com/wagtail/wagtail
Improve locale_label_from_id caching
rodzic
cc9fe1ac90
commit
f47a4ae1d3
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
Ładowanie…
Reference in New Issue