Source code for translations.querysets
"""This module contains the querysets for the Translations app."""
from django.db.models import query
from translations.languages import _get_default_language, \
_get_translate_language, _get_probe_language
from translations.query import _fetch_translations_query_getter
from translations.context import Context
__docformat__ = 'restructuredtext'
[docs]class TranslatableQuerySet(query.QuerySet):
"""A queryset which provides custom translation functionalities."""
[docs] def __init__(self, *args, **kwargs):
"""Initialize a `TranslatableQuerySet` with `QuerySet` arguments."""
super(TranslatableQuerySet, self).__init__(*args, **kwargs)
self._trans_lang = _get_default_language()
self._trans_prob = _get_default_language()
self._trans_rels = ()
self._trans_cache = False
[docs] def _chain(self, **kwargs):
"""Return a copy of the current `TranslatableQuerySet`."""
clone = super(TranslatableQuerySet, self)._chain(**kwargs)
# default values for all
clone._trans_lang = getattr(self, '_trans_lang')
clone._trans_prob = getattr(self, '_trans_prob')
clone._trans_rels = getattr(self, '_trans_rels')
# reset cache on chaining
clone._trans_cache = False
return clone
[docs] def _fetch_all(self):
"""Evaluate the `TranslatableQuerySet`."""
super(TranslatableQuerySet, self)._fetch_all()
if self._trans_lang == _get_default_language():
return
if self._iterable_class is not query.ModelIterable:
raise TypeError(
'Translations does not support custom iteration (yet). ' +
'e.g. values, values_list, etc. ' +
'If necessary you can `decipher` and then do it.'
)
if not self._trans_cache:
with Context(self._result_cache, *self._trans_rels) \
as context:
context.read(self._trans_lang)
self._trans_cache = True
[docs] def translate(self, lang=None):
"""Translate the `TranslatableQuerySet` in a language."""
clone = self.all()
clone._trans_lang = _get_translate_language(lang)
return clone
[docs] def probe(self, lang=None):
"""Probe the `TranslatableQuerySet` in some language(s)."""
clone = self.all()
clone._trans_prob = _get_probe_language(lang)
return clone
[docs] def filter(self, *args, **kwargs):
"""Filter the `TranslatableQuerySet`."""
if not (args or kwargs):
return super(TranslatableQuerySet, self).filter()
query = _fetch_translations_query_getter(
self.model,
self._trans_prob
)(*args, **kwargs)
return super(TranslatableQuerySet, self).filter(query)
[docs] def exclude(self, *args, **kwargs):
"""Exclude the `TranslatableQuerySet`."""
if not (args or kwargs):
return super(TranslatableQuerySet, self).exclude()
query = _fetch_translations_query_getter(
self.model,
self._trans_prob
)(*args, **kwargs)
return super(TranslatableQuerySet, self).exclude(query)