diff --git a/CHANGELOG.rst b/CHANGELOG.rst index ebd320b81241603534acd66c173ee618b8e4a87b..1f212f88fc2ce4e1fff80d7d5b62263cc693290d 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,8 @@ Added ~~~~~ * Open poster group menu entries in new tab. +* [Dev] LiveDocument.update() now has a default implementaiton, rendering + ``self.template`` using ``self.get_context_data()`` Fixed ~~~~~ diff --git a/aleksis/apps/resint/models.py b/aleksis/apps/resint/models.py index 1b94622afd181d81e3da12458f2e507bc37e0502..eab9cc406f0dbb80a7b8accf9e7dbd595bc3eef7 100644 --- a/aleksis/apps/resint/models.py +++ b/aleksis/apps/resint/models.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import Optional +from typing import Any, Optional from django.core.files import File from django.core.validators import FileExtensionValidator, MaxValueValidator, MinValueValidator @@ -10,9 +10,12 @@ from django.utils.translation import gettext_lazy as _ import reversion from calendarweek import CalendarWeek from calendarweek.django import i18n_day_name_choices_lazy +from celery.result import allow_join_result +from celery.states import SUCCESS from reversion.models import Revision, Version from aleksis.core.mixins import ExtensibleModel, ExtensiblePolymorphicModel +from aleksis.core.util.pdf import generate_pdf_from_template class PosterGroup(ExtensibleModel): @@ -151,6 +154,8 @@ class LiveDocument(ExtensiblePolymorphicModel): SCOPE_PREFIX = "live_document_pdf" + template = None + slug = models.SlugField( verbose_name=_("Slug"), help_text=_("This will be used for the name of the current PDF file."), @@ -203,12 +208,26 @@ class LiveDocument(ExtensiblePolymorphicModel): with reversion.create_revision(): super().save(*args, **kwargs) + def get_context_data(self) -> dict[str, Any]: + """Get context to pass to the PDF template.""" + return {} + 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()") + if not self.template: + raise NotImplementedError("Subclasses of LiveDocument must implement update()") + + file_object, result = generate_pdf_from_template(self.template, self.get_context_data()) + with allow_join_result(): + result.wait() + file_object.refresh_from_db() + if result.status == SUCCESS and file_object.file: + self.last_update_triggered_manually = triggered_manually + self.current_file.save(self.filename, file_object.file.file) + self.save() def __str__(self) -> str: return self.name