]> git.0d.be Git - django-panik-agendas.git/commitdiff
add category settings/management page
authorFrédéric Péters <fpeters@0d.be>
Thu, 15 Feb 2024 17:02:29 +0000 (18:02 +0100)
committerFrédéric Péters <fpeters@0d.be>
Thu, 15 Feb 2024 17:05:02 +0000 (18:05 +0100)
agendas/migrations/0009_agenda_enabled.py [new file with mode: 0644]
agendas/models.py
agendas/templates/agendas/agenda_form.html [new file with mode: 0644]
agendas/templates/agendas/agendas.html
agendas/templates/agendas/category_form.html [new file with mode: 0644]
agendas/urls.py
agendas/views.py

diff --git a/agendas/migrations/0009_agenda_enabled.py b/agendas/migrations/0009_agenda_enabled.py
new file mode 100644 (file)
index 0000000..63028ce
--- /dev/null
@@ -0,0 +1,17 @@
+# Generated by Django 3.2.19 on 2024-02-15 17:49
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ('agendas', '0008_auto_20210324_0859'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='agenda',
+            name='enabled',
+            field=models.BooleanField(default=True),
+        ),
+    ]
index ff6c7c8d656105acfdd7c3e10de633ca29f5a08a..d531b2aeb75048554f7ef936bda2b30653f1eafd 100644 (file)
@@ -42,6 +42,7 @@ class Agenda(models.Model):
     last_update_timestamp = models.DateTimeField(auto_now=True, null=True)
     category = models.ForeignKey(Category, null=True, blank=True, on_delete=models.SET_NULL)
     category_order = models.PositiveIntegerField(default=0)
+    enabled = models.BooleanField(default=True)
 
     def __str__(self):
         return self.label
diff --git a/agendas/templates/agendas/agenda_form.html b/agendas/templates/agendas/agenda_form.html
new file mode 100644 (file)
index 0000000..959b808
--- /dev/null
@@ -0,0 +1,17 @@
+{% extends "base.html" %}
+{% load gadjo i18n %}
+
+{% block appbar %}
+  <h2>{% trans "New Agenda Line" %}</h2>
+{% endblock %}
+
+{% block content %}
+  <form method="post">
+    {% csrf_token %}
+    {{ form|with_template }}
+    <div class="buttons">
+      <button class="submit-button">{% trans "Add" %}</button>
+      <a class="cancel" href=".">{% trans "Cancel" %}</a>
+    </div>
+  </form>
+{% endblock %}
index bc1f885b96b10f7817f73058b738ad31c6e9868d..9d30cdcd9a99cbdbb0567af8dd7dfd9ae3a25644 100644 (file)
   <link href="{{ STATIC_URL }}css/panik-agendas.css" rel="stylesheet" type="text/css"/>
 {% endblock %}
 
+{% block more-user-links %}
+  {{ block.super }}
+  {% if user_has_perm %}
+    <a style="float: right" data-popup class="pk-button" href="settings/">{% trans "Settings" %}</a>
+  {% endif %}
+{% endblock %}
+
 {% block appbar %}
   <h2><a href="./">Agendas - {{ object }}</a></h2>
   <span class="actions">
diff --git a/agendas/templates/agendas/category_form.html b/agendas/templates/agendas/category_form.html
new file mode 100644 (file)
index 0000000..c7c5aa5
--- /dev/null
@@ -0,0 +1,27 @@
+{% extends "base.html" %}
+{% load gadjo i18n %}
+
+{% block appbar %}
+  <h2>{% trans "Agendas Settings" %}</h2>
+{% endblock %}
+
+{% block content %}
+  <form method="post">
+    {% csrf_token %}
+    {{ form|with_template }}
+
+    <ul class="objects-list single-links">
+      {% for agenda in lines %}
+        <li><a href="">{{ agenda }}</a>
+          <a class="delete" href="{% url 'agendas-disable-line' cat_slug=object.slug pk=agenda.id %}">{% trans "disable" %}</a>
+        </li>
+      {% endfor %}
+      <li><a data-popup href="{% url 'agendas-create-line' cat_slug=object.slug %}">+ {% trans "Add agenda line" %}</a></li>
+    </ul>
+
+    <div class="buttons">
+      <button class="submit-button">{% trans "Save" %}</button>
+      <a class="cancel" href="..">{% trans "Cancel" %}</a>
+    </div>
+  </form>
+{% endblock %}
index 656a1113d52591f58ec7352ab7048acae0dec7fa..1ce6b3a1a252ac1e45859e0ed88d10f9d9d0632d 100644 (file)
@@ -14,4 +14,15 @@ urlpatterns = [
     re_path(
         r'^(?P<cat_slug>[\w,-]+)/new/$', views.CreateBookingView.as_view(), name='agendas-create-booking'
     ),
+    re_path(r'^(?P<slug>[\w,-]+)/settings/$', views.AgendasSettingsView.as_view(), name='agendas-settings'),
+    re_path(
+        r'^(?P<cat_slug>[\w,-]+)/settings/disable-agenda/(?P<pk>[\d+])/$',
+        views.DisableAgendaLineView.as_view(),
+        name='agendas-disable-line',
+    ),
+    re_path(
+        r'^(?P<cat_slug>[\w,-]+)/settings/add-agenda/$',
+        views.CreateAgendaLineView.as_view(),
+        name='agendas-create-line',
+    ),
 ]
