Skip to content
Snippets Groups Projects
cms_plugins.py 2.21 KiB
Newer Older
Olivier Le Brouster's avatar
Olivier Le Brouster committed
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.utils.translation import ugettext as _
from cms.plugin_base import CMSPluginBase
from newsbox.models import NewsboxBase

Dylann Cordel's avatar
Dylann Cordel committed

Olivier Le Brouster's avatar
Olivier Le Brouster committed
class NewsboxPluginBase(CMSPluginBase):
Dylann Cordel's avatar
Dylann Cordel committed
    name = _("News list")
    render_template = 'newsbox_cms/list-cms.html'
    raw_id_fields = ('page_link', )
Olivier Le Brouster's avatar
Olivier Le Brouster committed

    def get_instance_queryset(self, instance, request):
        NewsboxModel = instance.newsbox_model
        return NewsboxModel.objects.published()

Olivier Le Brouster's avatar
Olivier Le Brouster committed
    def render(self, context, instance, placeholder):
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        NewsboxModel = instance.newsbox_model

        if not NewsboxModel or not issubclass(NewsboxModel, NewsboxBase):
            raise Exception(_("The choosen news type to display is invalid"))

        newsset = self.get_instance_queryset(
            instance=instance,
Dylann Cordel's avatar
Dylann Cordel committed
        if instance.numitems > 0:
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            with_pager = instance.with_pager

Dylann Cordel's avatar
Dylann Cordel committed
            if with_pager:
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                from django.core.paginator import Paginator, \
                    EmptyPage, PageNotAnInteger

                paginator = Paginator(newsset, instance.numitems)
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                page = context['request'].GET.get('page')
                try:
                    newsset = paginator.page(page)
                except PageNotAnInteger:
                    # If page is not an integer, deliver first page.
                    newsset = paginator.page(1)
                except EmptyPage:
                    # If page is out of range (e.g. 9999), deliver last page of results.
                    newsset = paginator.page(paginator.num_pages)
Dylann Cordel's avatar
Dylann Cordel committed
            else:
                newsset = newsset[:instance.numitems]
Dylann Cordel's avatar
Dylann Cordel committed
        else:
Olivier Le Brouster's avatar
Olivier Le Brouster committed
            with_pager = False
        context.update({
            'instance': instance,
            'title': instance.title,
Dylann Cordel's avatar
Dylann Cordel committed
            'newsset': newsset,
            'newsbox_opts': NewsboxModel._newsbox_meta,
            'with_pager': with_pager,
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        })
Olivier Le Brouster's avatar
Olivier Le Brouster committed
        if instance.page_link:
            context.update({
Dylann Cordel's avatar
Dylann Cordel committed
                'title_url': instance.page_link.get_absolute_url(),
Olivier Le Brouster's avatar
Olivier Le Brouster committed
                'all_news_url': instance.page_link.get_absolute_url(),
            })
        return context
Olivier Le Brouster's avatar
Olivier Le Brouster committed
    class Meta:
        abstract = True