from django.db import models from django.utils.text import slugify from wagtail.admin.edit_handlers import FieldPanel, StreamFieldPanel from wagtail.core.fields import RichTextField, StreamField from wagtail.images.blocks import ImageChooserBlock from books.blocks import CMSDocumentBlock, DocumentBlock, GeniallyBlock, InfogramBlock, InstrumentTextBlock, LinkBlock, \ SectionTitleBlock, \ SubtitleBlock, ThinglinkBlock, VideoBlock from core.constants import DEFAULT_RICH_TEXT_FEATURES from core.wagtail_utils import StrictHierarchyPage from django.utils.translation import ugettext_lazy as _ LANGUAGE_COMMUNICATION = 'language_communication' SOCIETY = 'society' INTERDISCIPLINARY = 'interdisciplinary' LANGUAGE_COMMUNICATION_LABEL = 'Sprache & Kommunikation' SOCIETY_LABEL = 'Gesellschaft' INTERDISCIPLINARY_LABEL = 'Überfachliche Instrumente' class InstrumentCategory(models.Model): name = models.CharField(max_length=255, unique=True) background = models.CharField('background color', max_length=7) foreground = models.CharField('foreground color', max_length=7) def __str__(self): return self.name class Meta: verbose_name_plural = _('instrument categories') verbose_name = _('instrument category') def default_category(): return InstrumentCategory.objects.first().pk class InstrumentType(models.Model): class Meta: verbose_name = _('instrument type') verbose_name_plural = _('instrument types') CATEGORY_CHOICES = ( (LANGUAGE_COMMUNICATION, LANGUAGE_COMMUNICATION_LABEL), (SOCIETY, SOCIETY_LABEL), (INTERDISCIPLINARY, INTERDISCIPLINARY_LABEL), ) name = models.CharField(max_length=255, unique=True) category = models.ForeignKey( InstrumentCategory, on_delete=models.PROTECT, null=False, default=default_category, related_name='instrument_types' ) @property def type(self): return slugify(self.name.lower()) def __str__(self): return self.type class BasicKnowledge(StrictHierarchyPage): class Meta: verbose_name = _('instrument') verbose_name_plural = _('instruments') parent_page_types = ['books.book'] intro = RichTextField(features=DEFAULT_RICH_TEXT_FEATURES, default='', blank=True) contents = StreamField([ ('text_block', InstrumentTextBlock()), ('image_block', ImageChooserBlock()), ('link_block', LinkBlock()), ('video_block', VideoBlock()), ('document_block', DocumentBlock()), ('section_title', SectionTitleBlock()), ('infogram_block', InfogramBlock()), ('genially_block', GeniallyBlock()), ('thinglink_block', ThinglinkBlock()), ('subtitle', SubtitleBlock()), ('cms_document_block', CMSDocumentBlock()), ], null=True, blank=True) new_type = models.ForeignKey(InstrumentType, null=True, on_delete=models.PROTECT, related_name='instruments') old_type = models.CharField( max_length=100, choices=InstrumentType.CATEGORY_CHOICES, blank=True ) content_panels = [ FieldPanel('title', classname="full title"), FieldPanel('new_type'), FieldPanel('intro'), StreamFieldPanel('contents') ]