Skip to content
Snippets Groups Projects
cms_plugins.py 2.92 KiB
Newer Older
Dylann Cordel's avatar
wip
Dylann Cordel committed
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.template.loader import select_template
from django.utils.encoding import smart_bytes
from django.utils.translation import ugettext_lazy as _

from cms.plugin_base import CMSPluginBase

Dylann Cordel's avatar
Dylann Cordel committed
from cms_highlighted_content.admin import HighlightedContentItemInlineBase
from cms_highlighted_content.models import HighlightedContentItemBase
Dylann Cordel's avatar
wip
Dylann Cordel committed


class HighlightedContentPluginBase(CMSPluginBase):
    cache = True
    name = _('HighlightedContent')
    raw_id_fields = ('page_link',)
    inlines = []

    def __init__(self, *args, **kwargs):
        if not hasattr(self.__class__, 'highlighted_content_item_inline_class'):
            highlighted_content_item_model = None
            for m2m in self.model._meta.related_objects:
                if issubclass(m2m.related_model, HighlightedContentItemBase):
                    highlighted_content_item_model = m2m.related_model
                    break
            if not highlighted_content_item_model:
                raise Exception('Can not get your HighlightedContentItem model. '
                                'Do you add a foreignkey to '
                                'your HighlightedContent model with a valid related_name ?')
            class_name = smart_bytes(highlighted_content_item_model.__name__ + 'Inline')
            bases = (HighlightedContentItemInlineBase, )
            attributes = {'model': highlighted_content_item_model}
            inline_class = type(class_name, bases, attributes)
            setattr(self.__class__, 'highlighted_content_item_inline_class', inline_class)
        if self.__class__.highlighted_content_item_inline_class not in self.inlines:
            self.inlines.append(self.__class__.highlighted_content_item_inline_class)
        super(HighlightedContentPluginBase, self).__init__(*args, **kwargs)

    def get_render_template(self, context, instance, placeholder):
        if not hasattr(self,  '_render_template'):
            kwargs = {'app_label': self.model._meta.app_label,
                      'model_name': self.model._meta.model_name}
            templates = ['%(app_label)s/%(model_name)s/highlighted_content.html' % kwargs,
                         '%(app_label)s/highlighted_content.html' % kwargs,
                         'cms_highlighted_content/highlighted_content.html' % kwargs]
            self._render_template = select_template(templates).template.name
        return self._render_template

    def get_items(self, context, instance, placeholder):
        return instance.get_items()

    def render(self, context, instance, placeholder):
        items = self.get_items(context, instance, placeholder)
        context.update({
            'object_list': items,
            'count': (items.count() if hasattr(items, 'count') and callable(items.count)
                      else len(items)),
        })
        return super(HighlightedContentPluginBase, self).render(context, instance, placeholder)