"""Models (mostly) for pages."""
from typing import Dict
from django.apps import apps
from django.core.exceptions import ValidationError
from django.db import models
from django.forms import Form
from django.urls import reverse
from django.utils.html import strip_tags
from django.utils.translation import gettext_lazy as _
from pagetools.models import PagelikeModel
from pagetools.widgets.models import PageType
from .settings import INDEX_VIEW_SLUG
from .validators import validate_emails_str
[docs]class AuthPage(models.Model):
"""Page with a `login_required` field.
The ::class::pagetools.pages.views.IncludedFormMixin will add
`email_receivers_list` to the form kwargs.
"""
login_required = models.BooleanField(_("Login required"), default=False)
[docs] class Meta:
abstract = True
[docs]class BasePage(IncludedEmailForm, AuthPage, PagelikeModel):
"""A basemodel for a page with one main content area"""
content = models.TextField(_("Content"))
objects = models.Manager()
pagetype = models.ForeignKey(PageType, blank=True, null=True, on_delete=models.CASCADE)
[docs] def get_pagetype(self, **kwargs):
print(4, kwargs)
return self.pagetype
[docs] def get_absolute_url(self):
if self.slug == INDEX_VIEW_SLUG:
return "/"
return reverse("pages:pageview", kwargs={"slug": self.slug})
[docs] class Meta(PagelikeModel.Meta):
verbose_name = _("Page")
verbose_name_plural = _("Pages")
unique_together = ("slug", "lang")
abstract = True
[docs]class Page(BasePage):
objects = models.Manager()
[docs]class PageBlockMixin(models.Model):
"""Abstract Content blocks for pages"""
content = models.TextField(_("Content"), blank=True)
visible = models.BooleanField(_("Visible"), default=True)
# in concrete model:
# page = models.ForeignKey(MyBlockPage)
position = models.PositiveIntegerField()
[docs] class Meta:
verbose_name = "Block"
ordering = ("position",)
abstract = True
def __str__(self):
content_len = len(self.content)
stripped = strip_tags(self.content) or self.content
return stripped[: 100 if content_len > 100 else content_len]