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>&nbsp;</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