Skip to content
Snippets Groups Projects
Verified Commit f3007ba0 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Restructure and cleanup LiveDocument model using revisions

parent 8dc87f2b
No related branches found
No related tags found
1 merge request!16Resolve "Provide infrastructure for live documents"
# Generated by Django 3.2.5 on 2021-08-03 18:02
# Generated by Django 3.2.4 on 2021-08-05 14:20
import aleksis.core.managers
from django.db import migrations, models
import django.db.models.deletion
......@@ -7,6 +8,7 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('sites', '0002_alter_domain_unique'),
('contenttypes', '0002_remove_content_type_name'),
('resint', '0005_fix_permissions'),
]
......@@ -16,15 +18,20 @@ class Migration(migrations.Migration):
name='LiveDocument',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('extended_data', models.JSONField(default=dict, editable=False)),
('slug', models.SlugField(help_text='This will be used for the name of the current PDF file.', verbose_name='Slug')),
('name', models.CharField(max_length=255, verbose_name='Name')),
('last_update', models.DateTimeField(blank=True, null=True, verbose_name='Date and time of the last update', editable=False)),
('current_file', models.FileField(blank=True, null=True, upload_to='chronos/plan_pdfs/', verbose_name='Current file', editable=False)),
('current_file', models.FileField(blank=True, editable=False, null=True, upload_to='live_documents/', verbose_name='Current file')),
('last_update_triggered_manually', models.BooleanField(default=False, editable=False, verbose_name='Was the last update triggered manually?')),
('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_resint.livedocument_set+', to='contenttypes.contenttype')),
('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')),
],
options={
'verbose_name': 'Live document',
'verbose_name_plural': 'Live documents',
},
managers=[
('objects', aleksis.core.managers.PolymorphicCurrentSiteManager()),
],
),
]
......@@ -7,11 +7,12 @@ 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 polymorphic.models import PolymorphicModel
from reversion.models import Revision, Version
from aleksis.core.mixins import ExtensibleModel
from aleksis.core.mixins import ExtensibleModel, ExtensiblePolymorphicModel
class PosterGroup(ExtensibleModel):
......@@ -145,8 +146,8 @@ class Poster(ExtensibleModel):
return timezone.datetime.combine(day, self.group.publishing_time)
class LiveDocument(PolymorphicModel):
"""Model for periodically/automatically updated PDF files."""
class LiveDocument(ExtensiblePolymorphicModel):
"""Model for periodically/automatically updated files."""
slug = models.SlugField(
verbose_name=_("Slug"),
......@@ -154,9 +155,6 @@ class LiveDocument(PolymorphicModel):
)
name = models.CharField(max_length=255, verbose_name=_("Name"))
last_update = models.DateTimeField(
blank=True, null=True, verbose_name=_("Date and time of the last update"), editable=False
)
current_file = models.FileField(
upload_to="live_documents/",
null=True,
......@@ -164,25 +162,51 @@ class LiveDocument(PolymorphicModel):
verbose_name=_("Current file"),
editable=False,
)
last_update_triggered_manually = models.BooleanField(
default=False, verbose_name=_("Was the last update triggered manually?"), editable=False
)
def update(self, file: Optional[File] = None):
"""Set a new PDF file as current file."""
if file:
self.current_file.save("current.pdf", file)
self.last_update = timezone.now()
self.save()
@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 PDF file."""
"""Get current file."""
if not self.current_file:
self.update()
return self.current_file.file if self.current_file else None
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.
"""
pass
def __str__(self) -> str:
return self.name
class Meta:
verbose_name = _("Live document")
verbose_name_plural = _("Live documents")
......@@ -232,4 +232,4 @@ class LiveDocumentShowView(PermissionRequiredMixin, SingleObjectMixin, View):
file = live_document.get_current_file()
if not file:
raise Http404
return FileResponse(live_document.get_current_file(), content_type="application/pdf")
return FileResponse(file.file, content_type="application/pdf")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment