You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kompass/jdav_web/startpage/models.py

148 lines
4.4 KiB
Python

import os
from django.db import models
from django.urls import NoReverseMatch
from django.urls import reverse
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from markdownx.models import MarkdownxField
from members.models import Group
from members.models import Member
from utils import RestrictedFileField
class Section(models.Model):
"""
A section of the website.
"""
title = models.CharField(verbose_name=_("Title"), max_length=50)
urlname = models.CharField(verbose_name=_("URL"), max_length=25)
website_text = MarkdownxField(verbose_name=_("website text"), default="", blank=True)
show_in_navigation = models.BooleanField(verbose_name=_("Show in navigation"), default=True)
class Meta:
verbose_name = _("Section")
verbose_name_plural = _("Sections")
unique_together = ["urlname"]
def __str__(self):
return self.title
def absolute_urlname(self):
try:
return reverse("startpage:section", args=(self.urlname,))
except NoReverseMatch:
return _("deactivated")
absolute_urlname.short_description = "URL"
class Post(models.Model):
"""
A post with title, markdown and images.
"""
title = models.CharField(verbose_name=_("Title"), default="", max_length=50)
urlname = models.CharField(verbose_name=_("URL"), default="", max_length=50)
date = models.DateField(
default=timezone.localdate, verbose_name=_("Date"), null=True, blank=True
)
website_text = MarkdownxField(verbose_name=_("website text"), default="", blank=True)
groups = models.ManyToManyField(Group, verbose_name=_("Groups"), blank=True)
detailed = models.BooleanField(verbose_name=_("detailed"), default=False)
section = models.ForeignKey(
Section, verbose_name=_("section"), on_delete=models.CASCADE, null=True, blank=False
)
def __str__(self):
"""String represenation"""
return self.title
class Meta:
verbose_name = _("Post")
verbose_name_plural = _("Posts")
unique_together = ["section", "urlname"]
def absolute_section(self):
if self.section is None:
return "Aktuelles"
else:
return self.section.title
absolute_section.short_description = _("Section")
def absolute_urlname(self):
try:
if self.section is None:
return reverse("startpage:post", args=("aktuelles", self.urlname))
else:
return reverse("startpage:post", args=(self.section.urlname, self.urlname))
except NoReverseMatch:
return _("deactivated")
absolute_urlname.short_description = "URL"
class Image(models.Model):
"""
An image on a post.
"""
post = models.ForeignKey(Post, on_delete=models.CASCADE)
# file (not naming it file because of builtin)
f = RestrictedFileField(_("file"), upload_to="images", blank=True, max_upload_size=10)
def __str__(self):
return os.path.basename(self.f.name) if self.f.name else str(_("Empty"))
class Meta:
verbose_name = _("image")
verbose_name_plural = _("images")
class MemberOnPost(models.Model):
"""
One or multiple members on a post.
"""
members = models.ManyToManyField(Member, verbose_name=_("Member"), blank=True)
post = models.ForeignKey(
Post, verbose_name=_("Member"), on_delete=models.CASCADE, related_name="people"
)
description = models.TextField(_("Description"), default="", blank=True)
tag = models.CharField(_("Tag"), max_length=20, default="", blank=True)
class Meta:
verbose_name = _("Person")
verbose_name_plural = _("Persons")
class Link(models.Model):
"""
Link to external resources that should be shown on the internal startpage.
"""
title = models.CharField(_("Title"), max_length=100, default="", blank=True)
description = models.TextField(_("Description"), default="", blank=True)
url = models.URLField(max_length=250)
icon = RestrictedFileField(
verbose_name=_("Link Icon"),
upload_to="icons",
blank=True,
max_upload_size=5,
content_types=["image/jpeg", "image/png", "image/gif"],
)
visible = models.BooleanField(verbose_name=_("Visible"), default=True)
class Meta:
verbose_name = _("Link")
verbose_name_plural = _("Links")
def __str__(self):
return self.title