# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _, get_language, activate from django.utils import six from django.utils.encoding import python_2_unicode_compatible from parler.managers import TranslatableManager, TranslatableQuerySet from parler.models import TranslatableModel, TranslatedFields from newsbox.models import NewsboxModelBase, NewsboxManager class NewsboxI18NQueryset(TranslatableQuerySet): pass class NewsboxI18NManager(TranslatableManager, NewsboxManager): queryset_class = NewsboxI18NQueryset def newsboxi18n_mcls_processor(mcls, class_name, class_bases, class_attrs, base, newsbox_opts): translatedFields={} for trans_field in newsbox_opts['trans_fieldnames']: translatedFields[trans_field] = class_attrs.pop(trans_field) class_attrs['translations'] = TranslatedFields(**translatedFields) class_attrs['newsbox_objects'] = NewsboxI18NManager() #class_attrs['default_manager'] = class_attrs['newsbox_objects'] class NewsboxI18NModelBase(NewsboxModelBase): pass @python_2_unicode_compatible class NewsboxI18NBase(six.with_metaclass(NewsboxI18NModelBase, TranslatableModel)): """ Define News which expires in time and will not be displayed in front """ default_manager = NewsboxI18NManager() objects = default_manager def __str__(self): return self.safe_translation_getter( 'newsbox_title', _('News #%d') % self.pk, any_language=True) def get_slug(self, language=None, *args, **kwargs): """ Returns the slug for this object for the given language. """ if language is None or language == self.language_code: return self.safe_translation_getter('newsbox_slug') else: instance = self.__class__.objects.language(language).get(pk=self.pk) return instance.safe_translation_getter('newsbox_slug') def get_absolute_url(self, language=None, *args, **kwargs): """ Build url for the given language. """ current_language = get_language() if not language: language = current_language if language not in self.get_available_languages(): language = (list(self.get_fallback_languages()) + list(self.get_available_languages()))[0] activate(language) url = reverse(self._newsbox_meta['detail_url_name'], args=( self.newsbox_date.strftime("%Y"), self.newsbox_date.strftime("%m"), self.newsbox_date.strftime("%d"), self.get_slug(language=language),)) activate(current_language) return url class Meta: abstract = True verbose_name = _('news') verbose_name_plural = _('news') #newsbox_metaclass_base_processor = 'newsboxi18n_mcls_processor' newsbox_metaclass_final_processor = 'newsboxi18n_mcls_processor'