Source code for documents.models

from django.core.validators import MinValueValidator, FileExtensionValidator
from django.db import models
from django.urls import reverse
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from utils.translation import ModelTranslateMeta, MultilingualField


[docs]class Document(models.Model, metaclass=ModelTranslateMeta): """Describes a base document""" class Meta: verbose_name = _("Document") verbose_name_plural = _("Documents") DOCUMENT_CATEGORIES = ( ("annual", _("Annual document")), ("association", _("Association document")), ("event", _("Event document")), ("minutes", _("Minutes")), ("misc", _("Miscellaneous document")), ) name = MultilingualField(models.CharField, verbose_name=_("name"), max_length=200) created = models.DateTimeField(verbose_name=_("created"), auto_now_add=True,) last_updated = models.DateTimeField(verbose_name=_("last updated"), auto_now=True) category = models.CharField( max_length=40, choices=DOCUMENT_CATEGORIES, verbose_name=_("category"), default="misc", ) file = MultilingualField( models.FileField, verbose_name=_("file"), upload_to="documents/", validators=[FileExtensionValidator(["txt", "pdf", "jpg", "jpeg", "png"])], ) members_only = models.BooleanField(verbose_name=_("members only"), default=False)
[docs] def get_absolute_url(self): return reverse("documents:document", kwargs={"pk": self.pk})
def __str__(self): return f"{self.name} ({self.created.date()})"
[docs]class AnnualDocument(Document): """Describes an annual document""" class Meta: verbose_name = _("Annual document") verbose_name_plural = _("Annual documents") unique_together = ("subcategory", "year") SUBCATEGORIES = ( ("report", _("Annual report")), ("financial", _("Financial report")), ("policy", _("Policy document")), ) subcategory = models.CharField( max_length=40, choices=SUBCATEGORIES, verbose_name=_("category"), default="report", ) year = models.IntegerField( verbose_name=_("year"), validators=[MinValueValidator(1990)], )
[docs] def save(self, *args, **kwargs): self.category = "annual" if self.subcategory == "report": self.name_en = "Annual report %d" % self.year self.name_nl = "Jaarverslag %d" % self.year elif self.subcategory == "financial": self.name_en = "Financial report %d" % self.year self.name_nl = "Financieel jaarverslag %d" % self.year else: self.name_en = "Policy document %d" % self.year self.name_nl = "Beleidsdocument %d" % self.year super().save(*args, **kwargs)
[docs]class AssociationDocumentManager(models.Manager): """Custom manager to filter for association documents"""
[docs] def get_queryset(self): return super().get_queryset().filter(category="association")
[docs]class AssociationDocument(Document): """Describes an association document""" class Meta: verbose_name = _("Miscellaneous association document") verbose_name_plural = _("Miscellaneous association documents") proxy = True objects = AssociationDocumentManager()
[docs] def save(self, *args, **kwargs): self.category = "association" super().save(*args, **kwargs)
[docs]class EventDocument(Document): """Describes a document for events""" class Meta: verbose_name = _("event document") verbose_name_plural = _("event documents") permissions = (("override_owner", "Can access event document as if owner"),) owner = models.ForeignKey( "activemembers.MemberGroup", verbose_name=_("owner"), on_delete=models.CASCADE, )
[docs] def save(self, *args, **kwargs): self.category = "event" super().save(*args, **kwargs)
[docs]class MiscellaneousDocumentManager(models.Manager): """Custom manager to filter for misc documents"""
[docs] def get_queryset(self): return super().get_queryset().filter(category="misc")
[docs]class MiscellaneousDocument(Document): """Describes a miscellaneous document""" class Meta: ordering = ["-created"] verbose_name = _("Miscellaneous document") verbose_name_plural = _("Miscellaneous documents") proxy = True objects = MiscellaneousDocumentManager()
[docs] def save(self, *args, **kwargs): self.category = "misc" super().save(*args, **kwargs)
[docs]class GeneralMeeting(models.Model, metaclass=ModelTranslateMeta): """Describes a general meeting""" class Meta: verbose_name = _("General meeting") verbose_name_plural = _("General meetings") ordering = ["datetime"] documents = models.ManyToManyField( Document, verbose_name=_("documents"), blank=True, ) datetime = models.DateTimeField(verbose_name=_("datetime"),) location = MultilingualField( models.CharField, verbose_name=_("location"), max_length=200 ) def __str__(self): return timezone.localtime(self.datetime).strftime("%Y-%m-%d")
[docs]class Minutes(Document): """Describes a minutes document""" class Meta: verbose_name = _("Minutes") verbose_name_plural = _("Minutes") meeting = models.OneToOneField( GeneralMeeting, blank=True, null=True, on_delete=models.CASCADE )
[docs] def save(self, *args, **kwargs): self.category = "minutes" self.name_en = "Minutes %s" % str(self.meeting.datetime.date()) self.name_nl = "Notulen %s" % str(self.meeting.datetime.date()) super().save(*args, **kwargs)