index 7bc94ac45c8a591361937f9e147a4aa332183d02..44f2b04b4bfa904aa0836cd6950e70e8a8ff8f93 100644 (file)
@@ -2,10 +2,13 @@ import datetime
 import logging
 import math
 
+from django.contrib import messages
 from django.core.exceptions import PermissionDenied
 from django.http import HttpResponseRedirect
 from django.urls import reverse
 from django.utils.safestring import mark_safe
+from django.utils.text import slugify
+from django.utils.translation import gettext_lazy as _
 from django.views.generic.base import TemplateView
 from django.views.generic.detail import DetailView
 from django.views.generic.edit import CreateView, UpdateView
@@ -64,7 +67,7 @@ class Agendas(DetailView):
             day_end = day + datetime.timedelta(days=1, hours=4)
 
             agenda_lines = []
-            for agenda in category.agenda_set.all():
+            for agenda in category.agenda_set.filter(enabled=True):
                 bookings_dict = {}
                 for booking in bookings:
                     if booking.agenda_id != agenda.pk:
@@ -218,3 +221,68 @@ class BookingPopupView(BookingMixin, UpdateView):
     def form_valid(self, form):
         logger.info('modified booking %s (%s)', form.instance, form.instance.start_datetime)
         return super().form_valid(form)
+
+
+class AgendasSettingsView(UpdateView):
+    model = Category
+    fields = ['label', 'label_presets']
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context['lines'] = self.get_object().agenda_set.filter(enabled=True)
+        return context
+
+    def get_form(self, *args, **kwargs):
+        if not self.request.user.has_perm('agendas.add_booking'):
+            raise PermissionDenied()
+        return super().get_form(*args, **kwargs)
+
+    def form_valid(self, form):
+        logger.info('modified agendas settings %s', form.instance)
+        return super().form_valid(form)
+
+
+class CreateAgendaLineView(CreateView):
+    model = Agenda
+    fields = ['label']
+
+    def get_form(self, *args, **kwargs):
+        if not self.request.user.has_perm('agendas.add_booking'):
+            raise PermissionDenied()
+        return super().get_form(*args, **kwargs)
+
+    def form_valid(self, form):
+        category = Category.objects.get(slug=self.kwargs['cat_slug'])
+        existing_agenda = category.agenda_set.filter(label=form.instance.label).first()
+        if existing_agenda:
+            existing_agenda.enabled = True
+            form.instance = existing_agenda
+            logger.info('enabled agenda line %s', form.instance)
+        else:
+            form.instance.category = category
+            form.instance.slug = slugify(form.instance.label)
+            logger.info('added agenda line %s', form.instance)
+        form.instance.save()
+        return super().form_valid(form)
+
+    def get_success_url(self):
+        return reverse('agendas-view', kwargs={'slug': self.kwargs['cat_slug']})
+
+
+class DisableAgendaLineView(DetailView):
+    model = Agenda
+
+    def get(self, request, *args, **kwargs):
+        if not request.user.has_perm('agendas.add_booking'):
+            raise PermissionDenied()
+        agenda = self.get_object()
+        agenda.enabled = False
+        agenda.save()
+        logger.info('disabled agenda line %s', agenda)
+        messages.success(
+            request,
+            _(
+                'This agenda line has been disabled. (you\'ll get it back if you add an agenda with the same name)'
+            ),
+        )
+        return HttpResponseRedirect(reverse('agendas-view', kwargs={'slug': agenda.category.slug}))