Skip to content

Commit

Permalink
Merge pull request #118 from mikek/manager-iterator-checks
Browse files Browse the repository at this point in the history
Add workaround for iteration over QS methods results that do not return QS of models
  • Loading branch information
vdboor committed Feb 11, 2016
2 parents 6892918 + 88f15a2 commit 61829cb
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 3 deletions.
4 changes: 2 additions & 2 deletions parler/managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,8 @@ def iterator(self):
# without breaking the result generators
base_iterator = super(TranslatableQuerySet, self).iterator()
for obj in base_iterator:
# Apply the language setting.
if self._language:
# Apply the language setting to model instances only.
if self._language and isinstance(obj, models.Model):
obj.set_current_language(self._language)

yield obj
Expand Down
24 changes: 23 additions & 1 deletion parler/tests/test_query_count.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import datetime as dt

from django.core.cache import cache
from django.utils import translation
from django.utils.timezone import now
from parler import appsettings

from .utils import AppTestCase, override_parler_settings
from .testapp.models import SimpleModel
from .testapp.models import SimpleModel, DateTimeModel


class QueryCountTests(AppTestCase):
Expand Down Expand Up @@ -31,6 +34,10 @@ def setUpClass(cls):
for country in cls.country_list:
SimpleModel.objects.create(_current_language=cls.conf_fallback, tr_title=country)


DateTimeModel.objects.create(_current_language=cls.conf_fallback,
tr_title=country, datetime=now())

#def setUp(self):
# cache.clear()

Expand All @@ -57,6 +64,21 @@ def test_uncached_queries(self):
with override_parler_settings(PARLER_ENABLE_CACHING=False):
self.assertNumTranslatedQueries(1 + len(self.country_list), SimpleModel.objects.all())

def test_iteration_with_non_qs_methods(self):
"""
Test QuerySet methods that do not return QuerySets of models.
"""
# We have at least one object created in setUpClass.
obj = DateTimeModel.objects.all()[0]
self.assertEqual(
obj,
DateTimeModel.objects.language(self.conf_fallback).all()[0])
# Test iteration through QuerySet of non-model objects.
self.assertIsInstance(
DateTimeModel.objects.language(self.conf_fallback).dates(
'datetime', 'day')[0],
dt.date)

def test_prefetch_queries(self):
"""
Test that .prefetch_related() works
Expand Down
12 changes: 12 additions & 0 deletions parler/tests/testapp/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,18 @@ def __unicode__(self):
return self.tr_title


class DateTimeModel(TranslatableModel):
shared = models.CharField(max_length=200, default='')
datetime = models.DateTimeField()

translations = TranslatedFields(
tr_title=models.CharField("Translated Title", max_length=200)
)

def __unicode__(self):
return self.tr_title


class AnyLanguageModel(TranslatableModel):
shared = models.CharField(max_length=200, default='')
tr_title = TranslatedField(any_language=True)
Expand Down

0 comments on commit 61829cb

Please sign in to comment.