django-simplecms/cms/models.py

106 wiersze
3.6 KiB
Python
Czysty Zwykły widok Historia

import swapper
2019-03-27 15:49:14 +00:00
from django.db import models
from django.urls import reverse
from django.conf import settings
from django.forms import TextInput, Select
2019-03-27 15:49:14 +00:00
from django.utils.translation import gettext_lazy as _
from ckeditor.fields import RichTextField
from embed_video.fields import EmbedVideoField
from polymorphic.models import PolymorphicModel
from numberedmodel.models import NumberedModel
def register(verbose_name):
def wrapper(model):
model.__bases__[-1].TYPES.append((model.__name__.lower(), verbose_name))
return model
return wrapper
2019-08-23 15:19:40 +00:00
class VarCharField(models.TextField):
def formfield(self, **kwargs):
kwargs.update({'widget': TextInput})
return super().formfield(**kwargs)
class VarCharChoiceField(models.TextField):
def formfield(self, **kwargs):
kwargs.update({'widget': Select})
return super().formfield(**kwargs)
class BasePage(NumberedModel):
2019-03-27 15:49:14 +00:00
position = models.PositiveIntegerField(_('position'), blank=True)
title = VarCharField(_('title'))
2019-03-27 15:49:14 +00:00
slug = models.SlugField(_('slug'), help_text=_('A short identifier to use in URLs'), blank=True, unique=True)
menu = models.BooleanField(_('visible in menu'), default=True)
def __str__(self):
2019-08-26 07:47:52 +00:00
if not self.pk:
return str(_('New page'))
else:
return self.title
2019-03-27 15:49:14 +00:00
def get_absolute_url(self):
if self.slug:
return reverse('cms:page', args=[self.slug])
2019-03-27 15:49:14 +00:00
else:
return reverse('cms:page')
2019-03-27 15:49:14 +00:00
class Meta:
abstract = True
2019-03-27 15:49:14 +00:00
verbose_name = _('Page')
verbose_name_plural = _('Pages')
ordering = ['position']
class BaseSection(NumberedModel, PolymorphicModel):
TYPES = []
page = models.ForeignKey(swapper.get_model_name('cms', 'Page'), verbose_name=_('page'), related_name='sections', on_delete=models.PROTECT)
type = VarCharChoiceField(_('section type'), default='', choices=TYPES)
2019-03-27 15:49:14 +00:00
position = models.PositiveIntegerField(_('position'), blank=True)
title = VarCharField(_('title'), blank=True)
2019-03-27 15:49:14 +00:00
color = models.PositiveIntegerField(_('color'), default=1, choices=settings.SECTION_COLORS)
content = RichTextField(_('content'), blank=True)
image = models.ImageField(_('image'), blank=True)
video = EmbedVideoField(_('video'), blank=True, help_text=_('Paste a YouTube, Vimeo, or SoundCloud link'))
button_text = VarCharField(_('button text'), blank=True)
button_link = VarCharField(_('button link'), blank=True)
2019-03-27 15:49:14 +00:00
def number_with_respect_to(self):
return self.page.sections.all()
def __str__(self):
2019-08-26 07:47:52 +00:00
if not self.pk:
return str(_('New section'))
elif not self.title:
return str(_('Untitled'))
else:
return self.title
2019-03-27 15:49:14 +00:00
class Meta:
abstract = True
2019-03-27 15:49:14 +00:00
verbose_name = _('section')
verbose_name_plural = _('sections')
ordering = ['position']
class Page(BasePage):
class Meta(BasePage.Meta):
swappable = swapper.swappable_setting('cms', 'Page')
2019-03-27 15:49:14 +00:00
class Section(BaseSection):
class Meta(BaseSection.Meta):
swappable = swapper.swappable_setting('cms', 'Section')
2019-08-23 15:19:40 +00:00
2019-03-27 15:49:14 +00:00
class Config(models.Model):
TYPES = [
(10, _('Footer')),
]
parameter = models.PositiveIntegerField(choices=TYPES, unique=True)
2019-07-08 12:35:29 +00:00
content = RichTextField(_('content'), blank=True)
2019-03-27 15:49:14 +00:00
def __str__(self):
return "{}. {}".format(self.parameter, self.get_parameter_display())
class Meta:
verbose_name = _('configuration parameter')
verbose_name_plural = _('configuration parameters')
ordering = ['parameter']