You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

373 lines
11 KiB

"""
Example instantiation of the abstract plugin base classes
"""
"""
from django.db import models
from django.utils.translation import ugettext_lazy as _
from content_editor.models import create_plugin_base
from shared.utils.text import slugify_long
from shared.multilingual.utils.fields import TranslatableCharField
from ..collection.models import ItemBundle, Event, Collection
from ..content.admin import RichTextInlineBase
from ..content import plugins
from ..content.renderer import ContentPluginRenderer
from ..media.models import (
MediaImage,
MediaAudio,
MediaVideo,
MediaDocument,
)
from ..people.models import Person
from ..thesaurus.models import Term
from .models import Page
ContentPluginBase = create_plugin_base(Page)
renderer = ContentPluginRenderer()
@renderer.register()
class RichTextContentPlugin(plugins.RichTextFootnoteMixin, plugins.RichTextBase, ContentPluginBase):
regions = ['main', 'aside', 'intro']
@renderer.register()
class BlockquoteContentPlugin(plugins.RichTextFootnoteMixin, plugins.RichTextBase, ContentPluginBase):
STYLE_CHOICES = plugins.StyleMixin.STYLE_CHOICES + (
('blockquote', _("Blockquote")),
('pullquote', _("Pull Quote")),
('introquote', _("Introductory Quote")),
)
template_name_prefix = 'quote'
regions = ['main', 'intro']
class Meta:
verbose_name = _("quote")
verbose_name_plural = _("quotes")
@renderer.register()
class SectionContentPlugin(plugins.SectionBase, ContentPluginBase):
regions = ['main', 'aside']
# @renderer.register()
# class ImageContentPlugin(plugins.ImageBase, ContentPluginBase):
# regions = ['main', 'aside']
# @renderer.register()
# class DownloadContentPlugin(plugins.DownloadBase, ContentPluginBase):
# regions = ['main', 'aside']
@renderer.register()
class FootnoteContentPlugin(plugins.FootnoteBase, ContentPluginBase):
regions = ['references', 'footnotes']
class BaseObjectElement(plugins.BasePlugin, ContentPluginBase):
STYLE_CHOICES = plugins.StyleMixin.STYLE_CHOICES + (
('minimal', _("Minimal View")),
('extensive', _("Extensive View")),
)
class Meta:
abstract = True
verbose_name = _("object view")
verbose_name_plural = _("objects view")
fk_fieldname = None
regions = ['main', 'aside']
@property
def object(self):
assert self.fk_fieldname, "fk_fieldname not set."
return getattr(self, self.fk_fieldname)
def type_slug(self):
slug = ''
type = getattr(self.object, 'type', None)
if type:
slug = getattr(type, 'internal_slug', '')
return slug
def get_template_names(self):
assert self.fk_fieldname, "fk_fieldname not set."
type_slug = self.type_slug()
style_slug = getattr(self, 'style', None) or 'default'
# Append a potentially defined self.template_name
return [
"curatorialcontent/elements/{path_prefix}/pk/_{pk}.html".format(
path_prefix=self.fk_fieldname, pk=self.object.pk),
"curatorialcontent/elements/{path_prefix}/type/_{style}/_{type}.html".format(
path_prefix=self.fk_fieldname, style=style_slug, type=type_slug),
"curatorialcontent/elements/{path_prefix}/style/_{style}.html".format(
path_prefix=self.fk_fieldname, style=style_slug),
"curatorialcontent/elements/{path_prefix}/type/_{type}.html".format(
path_prefix=self.fk_fieldname, type=type_slug),
"curatorialcontent/elements/{path_prefix}/_default.html".format(
path_prefix=self.fk_fieldname)
] + ([self.template_name] if hasattr(self, 'template_name') else [])
@classmethod
def admin_inline(cls, base_class=None):
assert cls.fk_fieldname, "fk_fieldname not set."
inline = super().admin_inline(base_class=RichTextInlineBase) # TODO Do we need RichTextInlineBase here?
if not inline.raw_id_fields:
inline.raw_id_fields = []
inline.raw_id_fields += [cls.fk_fieldname]
return inline
@renderer.register()
class ItemBundleElement(BaseObjectElement, plugins.StyleMixin):
STYLE_CHOICES = BaseObjectElement.STYLE_CHOICES + (
('teaser', _("Big Top Teaser")),
)
itembundle = models.ForeignKey(ItemBundle, verbose_name=_("ItemBundle"))
fk_fieldname = 'itembundle'
regions = ['main', 'aside']
class Meta:
verbose_name = _("item bundle view")
verbose_name_plural = _("item bundle views")
@renderer.register()
class PersonElement(BaseObjectElement, plugins.StyleMixin):
person = models.ForeignKey(Person, verbose_name=_("Person"))
fk_fieldname = 'person'
regions = ['main', 'aside']
class Meta:
verbose_name = _("person view")
verbose_name_plural = _("person views")
@renderer.register()
class ContributorElement(BaseObjectElement):
person = models.ForeignKey(Person, verbose_name=_("Person"))
CONTRIBUTOR_ROLE_CHOICES = (
('author', _("Author")),
('contributor', _("Contributor")),
)
role = models.CharField(_("role"), max_length=50,
choices=CONTRIBUTOR_ROLE_CHOICES,
default=CONTRIBUTOR_ROLE_CHOICES[0][0], null=False, blank=False)
fk_fieldname = 'person'
regions = ['contributors']
class Meta:
verbose_name = _("contributor")
verbose_name_plural = _("contributors")
@renderer.register()
class TermElement(BaseObjectElement, plugins.StyleMixin):
term = models.ForeignKey(Term, verbose_name=_("Term"))
fk_fieldname = 'term'
regions = ['main', 'aside']
class Meta:
verbose_name = _("term view")
verbose_name_plural = _("term views")
@renderer.register()
class EventElement(BaseObjectElement, plugins.StyleMixin):
event = models.ForeignKey(Event, verbose_name=_("Event"))
fk_fieldname = 'event'
regions = ['main', 'aside']
class Meta:
verbose_name = _("event view")
verbose_name_plural = _("event views")
@renderer.register()
class SubcollectionElement(BaseObjectElement, plugins.StyleMixin):
STYLE_CHOICES = BaseObjectElement.STYLE_CHOICES + (
('index-nav', _("Index Page Navigation")),
)
collection = models.ForeignKey(Collection, verbose_name=_("Subcollection"))
fk_fieldname = 'collection'
regions = ['main', 'aside']
class Meta:
verbose_name = _("collection view")
verbose_name_plural = _("collection views")
@renderer.register()
class MediaImageElement(BaseObjectElement):
image = models.ForeignKey(MediaImage, verbose_name=_("Image"))
caption = TranslatableCharField(_("caption"), max_length=500, null=True, blank=True, help_text=_("image caption"))
fk_fieldname = 'image'
regions = ['main', 'aside']
class Meta:
verbose_name = _("image")
verbose_name_plural = _("images")
def type_slug(self):
return ''
@renderer.register()
class MediaAudioElement(BaseObjectElement):
audio = models.ForeignKey(MediaAudio, verbose_name=_("Audio"))
caption = TranslatableCharField(_("caption"), max_length=500, null=True, blank=True, help_text=_("audio caption"))
fk_fieldname = 'audio'
regions = ['main', 'aside']
class Meta:
verbose_name = _("audio")
verbose_name_plural = _("audio")
@renderer.register()
class MediaVideoElement(BaseObjectElement):
video = models.ForeignKey(MediaVideo, verbose_name=_("Video"))
caption = TranslatableCharField(_("caption"), max_length=500, null=True, blank=True, help_text=_("video caption"))
fk_fieldname = 'video'
regions = ['main', 'aside']
class Meta:
verbose_name = _("video")
verbose_name_plural = _("video")
@renderer.register()
class MediaDocumentElement(BaseObjectElement):
document = models.ForeignKey(MediaDocument, verbose_name=_("Document"))
caption = TranslatableCharField(_("caption"), max_length=500, null=True, blank=True, help_text=_("document caption"))
fk_fieldname = 'document'
regions = ['main', 'aside']
class Meta:
verbose_name = _("document")
verbose_name_plural = _("document")
@renderer.register()
class SubsectionsElement(plugins.StyleMixin, plugins.FilesystemTemplateRendererPlugin, ContentPluginBase):
regions = ['main', 'aside']
template_name_prefix = 'subsections_nav'
class Meta:
verbose_name = _("subsections navigation element")
verbose_name_plural = _("subsections navigation elements")
@renderer.register()
class TeamElement(plugins.StyleMixin, plugins.FilesystemTemplateRendererPlugin, ContentPluginBase):
regions = ['main', 'aside']
template_name_prefix = 'team'
class Meta:
verbose_name = _("team navigation element")
verbose_name_plural = _("team navigation elements")
@renderer.register()
class ActorsElement(plugins.StyleMixin, plugins.FilesystemTemplateRendererPlugin, ContentPluginBase):
regions = ['main', 'aside']
template_name_prefix = 'actors'
class Meta:
verbose_name = _("actors navigation element")
verbose_name_plural = _("actors navigation elements")
@renderer.register()
class ArticlesElement(plugins.StyleMixin, plugins.FilesystemTemplateRendererPlugin, ContentPluginBase):
regions = ['main', 'aside']
template_name_prefix = 'articles_nav'
class Meta:
verbose_name = _("articles navigation element")
verbose_name_plural = _("articles navigation elements")
#
# Slideshow Elements
class BaseSlideshowContentPlugin(plugins.StyleMixin, plugins.FilesystemTemplateRendererPlugin, ContentPluginBase):
STYLE_CHOICES = (
('black', _("black background")),
('yellow', _("yellow background")),
('white', _("white background")),
)
caption = plugins.TranslatableCleansedRichTextField(_("caption"), blank=True)
template_name_prefix = 'slide'
regions = ['slides']
class Meta:
abstract = True
@classmethod
def admin_inline(cls, base_class=None):
return super().admin_inline(base_class=RichTextInlineBase)
@renderer.register()
class TextSlideshowContentPlugin(BaseSlideshowContentPlugin):
template_name_prefix = 'slide/text/'
regions = ['slides']
class Meta:
verbose_name = _("text slide")
verbose_name_plural = _("text slides")
@renderer.register()
class ItembundleSlideshowContentPlugin(BaseSlideshowContentPlugin):
itembundle = models.ForeignKey(ItemBundle, verbose_name=_("ItemBundle"))
template_name_prefix = 'slide/itembundle/'
regions = ['slides']
class Meta:
verbose_name = _("item bundle slide")
verbose_name_plural = _("item bundle slides")
@classmethod
def admin_inline(cls, base_class=None):
inline = super().admin_inline(base_class=RichTextInlineBase)
if not inline.raw_id_fields:
inline.raw_id_fields = []
inline.raw_id_fields += ['itembundle']
return inline
"""