Skip to content
Snippets Groups Projects
models.py 3.62 KiB
Newer Older
Olivier Le Brouster's avatar
Olivier Le Brouster committed
# -*- coding: utf-8 -*-
Dylann Cordel's avatar
Dylann Cordel committed
# Future imports
Olivier Le Brouster's avatar
Olivier Le Brouster committed
from __future__ import unicode_literals

Dylann Cordel's avatar
Dylann Cordel committed
try:
Dylann Cordel's avatar
Dylann Cordel committed
    # Django imports
Dylann Cordel's avatar
Dylann Cordel committed
    from django.urls import reverse
except ImportError:
    from django.core.urlresolvers import reverse
Dylann Cordel's avatar
Dylann Cordel committed
# Django imports
from django.utils.translation import get_language
from django.utils.translation import ugettext_lazy as _

# Third Party
from newsbox.models import NewsboxManager
from newsbox.models import NewsboxModelBase
from parler.managers import TranslatableManager
from parler.managers import TranslatableQuerySet
from parler.models import TranslatableModel
from parler.models import TranslatedFields
Dylann Cordel's avatar
Dylann Cordel committed
from parler.utils.context import switch_language
Dylann Cordel's avatar
Dylann Cordel committed
import six
class NewsboxI18NQueryset(TranslatableQuerySet):
Olivier Le Brouster's avatar
Olivier Le Brouster committed
    pass


class NewsboxI18NManager(TranslatableManager, NewsboxManager):

    queryset_class = NewsboxI18NQueryset


def newsboxi18n_mcls_processor(mcls, class_name, class_bases, class_attrs, base, newsbox_opts):
    translatedFields = {}
Olivier Le Brouster's avatar
Olivier Le Brouster committed
    for trans_field in newsbox_opts['trans_fieldnames']:
        translatedFields[trans_field] = class_attrs.pop(trans_field)
    translatedFields['meta'] = {
        'unique_together': (('newsbox_slug', 'language_code'), ),
        'verbose_name': _('News translation'),
        'verbose_name_plural': _('News translations')
    }
Olivier Le Brouster's avatar
Olivier Le Brouster committed
    class_attrs['translations'] = TranslatedFields(**translatedFields)
    class_attrs['newsbox_objects'] = NewsboxI18NManager()
    # class_attrs['default_manager'] = class_attrs['newsbox_objects']
class NewsboxI18NModelBase(NewsboxModelBase):
class NewsboxI18NBase(six.with_metaclass(NewsboxI18NModelBase, TranslatableModel)):
Olivier Le Brouster's avatar
Olivier Le Brouster committed
    """
    Define News which expires in time and will not be displayed in front
    """

    default_manager = NewsboxI18NManager()
Olivier Le Brouster's avatar
Olivier Le Brouster committed
    objects = default_manager

    def __str__(self):
        return self.safe_translation_getter(
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            'newsbox_title',
            _('News #%d') % (self.pk or 0),
            any_language=True)
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    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():
            if not self.get_available_languages():
                return None
            language = None
            for lang in self.get_fallback_languages():
                if lang in self.get_available_languages():
                    language = lang
                    break
            if not language:
                return None
Dylann Cordel's avatar
Dylann Cordel committed
        with switch_language(self, language):
            url = reverse(self._newsbox_meta['detail_url_name'], args=(
                self.newsbox_publication_start_date.strftime("%Y"),
                self.newsbox_publication_start_date.strftime("%m"),
                self.newsbox_publication_start_date.strftime("%d"),
                self.get_slug(language=language),))
        return url
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    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'