From 0f276fb3ae9a7e27a1ee1e5f0843fc9d0b871c12 Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Wed, 30 Jun 2021 20:23:34 +0200 Subject: [PATCH] Refactor this app to support multiple poster groups with own configuration Co-Authored-By: Frank Poetzsch-Heffter <p-h@katharineum.de> --- aleksis/apps/resint/admin.py | 3 +- aleksis/apps/resint/default.odt | Bin 39005 -> 0 bytes aleksis/apps/resint/default.pdf | Bin 26342 -> 0 bytes aleksis/apps/resint/forms.py | 44 +++--- aleksis/apps/resint/menus.py | 44 ++++-- .../apps/resint/migrations/0001_initial.py | 58 ++++++-- aleksis/apps/resint/models.py | 132 +++++++++++++++-- aleksis/apps/resint/settings.py | 13 -- .../resint/templates/resint/group/create.html | 17 +++ .../resint/templates/resint/group/edit.html | 17 +++ .../resint/templates/resint/group/list.html | 59 ++++++++ .../apps/resint/templates/resint/index.html | 37 ----- .../resint/templates/resint/poster/list.html | 77 ++++++++++ .../templates/resint/poster/upload.html | 14 ++ .../apps/resint/templates/resint/upload.html | 21 --- aleksis/apps/resint/urls.py | 24 +++- aleksis/apps/resint/views.py | 135 ++++++++++-------- 17 files changed, 508 insertions(+), 187 deletions(-) delete mode 100644 aleksis/apps/resint/default.odt delete mode 100644 aleksis/apps/resint/default.pdf delete mode 100644 aleksis/apps/resint/settings.py create mode 100644 aleksis/apps/resint/templates/resint/group/create.html create mode 100644 aleksis/apps/resint/templates/resint/group/edit.html create mode 100644 aleksis/apps/resint/templates/resint/group/list.html delete mode 100644 aleksis/apps/resint/templates/resint/index.html create mode 100644 aleksis/apps/resint/templates/resint/poster/list.html create mode 100644 aleksis/apps/resint/templates/resint/poster/upload.html delete mode 100644 aleksis/apps/resint/templates/resint/upload.html diff --git a/aleksis/apps/resint/admin.py b/aleksis/apps/resint/admin.py index 98ac672..2f35aab 100644 --- a/aleksis/apps/resint/admin.py +++ b/aleksis/apps/resint/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin -from .models import Poster +from .models import Poster, PosterGroup +admin.site.register(PosterGroup) admin.site.register(Poster) diff --git a/aleksis/apps/resint/default.odt b/aleksis/apps/resint/default.odt deleted file mode 100644 index 9b52ee32db4631bc506c29cb64d8ba0ea8c24a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39005 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 diff --git a/aleksis/apps/resint/default.pdf b/aleksis/apps/resint/default.pdf deleted file mode 100644 index 397f82391e8bad15e66ffc8df6845e5f854948f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26342 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%0AFE|?`yQWSo_H{s_@aED^=yLn~#N_B3AMSKY-ax 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 diff --git a/aleksis/apps/resint/forms.py b/aleksis/apps/resint/forms.py index e4587da..5a0ae98 100644 --- a/aleksis/apps/resint/forms.py +++ b/aleksis/apps/resint/forms.py @@ -1,31 +1,37 @@ from django import forms -from django.core.validators import FileExtensionValidator -from django.utils import timezone from material import Layout, Row -from .models import Poster +from .models import Poster, PosterGroup -current_year = timezone.datetime.now().year -options_for_year = [(current_year, current_year), (current_year + 1, current_year + 1)] -calendar_weeks = [(cw, str(cw)) for cw in range(1, 53)] - - -class PosterUploadForm(forms.ModelForm): - calendar_week = forms.ChoiceField(choices=calendar_weeks, initial=timezone.datetime.now().isocalendar()[1]) - year = forms.ChoiceField( - initial=timezone.datetime.now().year, choices=options_for_year - ) - pdf = forms.FileField( - validators=[FileExtensionValidator(allowed_extensions=["pdf"])], - ) +class PosterGroupForm(forms.ModelForm): + """Form to manage poster groups.""" layout = Layout( - Row("calendar_week", "year"), - Row("pdf") + Row("slug"), + Row("name"), + Row("publishing_day", "publishing_time"), + Row("default_pdf"), + Row("show_in_menu", "public"), ) + class Meta: + model = PosterGroup + fields = [ + "slug", + "name", + "publishing_day", + "publishing_time", + "default_pdf", + "show_in_menu", + "public", + ] + + +class PosterUploadForm(forms.ModelForm): + """Form for uploading new posters.""" + class Meta: model = Poster - fields = ("calendar_week", "year", "pdf") + fields = ["group", "week", "year", "pdf"] diff --git a/aleksis/apps/resint/menus.py b/aleksis/apps/resint/menus.py index 799d4a6..22c93b0 100644 --- a/aleksis/apps/resint/menus.py +++ b/aleksis/apps/resint/menus.py @@ -1,5 +1,30 @@ +from typing import Any, Dict, List + +from django.apps import apps +from django.urls import reverse +from django.utils.functional import lazy from django.utils.translation import ugettext_lazy as _ + +def _get_menu_entries() -> List[Dict[str, Any]]: + """Build menu entries for all poster groups. + + This will include only poster groups where ``show_in_menu`` is enabled. + """ + PosterGroup = apps.get_model("resint", "PosterGroup") + return [ + { + "name": group.name, + "url": reverse("poster_show_current", args=[group.slug]), + "icon": "picture_as_pdf", + "validators": ["menu_generator.validators.is_authenticated"], + } + for group in PosterGroup.objects.filter(show_in_menu=True) + ] + + +get_menu_entries_lazy = lazy(_get_menu_entries, list) + MENUS = { "NAV_MENU_CORE": [ { @@ -7,23 +32,22 @@ MENUS = { "url": "#", "icon": "open_in_browser", "root": True, - "validators": [ - "menu_generator.validators.is_authenticated", - ], + "validators": ["menu_generator.validators.is_authenticated",], "submenu": [ { - "name": _("Current poster"), - "url": "poster_show_current", - "icon": "picture_as_pdf", + "name": _("Manage posters"), + "url": "poster_index", + "icon": "file_upload", "validators": ["menu_generator.validators.is_authenticated"], }, { - "name": _("Upload poster"), - "url": "poster_index", - "icon": "file_upload", + "name": _("Poster groups"), + "url": "poster_group_list", + "icon": "topic", "validators": ["menu_generator.validators.is_authenticated"], }, - ], + ] + + get_menu_entries_lazy(), } ] } diff --git a/aleksis/apps/resint/migrations/0001_initial.py b/aleksis/apps/resint/migrations/0001_initial.py index 58c4743..eb43927 100644 --- a/aleksis/apps/resint/migrations/0001_initial.py +++ b/aleksis/apps/resint/migrations/0001_initial.py @@ -1,8 +1,11 @@ -# Generated by Django 3.0.4 on 2020-03-29 16:02 +# Generated by Django 3.2.4 on 2021-06-30 18:23 import aleksis.apps.resint.models -import django.contrib.postgres.fields.jsonb +import calendarweek.calendarweek +import django.contrib.sites.managers +import django.core.validators from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -10,22 +13,61 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('sites', '0002_alter_domain_unique'), ] operations = [ + migrations.CreateModel( + name='PosterGroup', + 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="If you use 'example', the filename will be 'example.pdf'.", verbose_name='Slug used in URL name')), + ('name', models.CharField(max_length=255, verbose_name='Name')), + ('publishing_day', models.PositiveSmallIntegerField(choices=[(0, 'Montag'), (1, 'Dienstag'), (2, 'Mittwoch'), (3, 'Donnerstag'), (4, 'Freitag'), (5, 'Samstag'), (6, 'Sonntag')], verbose_name='Publishing weekday')), + ('publishing_time', models.TimeField(verbose_name='Publishing time')), + ('default_pdf', models.FileField(help_text='This PDF file will be shown if there is no current PDF.', upload_to='default_posters/', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['pdf'])], verbose_name='Default PDF')), + ('show_in_menu', models.BooleanField(default=True, verbose_name='Show in menu')), + ('public', models.BooleanField(default=False, verbose_name='Show for not logged-in users')), + ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')), + ], + options={ + 'verbose_name': 'Poster group', + 'verbose_name_plural': 'Poster groups', + }, + managers=[ + ('objects', django.contrib.sites.managers.CurrentSiteManager()), + ], + ), migrations.CreateModel( name='Poster', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('extended_data', django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False)), - ('calendar_week', models.IntegerField(verbose_name='CW')), - ('year', models.IntegerField(verbose_name='Year')), - ('pdf', models.FileField(upload_to=aleksis.apps.resint.models.path_and_rename_poster, verbose_name='PDF')), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('extended_data', models.JSONField(default=dict, editable=False)), + ('week', models.PositiveSmallIntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'), (6, '6'), (7, '7'), (8, '8'), (9, '9'), (10, '10'), (11, '11'), (12, '12'), (13, '13'), (14, '14'), (15, '15'), (16, '16'), (17, '17'), (18, '18'), (19, '19'), (20, '20'), (21, '21'), (22, '22'), (23, '23'), (24, '24'), (25, '25'), (26, '26'), (27, '27'), (28, '28'), (29, '29'), (30, '30'), (31, '31'), (32, '32'), (33, '33'), (34, '34'), (35, '35'), (36, '36'), (37, '37'), (38, '38'), (39, '39'), (40, '40'), (41, '41'), (42, '42'), (43, '43'), (44, '44'), (45, '45'), (46, '46'), (47, '47'), (48, '48'), (49, '49'), (50, '50'), (51, '51'), (52, '52')], default=calendarweek.calendarweek.CalendarWeek.current_week, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(53)], verbose_name='Calendar week')), + ('year', models.PositiveSmallIntegerField(default=aleksis.apps.resint.models._get_current_year, verbose_name='Year')), + ('pdf', models.FileField(upload_to='posters/', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['pdf'])], verbose_name='PDF')), + ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='posters', to='resint.postergroup', verbose_name='Poster group')), + ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')), ], options={ 'verbose_name': 'Poster', 'verbose_name_plural': 'Posters', - 'unique_together': {('calendar_week', 'year')}, }, + managers=[ + ('objects', django.contrib.sites.managers.CurrentSiteManager()), + ], + ), + migrations.AddConstraint( + model_name='postergroup', + constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_site_name'), + ), + migrations.AddConstraint( + model_name='postergroup', + constraint=models.UniqueConstraint(fields=('site_id', 'slug'), name='unique_site_slug'), + ), + migrations.AddConstraint( + model_name='poster', + constraint=models.UniqueConstraint(fields=('site_id', 'week', 'year'), name='unique_site_week_year'), ), ] diff --git a/aleksis/apps/resint/models.py b/aleksis/apps/resint/models.py index 53dca0d..2a84336 100644 --- a/aleksis/apps/resint/models.py +++ b/aleksis/apps/resint/models.py @@ -1,23 +1,137 @@ +from datetime import datetime +from typing import Optional + +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 _ +from calendarweek import CalendarWeek +from calendarweek.django import i18n_day_name_choices_lazy + from aleksis.core.mixins import ExtensibleModel -from aleksis.core.util.core_helpers import path_and_rename -def path_and_rename_poster(instance, filename: str) -> str: - return path_and_rename(instance, filename, upload_to="poster") +class PosterGroup(ExtensibleModel): + """Group for time-based documents, called posters.""" + + slug = models.SlugField( + verbose_name=_("Slug used in URL name"), + help_text=_("If you use 'example', the filename will be 'example.pdf'."), + ) + name = models.CharField(max_length=255, verbose_name=_("Name")) + publishing_day = models.PositiveSmallIntegerField( + verbose_name=_("Publishing weekday"), choices=i18n_day_name_choices_lazy() + ) + publishing_time = models.TimeField(verbose_name=_("Publishing time")) + default_pdf = models.FileField( + upload_to="default_posters/", + verbose_name=_("Default PDF"), + help_text=_("This PDF file will be shown if there is no current PDF."), + validators=[FileExtensionValidator(allowed_extensions=["pdf"])], + ) + + show_in_menu = models.BooleanField(default=True, verbose_name=_("Show in menu")) + public = models.BooleanField(default=False, verbose_name=_("Show for not logged-in users")) + + class Meta: + verbose_name = _("Poster group") + verbose_name_plural = _("Poster groups") + constraints = [ + models.UniqueConstraint(fields=["site_id", "name"], name="unique_site_name"), + models.UniqueConstraint(fields=["site_id", "slug"], name="unique_site_slug"), + ] + + def __str__(self) -> str: + return f"{self.name} ({self.publishing_day_name}, {self.publishing_time})" + + @property + def publishing_day_name(self) -> str: + """Return the full name of the publishing day (e. g. Monday).""" + return i18n_day_name_choices_lazy()[self.publishing_day][1] + + @property + def filename(self) -> str: + """Return the filename for the currently valid PDF file.""" + return f"{self.slug}.pdf" + + @property + def current_poster(self) -> Optional["Poster"]: + """Get the currently valid poster.""" + # Get current date with year and calendar week + current = timezone.datetime.now() + cw = CalendarWeek.from_date(current) + + # Create datetime with the friday of the week and the toggle time + day = cw[self.publishing_day] + day_and_time = timezone.datetime.combine(day, self.publishing_time) + + # Check whether to show the poster of the next week or the current week + if current > day_and_time: + cw += 1 + + # Look for matching PDF in DB + try: + obj = self.posters.get(year=cw.year, week=cw.week) + return obj + + # Or show the default PDF + except Poster.DoesNotExist: + return None + + +def _get_current_year() -> int: + """Get the current year.""" + return timezone.now().year + + +calendar_weeks = [(cw, str(cw)) for cw in range(1, 53)] class Poster(ExtensibleModel): - calendar_week = models.IntegerField(verbose_name=_("CW")) - year = models.IntegerField(verbose_name=_("Year")) - pdf = models.FileField(upload_to=path_and_rename_poster, verbose_name=_("PDF")) + """A time-based document.""" + + group = models.ForeignKey( + to=PosterGroup, + related_name="posters", + on_delete=models.CASCADE, + verbose_name=_("Poster group"), + ) + week = models.PositiveSmallIntegerField( + verbose_name=_("Calendar week"), + validators=[MinValueValidator(1), MaxValueValidator(53)], + default=CalendarWeek.current_week, + choices=calendar_weeks, + ) + year = models.PositiveSmallIntegerField(verbose_name=_("Year"), default=_get_current_year) + pdf = models.FileField( + upload_to="posters/", + verbose_name=_("PDF"), + validators=[FileExtensionValidator(allowed_extensions=["pdf"])], + ) class Meta: - unique_together = ("calendar_week", "year") + constraints = [ + models.UniqueConstraint( + fields=["site_id", "week", "year"], name="unique_site_week_year" + ) + ] verbose_name = _("Poster") verbose_name_plural = _("Posters") - def __str__(self): - return "{} {}/{}".format(_("CW"), self.calendar_week, self.year) + def __str__(self) -> str: + return f"{self.group.name}: {self.week}/{self.year}" + + @property + def valid_from(self) -> datetime: + """Return the time this poster is valid from.""" + cw = CalendarWeek(week=self.week, year=self.year) - 1 + day = cw[self.group.publishing_day] + return timezone.datetime.combine(day, self.group.publishing_time) + + @property + def valid_to(self) -> datetime: + """Return the time this poster is valid to.""" + cw = CalendarWeek(week=self.week, year=self.year) + day = cw[self.group.publishing_day] + return timezone.datetime.combine(day, self.group.publishing_time) diff --git a/aleksis/apps/resint/settings.py b/aleksis/apps/resint/settings.py deleted file mode 100644 index ed40ecd..0000000 --- a/aleksis/apps/resint/settings.py +++ /dev/null @@ -1,13 +0,0 @@ -import os -from datetime import time - -from django.utils.translation import gettext_lazy as _ - -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -CONSTANCE_CONFIG = { - "RESINT_NEW_WEEK_DAY": (4, _("Weekday at which the poster of the next week is to be shown"), "weekday_field"), - "RESINT_NEW_WEEK_TIME": (time(14, 00), _("Time at which the poster of the next week is to be shown"), time) -} -CONSTANCE_CONFIG_FIELDSETS = { - "Resint settings": ("RESINT_NEW_WEEK_DAY", "RESINT_NEW_WEEK_TIME"), -} diff --git a/aleksis/apps/resint/templates/resint/group/create.html b/aleksis/apps/resint/templates/resint/group/create.html new file mode 100644 index 0000000..67dd263 --- /dev/null +++ b/aleksis/apps/resint/templates/resint/group/create.html @@ -0,0 +1,17 @@ +{% extends 'core/base.html' %} +{% load material_form i18n %} + +{% block browser_title %} + {% blocktrans %}Create poster group{% endblocktrans %} +{% endblock %} +{% block page_title %} + {% blocktrans %}Create poster group{% endblocktrans %} +{% endblock %} + +{% block content %} + <form method="post" enctype="multipart/form-data"> + {% csrf_token %} + {% form form=form %}{% endform %} + {% include "core/partials/save_button.html" %} + </form> +{% endblock %} diff --git a/aleksis/apps/resint/templates/resint/group/edit.html b/aleksis/apps/resint/templates/resint/group/edit.html new file mode 100644 index 0000000..a811160 --- /dev/null +++ b/aleksis/apps/resint/templates/resint/group/edit.html @@ -0,0 +1,17 @@ +{% extends 'core/base.html' %} +{% load material_form i18n %} + +{% block page_title %} + {% trans "Edit poster group" %} +{% endblock %} +{% block browser_title %} + {% trans "Edit poster group" %} +{% endblock %} + +{% block content %} + <form method="post" enctype="multipart/form-data"> + {% csrf_token %} + {% form form=form %}{% endform %} + {% include "core/partials/save_button.html" %} + </form> +{% endblock %} diff --git a/aleksis/apps/resint/templates/resint/group/list.html b/aleksis/apps/resint/templates/resint/group/list.html new file mode 100644 index 0000000..00b2d3c --- /dev/null +++ b/aleksis/apps/resint/templates/resint/group/list.html @@ -0,0 +1,59 @@ +{% extends 'core/base.html' %} +{% load material_form i18n %} + +{% block browser_title %}{% blocktrans %}Poster groups{% endblocktrans %}{% endblock %} + +{% block content %} + <a class="waves-effect waves-light btn green modal-trigger right" href="{% url "create_poster_group" %}"> + <i class="material-icons left">add</i>{% blocktrans %}Create new poster group{% endblocktrans %} + </a> + + <h1>{% blocktrans %}Poster groups{% endblocktrans %}</h1> + + <table> + <thead> + <tr> + <th>{% blocktrans %}Name{% endblocktrans %}</th> + <th>{% blocktrans %}Filename{% endblocktrans %}</th> + <th>{% blocktrans %}Publishing day{% endblocktrans %}</th> + <th>{% blocktrans %}Publishing time{% endblocktrans %}</th> + <th>{% blocktrans %}Default PDF file{% endblocktrans %}</th> + <th>{% blocktrans %}Actions{% endblocktrans %}</th> + </tr> + </thead> + <tbody> + {% for poster_group in postergroup_list %} + <tr> + <td>{{ poster_group.name }}</td> + <td> + <a href="{% url "poster_show_current" poster_group.slug %}"><code>{{ poster_group.filename }}</code></a> + </td> + <td>{{ poster_group.publishing_day_name }}</td> + <td>{{ poster_group.publishing_time }}</td> + <td> + <a href="{{ poster_group.default_pdf.url }}" class="btn-flat" target="_blank"> + <i class="material-icons left">picture_as_pdf</i> + {% trans "Open" %} + </a> + </td> + <td> + <a href="{% url 'edit_poster_group' poster_group.id %}" + class="waves-effect waves-light btn-flat orange-text"> + <i class="material-icons left">edit</i> + {% trans "Edit" %} + </a> + <a href="{% url 'delete_poster_group' poster_group.id %}" + class="waves-effect waves-light btn-flat red-text"> + <i class="material-icons left">delete</i> + {% trans "Delete" %} + </a> + </td> + </tr> + {% empty %} + <tr> + <td colspan="4">{% blocktrans %}There are no poster groups available.{% endblocktrans %}</td> + </tr> + {% endfor %} + </tbody> + </table> +{% endblock %} diff --git a/aleksis/apps/resint/templates/resint/index.html b/aleksis/apps/resint/templates/resint/index.html deleted file mode 100644 index 90dc986..0000000 --- a/aleksis/apps/resint/templates/resint/index.html +++ /dev/null @@ -1,37 +0,0 @@ -{% extends "core/base.html" %} -{% load msg_box static i18n %} - -{% block content %} - <a class="waves-effect waves-light btn green" href="{% url "poster_upload" %}"><i class="material-icons left">add</i> - {% trans "Upload new poster" %} - </a> - <a class="waves-effect waves-light btn orange" href="{% url "poster_show_current" %}"><i class="material-icons left">picture_as_pdf</i> - {% trans "Show current poster" %} - </a> - - <h5>{% trans "All uploaded posters" %}</h5> - - <ul class="collection"> - {% for poster in posters %} - <li class="collection-item "> - <span class="title">{{ poster }}</span> - <p> - <a class="btn-flat waves-effect waves-green" href="{% get_media_prefix %}{{ poster.pdf }}" target="_blank"> - <i class="material-icons left">picture_as_pdf</i> {% trans "Show" %} - </a> - <a class="btn-flat delete-poster waves-effect waves-red" href="{% url "poster_delete" poster.id %}"> - <i class="material-icons left">delete</i> {% trans "Delete" %} - </a> - </p> - </li> - {% endfor %} - </ul> - - <script type="text/javascript"> - $(".delete-poster").click(function (e) { - if (!confirm("Wirklich löschen?")) { - e.preventDefault(); - } - }) - </script> -{% endblock %} diff --git a/aleksis/apps/resint/templates/resint/poster/list.html b/aleksis/apps/resint/templates/resint/poster/list.html new file mode 100644 index 0000000..3970ffe --- /dev/null +++ b/aleksis/apps/resint/templates/resint/poster/list.html @@ -0,0 +1,77 @@ +{% extends "core/base.html" %} +{% load static i18n %} + +{% block content %} + + + <h1>{% trans "Posters" %}</h1> + <div class="row"> + {% for group in poster_groups %} + <div class="col s12 m6 l4 xl3"> + <div class="card"> + <div class="card-content"> + <div class="card-title">{{ group.name }}</div> + {% with current_poster=group.current_poster %} + {% if current_poster %} + <p class="margin-bottom"> + <i class="material-icons left">picture_as_pdf</i> + <a href="{{ current_poster.pdf.url }}"> + {% blocktrans with week=current_poster.week year=current_poster.year %} + Week {{ week }}/{{ year }} + {% endblocktrans %} + </a> + </p> + <p> + <i class="material-icons left">schedule</i> + {{ current_poster.valid_from }}–{{ current_poster.valid_to }} + </p> + {% else %} + <p> + <i class="material-icons left">picture_as_pdf</i> + {% trans "There is no poster for this week." %} + </p> + {% endif %} + {% endwith %} + </div> + <div class="card-action"> + <a href="{% url "poster_show_current" group.slug %}"> + {% trans "Show current PDF" %} + </a> + </div> + </div> + </div> + {% endfor %} + </div> + <a class="waves-effect waves-light btn green right" href="{% url "poster_upload" %}"> + <i class="material-icons left">add</i> + {% trans "Upload new poster" %} + </a> + <h2>{% trans "All uploaded posters" %}</h2> + <table> + <thead> + <tr> + <th>{% trans "Group" %}</th> + <th>{% trans "Week" %}</th> + <th>{% trans "Valid from ... to" %}</th> + <th>{% trans "Actions" %}</th> + </tr> + </thead> + {% for poster in poster_list %} + <tr> + <td>{{ poster.group }}</td> + <td>{{ poster.week }}/{{ poster.year }}</td> + <td>{{ poster.valid_from }}–{{ poster.valid_to }}</td> + <td> + <a class="btn-flat waves-effect waves-green" href="{{ poster.pdf.url }}" target="_blank"> + <i class="material-icons left">picture_as_pdf</i> {% trans "Show" %} + </a> + <a class="btn-flat red-text waves-effect waves-red" href="{% url "poster_delete" poster.id %}"> + <i class="material-icons left">delete</i> {% trans "Delete" %} + </a> + </td> + </tr> + {% endfor %} + </table> + + +{% endblock %} diff --git a/aleksis/apps/resint/templates/resint/poster/upload.html b/aleksis/apps/resint/templates/resint/poster/upload.html new file mode 100644 index 0000000..9a24ec2 --- /dev/null +++ b/aleksis/apps/resint/templates/resint/poster/upload.html @@ -0,0 +1,14 @@ +{% extends 'core/base.html' %} +{% load material_form i18n %} + +{% block content %} + <h4>{% blocktrans %}Upload poster{% endblocktrans %}</h4> + + <form method="post" enctype="multipart/form-data"> + {% csrf_token %} + {% form form=form %}{% endform %} + <button type="submit" class="waves-effect waves-light btn green"> + <i class="material-icons left">save</i>{% blocktrans %}Upload poster{% endblocktrans %} + </button> + </form> +{% endblock %} diff --git a/aleksis/apps/resint/templates/resint/upload.html b/aleksis/apps/resint/templates/resint/upload.html deleted file mode 100644 index ca07c32..0000000 --- a/aleksis/apps/resint/templates/resint/upload.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "core/base.html" %} -{% load msg_box i18n material_form %} - -{% block page_title %}{% trans "Upload poster" %}{% endblock %} - -{% block content %} - <form method="post" enctype="multipart/form-data"> - {% csrf_token %} - - {% form form=form %}{% endform %} - - <button class="waves-effect waves-light btn green" type="submit"> - <i class="material-icons left">cloud_upload</i> - {% trans "Upload and publish poster" %} - </button> - </form> - - <p> - <a href="{% url 'poster_index' %}" class="waves-effect waves-teal btn-flat">{% trans "Back to overview" %}</a> - </p> -{% endblock %} diff --git a/aleksis/apps/resint/urls.py b/aleksis/apps/resint/urls.py index 2830be5..86c2fc8 100644 --- a/aleksis/apps/resint/urls.py +++ b/aleksis/apps/resint/urls.py @@ -1,11 +1,23 @@ from django.urls import path -from . import views +from .views import ( + PosterCurrentView, + PosterDeleteView, + PosterGroupCreateView, + PosterGroupDeleteView, + PosterGroupEditView, + PosterGroupListView, + PosterListView, + PosterUploadView, +) urlpatterns = [ - path('', views.index, name="poster_index"), - path('upload/', views.upload, name="poster_upload"), - path('delete/<int:id>', views.delete, name="poster_delete"), - path('current.pdf', views.show_current, name="poster_show_current"), - path('<str:msg>', views.index, name="poster_index_msg"), + path("", PosterListView.as_view(), name="poster_index"), + path("upload/", PosterUploadView.as_view(), name="poster_upload"), + path("<int:pk>/delete/", PosterDeleteView.as_view(), name="poster_delete"), + path("<str:slug>.pdf", PosterCurrentView.as_view(), name="poster_show_current"), + path("groups/", PosterGroupListView.as_view(), name="poster_group_list"), + path("groups/create/", PosterGroupCreateView.as_view(), name="create_poster_group"), + path("groups/<int:pk>/edit/", PosterGroupEditView.as_view(), name="edit_poster_group"), + path("groups/<int:pk>/delete/", PosterGroupDeleteView.as_view(), name="delete_poster_group"), ] diff --git a/aleksis/apps/resint/views.py b/aleksis/apps/resint/views.py index d5fea91..4b1be59 100644 --- a/aleksis/apps/resint/views.py +++ b/aleksis/apps/resint/views.py @@ -1,87 +1,96 @@ -import os +from typing import Any, Dict -from django.conf import settings -from django.contrib.auth.decorators import login_required, permission_required -from django.http import FileResponse -from django.shortcuts import get_object_or_404, redirect, render -from django.utils import timezone -from django.utils.translation import gettext_lazy as _ +from django.db.models import QuerySet +from django.http import FileResponse, HttpRequest +from django.urls import reverse_lazy +from django.utils.translation import gettext as _ +from django.views import View +from django.views.generic.detail import SingleObjectMixin +from django.views.generic.list import ListView -from calendarweek import CalendarWeek -from constance import config +from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView -from aleksis.core.util import messages +from .forms import PosterGroupForm, PosterUploadForm +from .models import Poster, PosterGroup -from .forms import PosterUploadForm -from .models import Poster -from .settings import BASE_DIR +class PosterGroupListView(ListView): + """Show a list of all poster groups.""" -@login_required -@permission_required("resint.add_poster") -def upload(request): - if request.method == 'POST': - form = PosterUploadForm(request.POST, request.FILES) - if form.is_valid(): - form.save() + template_name = "resint/group/list.html" + model = PosterGroup - messages.success(request, _("The poster was uploaded successfully.")) - return redirect('poster_index') - else: - form = PosterUploadForm() - return render(request, 'resint/upload.html', { - 'form': form - }) +class PosterGroupCreateView(AdvancedCreateView): + """Create a new poster group.""" -@login_required -@permission_required("resint.add_poster") -def delete(request, id): - poster = get_object_or_404(Poster, pk=id) - poster.delete() + model = PosterGroup + success_url = reverse_lazy("poster_group_list") + template_name = "resint/group/create.html" + success_message = _("The poster group has been saved.") + form_class = PosterGroupForm - messages.success(request, _("The poster was deleted successfully.")) - return redirect("poster_index") +class PosterGroupEditView(AdvancedEditView): + """Edit an existing poster group.""" -@login_required -@permission_required("poster.add_poster") -def index(request): - posters = Poster.objects.all().order_by("calendar_week", "year") - return render(request, 'resint/index.html', {"posters": posters}) + model = PosterGroup + success_url = reverse_lazy("poster_group_list") + template_name = "resint/group/edit.html" + success_message = _("The poster group has been saved.") + form_class = PosterGroupForm -def return_pdf(filename): - """Read and response a PDF file""" +class PosterGroupDeleteView(AdvancedDeleteView): + """Delete a poster group.""" - file = open(filename, "rb") - return FileResponse(file, content_type="application/pdf") + model = PosterGroup + success_url = reverse_lazy("poster_group_list") + success_message = _("The poster group has been deleted.") + template_name = "core/pages/delete.html" -def return_default_pdf(): - """Response the default PDF""" +class PosterListView(ListView): + """Show a list of all uploaded posters.""" - return return_pdf(os.path.join(BASE_DIR, "default.pdf")) + template_name = "resint/poster/list.html" + model = Poster + def get_queryset(self) -> QuerySet: + return Poster.objects.all().order_by("-year", "-week") -def show_current(request): - # Get current date with year and calendar week - current_date = timezone.datetime.now() - cw = CalendarWeek.from_date(current_date) + def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: + context = super().get_context_data(**kwargs) + context["poster_groups"] = PosterGroup.objects.all().order_by("name") + return context - # Create datetime with the friday of the week and the toggle time - friday = cw[int(config.RESINT_NEW_WEEK_DAY)] - friday = timezone.datetime.combine(friday, config.RESINT_NEW_WEEK_TIME) - # Check whether to show the poster of the next week or the current week - if current_date > friday: - cw += 1 +class PosterUploadView(AdvancedCreateView): + """Upload a new poster.""" - # Look for matching PDF in DB - try: - obj = Poster.objects.get(year=cw.year, calendar_week=cw.week) - return return_pdf(os.path.join(settings.MEDIA_ROOT, str(obj.pdf))) + model = Poster + success_url = reverse_lazy("poster_index") + template_name = "resint/poster/upload.html" + success_message = _("The poster has been uploaded.") + form_class = PosterUploadForm - # Or show the default PDF - except Poster.DoesNotExist: - return return_default_pdf() + +class PosterDeleteView(AdvancedDeleteView): + """Delete an uploaded poster.""" + + model = Poster + success_url = reverse_lazy("poster_index") + success_message = _("The poster has been deleted.") + template_name = "core/pages/delete.html" + + +class PosterCurrentView(SingleObjectMixin, View): + """Show the poster which is currently valid.""" + + model = PosterGroup + + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> FileResponse: + group = self.get_object() + current_poster = group.current_poster + file = current_poster.pdf if current_poster else group.default_pdf + return FileResponse(file, content_type="application/pdf") -- GitLab