Skip to content

Commit 9b04e05

Browse files
committed
Backport of #179: Make get_available_languages use cached translations if they were prefetched. Fixes #97.
1 parent 1add464 commit 9b04e05

3 files changed

Lines changed: 22 additions & 6 deletions

File tree

docs/public/admin.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ all_translations
2020
languages in which this object is available. Entries are linked to their
2121
corresponding admin page.
2222

23+
.. note:: You should add `prefetch_related('translations')` to your queryset
24+
if you use this in :attr:`~django.contrib.admin.ModelAdmin.list_display`,
25+
else one query will be run for every item in the list.
26+
2327

2428
***********************************************************
2529
ModelAdmin APIs you should not change on TranslatableAdmin

hvad/models.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,8 +312,10 @@ def lazy_translation_getter(self, name, default=None):
312312
return getattr(translation, name, default)
313313

314314
def get_available_languages(self):
315-
manager = self._meta.translations_model.objects
316-
return manager.filter(master=self).values_list('language_code', flat=True)
315+
qs = getattr(self, self._meta.translations_accessor).all()
316+
if qs._result_cache is not None:
317+
return [obj.language_code for obj in qs]
318+
return qs.values_list('language_code', flat=True)
317319

318320
#===========================================================================
319321
# Internals

hvad/tests/admin.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
from hvad.test_utils.context_managers import SettingsOverride
1717
from hvad.test_utils.project.app.models import Normal, SimpleRelated, Other, AutoPopulated
1818

19+
PREFETCH_RELATED = (django.VERSION >= (1, 4))
20+
1921
class BaseAdminTests(object):
2022
def _get_admin(self, model):
2123
return admin.site._registry[model]
@@ -83,13 +85,21 @@ def test_all_translations(self):
8385
obj = Normal.objects.language("en").create(
8486
shared_field="shared",
8587
)
88+
89+
# Get the object back from db to test the use of prefetch_related
90+
qs = Normal.objects.language('en')
91+
if PREFETCH_RELATED:
92+
qs = qs.prefetch_related('translations')
93+
obj = qs.get(pk=obj.pk)
8694
with LanguageOverride('en'):
87-
self.assertTrue(myadmin.all_translations(obj).find("<strong>") != -1)
88-
# Entries should be linked to the corresponding translation page
89-
self.assertTrue(myadmin.all_translations(obj).find("?language=en") != -1)
95+
with self.assertNumQueries(0 if PREFETCH_RELATED else 2):
96+
self.assertTrue(myadmin.all_translations(obj).find("<strong>") != -1)
97+
# Entries should be linked to the corresponding translation page
98+
self.assertTrue(myadmin.all_translations(obj).find("?language=en") != -1)
9099

91100
with LanguageOverride('ja'):
92-
self.assertTrue(myadmin.all_translations(obj).find("<strong>") == -1)
101+
with self.assertNumQueries(0 if PREFETCH_RELATED else 1):
102+
self.assertTrue(myadmin.all_translations(obj).find("<strong>") == -1)
93103

94104
# An unsaved object, shouldn't have any translations
95105

0 commit comments

Comments
 (0)