def __init__(self, *args, **kwargs): # Still allow to pass the translated fields (e.g. title=...) to this function. translated_kwargs = {} current_language = None if kwargs: current_language = kwargs.pop('_current_language', None) for field in self._parler_meta.get_all_fields(): try: translated_kwargs[field] = kwargs.pop(field) except KeyError: pass # Have the attributes available, but they can't be ready yet; # self._state.adding is always True at this point, # the QuerySet.iterator() code changes it after construction. self._translations_cache = None self._current_language = None # Run original Django model __init__ super(TranslatableModelMixin, self).__init__(*args, **kwargs) # Assign translated args manually. self._translations_cache = defaultdict(dict) self._current_language = normalize_language_code(current_language or get_language()) # What you used to fetch the object is what you get. if translated_kwargs: self._set_translated_fields(self._current_language, **translated_kwargs)
def test_get_language_with_fallback(self): """Test get_language patch function, with fallback""" from parler import appsettings with override(None): if django.VERSION >= (1, 8): self.assertEquals(get_language(), appsettings.PARLER_DEFAULT_LANGUAGE_CODE)
def set_current_language(self, language_code, initialize=False): """ Switch the currently activate language of the object. """ self._current_language = normalize_language_code(language_code or get_language()) # Ensure the translation is present for __get__ queries. if initialize: self._get_translated_model(use_fallback=False, auto_create=True)
def _pop_translated_data(self): """ Separate data of translated fields from other data. """ translated_data = {} for meta in self.Meta.model._parler_meta: translations = self.validated_data.pop(meta.rel_name, {}) if translations: translated_data[meta.rel_name] = translations else: # Either declare the active language on the object or get it from Django language_code = self.validated_data.pop('language_code', None) or get_language() translated_fields = self._pop_translatable_fields() if translated_fields: translations[language_code] = translated_fields translated_data[meta.rel_name] = translations return translated_data
def get_active_choices(self, language_code=None, site_id=None): """ Find out which translations should be visible in the site. It returns a list with either a single choice (the current language), or a list with the current language + fallback language. """ if language_code is None: language_code = get_language() lang_dict = self.get_language(language_code, site_id=site_id) if not lang_dict["hide_untranslated"]: return [language_code] + [ lang for lang in lang_dict["fallbacks"] if lang != language_code ] else: return [language_code]
def test_get_language_no_fallback(self): """Test get_language patch function, no fallback""" with override(None): if django.VERSION >= (1, 8): self.assertEquals(get_language(), None)
def test_get_language_no_fallback(self): """Test get_language patch function, no fallback""" with override(None): self.assertEqual(get_language(), None)
def get_queryset(self): qs = super(TranslatedApiViewMixin, self).get_queryset().language(get_language()) qs = qs.order_by(*qs.model._meta.ordering) return qs