Skip to content
Snippets Groups Projects

Resolve "Provide infrastructure for live documents"

Merged Jonathan Weth requested to merge 3-provide-infrastructure-for-live-documents into master
Files
2
from datetime import datetime
from typing import Optional
from django.core.files import File
from django.core.validators import FileExtensionValidator, MaxValueValidator, MinValueValidator
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
import reversion
from calendarweek import CalendarWeek
from calendarweek.django import i18n_day_name_choices_lazy
from reversion.models import Revision, Version
from aleksis.core.mixins import ExtensibleModel
from aleksis.core.mixins import ExtensibleModel, ExtensiblePolymorphicModel
class PosterGroup(ExtensibleModel):
@@ -141,3 +144,69 @@ class Poster(ExtensibleModel):
cw = CalendarWeek(week=self.week, year=self.year)
day = cw[self.group.publishing_day]
return timezone.datetime.combine(day, self.group.publishing_time)
class LiveDocument(ExtensiblePolymorphicModel):
"""Model for periodically/automatically updated files."""
slug = models.SlugField(
verbose_name=_("Slug"),
help_text=_("This will be used for the name of the current PDF file."),
)
name = models.CharField(max_length=255, verbose_name=_("Name"))
current_file = models.FileField(
upload_to="live_documents/",
null=True,
blank=True,
verbose_name=_("Current file"),
editable=False,
)
last_update_triggered_manually = models.BooleanField(
default=False, verbose_name=_("Was the last update triggered manually?"), editable=False
)
@property
def last_version(self) -> Optional[Revision]:
"""Get django-reversion version of last file update."""
versions = Version.objects.get_for_object(self).order_by("revision__date_created")
if versions.exists():
return versions.last()
return None
@property
def last_update(self) -> Optional[datetime]:
"""Get datetime of last file update."""
last_version = self.last_version
if last_version:
return last_version.revision.date_created
return None
def get_current_file(self) -> Optional[File]:
"""Get current file."""
if not self.current_file:
self.update()
return self.current_file
@property
def filename(self) -> str:
"""Get the filename without path of the PDF file."""
return f"{self.slug}.pdf"
def save(self, *args, **kwargs):
with reversion.create_revision():
super().save(*args, **kwargs)
def update(self, triggered_manually: bool = True):
"""Update the file with a new version.
Has to be implemented by subclasses.
"""
raise NotImplementedError("Subclasses of LiveDocument must implement update()")
def __str__(self) -> str:
return self.name
class Meta:
verbose_name = _("Live document")
verbose_name_plural = _("Live documents")
Loading