From f0fc531aaeab89d3574833f93f7cf0feebfad1ce Mon Sep 17 00:00:00 2001 From: Thomas Merkel <drscream@frubar.net> Date: Mon, 3 Jul 2023 12:33:08 +0200 Subject: [PATCH] Support delete of planned assemblies Allow the user to delete an assembly when the state is planned. Signed-off-by: Thomas Merkel <drscream@frubar.net> --- .../backoffice/assembly-confirm_delete.html | 29 +++++++++++++++++++ .../templates/backoffice/index.html | 8 ++++- src/backoffice/urls.py | 1 + src/backoffice/views/assemblies.py | 13 +++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/backoffice/templates/backoffice/assembly-confirm_delete.html diff --git a/src/backoffice/templates/backoffice/assembly-confirm_delete.html b/src/backoffice/templates/backoffice/assembly-confirm_delete.html new file mode 100644 index 000000000..b444e2bdf --- /dev/null +++ b/src/backoffice/templates/backoffice/assembly-confirm_delete.html @@ -0,0 +1,29 @@ +{% extends 'backoffice/base.html' %} +{% load bootstrap4 %} +{% load humanize %} +{% load i18n %} + +{% block content %} + +<h1>{% trans 'Assembly' %} {{ object.id }}</h1> + +<div class="card mb-3"> + <div class="card-header">Assembly <code>{{ object.assembly_id }}</code></div> + <div class="card-body"> + <p>Slug: <strong>{{ object.slug }}</strong></p> + <p>Name: <strong>{{ object.name }}</strong></p> + </div> +</div> + +<div class="card mb-3 border-danger"> + <div class="card-header bg-danger text-white">CONFIRM</div> + <div class="card-body"> + <form method="POST" action="{% url 'backoffice:assembly-delete' pk=object.id %}"> + {% csrf_token %} + <button type="submit" class="btn btn-danger">yes, nuke it</button> + <a href="{% url 'backoffice:assembly' pk=object.id %}" class="btn btn-outline-primary">no, back to safety</a> + </form> + </div> +</div> + +{% endblock %} diff --git a/src/backoffice/templates/backoffice/index.html b/src/backoffice/templates/backoffice/index.html index 47e05f8ea..ac96f820f 100644 --- a/src/backoffice/templates/backoffice/index.html +++ b/src/backoffice/templates/backoffice/index.html @@ -21,6 +21,7 @@ <tr> <th>{% trans "assembly_name" %}</th> <th>{% trans "assembly_state" %}</th> + <th> </th> </tr> </thead> <tbody> @@ -31,9 +32,14 @@ {{ assembly.get_state_assembly_display }} {% if assembly.state_assembly == 'planned' %}<span class="text-danger font-weight-bold" title="{% trans "Assembly__state_assembly-planned__hint" %}">⚠</span>{% endif %} </td> + <td> + {% if assembly.state_assembly == 'planned' %} + <a class="btn btn-sm btn-danger" href="{% url 'backoffice:assembly-delete' pk=assembly.pk %}">{% trans 'Delete' %}</a> + {% endif %} + </td> </tr> {% empty %} - <tr><td colspan="2">:-(</td></tr> + <tr><td colspan="3">:-(</td></tr> {% endfor %} </tbody> </table> diff --git a/src/backoffice/urls.py b/src/backoffice/urls.py index 039086b4d..0fe90766e 100644 --- a/src/backoffice/urls.py +++ b/src/backoffice/urls.py @@ -62,6 +62,7 @@ urlpatterns = [ path('assembly/<uuid:pk>/members/add', assemblies.MembersAddView.as_view(), name='assembly-members-add'), path('assembly/<uuid:pk>/members/edit/<str:uname>', assemblies.MembersEditView.as_view(), name='assembly-members-edit'), path('assembly/<uuid:pk>/vouchers', assemblies.VouchersView.as_view(), name='assembly-vouchers'), + path('assembly/<uuid:pk>/delete', assemblies.AssemblyDeleteView.as_view(), name='assembly-delete'), path('assembly/<uuid:assembly>/auth', assemblies.AuthView.as_view(), name='assembly-auth'), path('assembly/<uuid:assembly>/auth/app/<int:pk>', assemblies.AuthAppView.as_view(), name='assembly-auth-app'), diff --git a/src/backoffice/views/assemblies.py b/src/backoffice/views/assemblies.py index 01399aada..f9eb25e76 100644 --- a/src/backoffice/views/assemblies.py +++ b/src/backoffice/views/assemblies.py @@ -487,6 +487,19 @@ class AssemblyView(AssemblyMixin, TemplateView): require_conference = True template_name = 'backoffice/assembly_detail.html' +class AssemblyDeleteView(AssemblyMixin, DeleteView): + assembly_management = True + model = Assembly + template_name = 'backoffice/assembly-confirm_delete.html' + + def get_object(self, *args, **kwargs): + obj = super().get_object(*args, **kwargs) + if obj.state_assembly != Assembly.State.PLANNED: + raise PermissionDenied() + return obj + + def get_success_url(self, *args, **kwargs): + return reverse('backoffice:index') class AssemblyRoomView(AssemblyMixin, UpdateView): model = Room -- GitLab