Esempio n. 1
0
 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
Esempio n. 2
0
 def delete(self, lang=None):
     r"""
     Delete the translations of the `Context`\ 's `purview` in a language.
     """
     lang = _get_translate_language(lang)
     if lang != _get_default_language():
         _get_translations(self.query, lang).delete()
Esempio n. 3
0
 def create(self, lang=None):
     r"""
     Create the translations of the `Context`\ 's `purview` in a language.
     """
     lang = _get_translate_language(lang)
     if lang != _get_default_language():
         _translations = [
             translations.models.Translation(
                 language=lang, text=text, **address
             ) for address, text in self._get_changed_fields()
         ]
         translations.models.Translation.objects.bulk_create(_translations)
Esempio n. 4
0
 def update(self, lang=None):
     r"""
     Update the translations of the `Context`\ 's `purview` in a language.
     """
     lang = _get_translate_language(lang)
     if lang != _get_default_language():
         query = models.Q()
         _translations = []
         for address, text in self._get_changed_fields():
             query |= models.Q(**address)
             _translations.append(
                 translations.models.Translation(
                     language=lang, text=text, **address
                 )
             )
         _get_translations(query, lang).delete()
         translations.models.Translation.objects.bulk_create(_translations)
Esempio n. 5
0
 def read(self, lang=None):
     r"""
     Read the translations of the `Context`\ 's `purview` in a language.
     """
     lang = _get_translate_language(lang)
     if lang != _get_default_language():
         _translations = _get_translations(self.query, lang)
         for translation in _translations:
             ct_id = translation.content_type.id
             obj_id = translation.object_id
             field = translation.field
             text = translation.text
             obj = self.mapping[ct_id][obj_id]
             if field in type(obj)._get_translatable_fields_names():
                 setattr(obj, field, text)
     else:
         self.reset()
Esempio n. 6
0
    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
Esempio n. 7
0
    def test_invalid(self):
        with self.assertRaises(ValueError) as error:
            _get_default_language()

        self.assertEqual(error.exception.args[0],
                         '`xx` is not a supported language.')
Esempio n. 8
0
 def test_existing_accented(self):
     self.assertEqual(_get_default_language(), 'en-gb')
Esempio n. 9
0
 def test_unaccented(self):
     self.assertEqual(_get_default_language(), 'en')
Esempio n. 10
0
def _fetch_translations_query_getter(model, lang):
    """
    Return the translations query getter specialized for a model and some
    language(s).
    """
    default = _get_default_language()

    def _get_translations_query(*args, **kwargs):
        connector = kwargs.pop('_connector', None)
        negated = kwargs.pop('_negated', False)

        children = list(args) + sorted(kwargs.items())

        for index, child in enumerate(children):
            if isinstance(child, tuple):
                dissected = _get_dissected_lookup(model, child[0])
                if dissected['translatable']:
                    query_default = False
                    query_languages = None
                    if isinstance(lang, (list, tuple)):
                        query_languages = []
                        for x in lang:
                            if x == default:
                                query_default = True
                            else:
                                query_languages.append(x)
                    else:
                        if lang == default:
                            query_default = True
                            query_languages = None
                        else:
                            query_default = False
                            query_languages = lang

                    q = Q()

                    if query_default:
                        q |= Q(**{child[0]: child[1]})

                    if query_languages:
                        relation = LOOKUP_SEP.join(dissected['relation'] +
                                                   ['translations'])
                        field_supp = (LOOKUP_SEP + dissected['supplement']) \
                            if dissected['supplement'] else ''
                        lang_supp = (LOOKUP_SEP + 'in') \
                            if isinstance(query_languages, (list, tuple)) \
                            else ''

                        q |= Q(
                            **{
                                '{}__field'.format(relation):
                                dissected['field'],
                                '{}__text{}'.format(relation, field_supp):
                                child[1],
                                '{}__language{}'.format(relation, lang_supp):
                                query_languages
                            })
                else:
                    q = Q(**{child[0]: child[1]})
            elif isinstance(child, TQ):
                if child.lang:
                    getter = _fetch_translations_query_getter(
                        model, child.lang)
                    q = getter(*child.children,
                               _connector=child.connector,
                               _negated=child.negated)
                else:
                    q = _get_translations_query(*child.children,
                                                _connector=child.connector,
                                                _negated=child.negated)
            elif isinstance(child, Q):
                q = _get_translations_query(*child.children,
                                            _connector=child.connector,
                                            _negated=child.negated)
            children[index] = q

        query = Q(*children, _connector=connector, _negated=negated)

        return query

    return _get_translations_query