From 1a7ec0e724f80ad8678d6f5d5ea7ce6c564421fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jean-S=C3=A9bastien=20Caux?= <git@jscaux.org>
Date: Mon, 30 Jan 2023 19:22:45 +0100
Subject: [PATCH] HTMX-ize forum permissions rendering

---
 .../forums/_hx_forum_permissions.html         | 19 +++++++
 .../forums/templates/forums/forum_detail.html | 54 +++++++++----------
 scipost_django/forums/urls.py                 | 51 +++++++++++++-----
 scipost_django/forums/views.py                | 23 ++++----
 4 files changed, 95 insertions(+), 52 deletions(-)
 create mode 100644 scipost_django/forums/templates/forums/_hx_forum_permissions.html

diff --git a/scipost_django/forums/templates/forums/_hx_forum_permissions.html b/scipost_django/forums/templates/forums/_hx_forum_permissions.html
new file mode 100644
index 000000000..8669c8863
--- /dev/null
+++ b/scipost_django/forums/templates/forums/_hx_forum_permissions.html
@@ -0,0 +1,19 @@
+{% load guardian_tags %}
+
+<p><a href="{% url 'forums:forum_permissions' slug=forum.slug %}">Grant permissions to a new group</a></p>
+<p>Groups with permissions [click on the Group's name to manage permissions]:</p>
+<ul>
+  {% for group in groups_with_perms %}
+    {% get_obj_perms group for forum as "group_perms" %}
+    <li><a href="{% url 'forums:forum_permissions' slug=forum.slug group_id=group.id %}">{{ group.name }}</a>: {{ group_perms }}</li>
+  {% empty %}
+    <li>No group has permissions on this Forum</li>
+  {% endfor %}
+</ul>
+
+<p>Users with permissions:</p>
+<ul>
+  {% for u, u_perms in users_with_perms.items %}
+    <li>{{ u.first_name }} {{ u.last_name }}: {{ u_perms }}</li>
+  {% endfor %}
+</ul>
diff --git a/scipost_django/forums/templates/forums/forum_detail.html b/scipost_django/forums/templates/forums/forum_detail.html
index 3d88832b9..e14804c30 100644
--- a/scipost_django/forums/templates/forums/forum_detail.html
+++ b/scipost_django/forums/templates/forums/forum_detail.html
@@ -1,12 +1,9 @@
 {% extends 'forums/base.html' %}
 
 {% load bootstrap %}
-{% load guardian_tags %}
 {% load automarkup %}
-
 {% load scipost_extras %}
 
-
 {% block breadcrumb_items %}
   {{ block.super }}
   <span class="breadcrumb-item">{% if forum.meeting %}Meeting{% else %}Forum{% endif %} Details</span>
@@ -14,7 +11,6 @@
 
 {% block pagetitle %}: {% if forum.meeting %}Meeting{% else %}Forum{% endif %} details{% endblock pagetitle %}
 
-
 {% block content %}
 
   {% with can_add_forum=perms.forums.add_forum can_change_forum=perms.forums.change_forum meeting=forum.meeting %}
@@ -63,32 +59,30 @@
 	      {% endif %}
 	    </ul>
 
-	    <div class="card">
-	      <div class="card-header">
-		Permissions on this {% if meeting %}Meeting{% else %}Forum{% endif %} instance
-		<button class="btn btn-link small" data-bs-toggle="collapse" data-bs-target="#permissionsCard">
-		  View/manage</button>
-	      </div>
-	      <div class="card-body collapse" id="permissionsCard">
-		<p><a href="{% url 'forums:forum_permissions' slug=forum.slug %}">Grant permissions to a new group</a></p>
-		<p>Groups with permissions [click on the Group's name to manage permissions]:</p>
-		<ul>
-		  {% for group in groups_with_perms %}
-		    {% get_obj_perms group for forum as "group_perms" %}
-		    <li><a href="{% url 'forums:forum_permissions' slug=forum.slug group_id=group.id %}">{{ group.name }}</a>: {{ group_perms }}</li>
-		  {% empty %}
-		    <li>No group has permissions on this Forum</li>
-		  {% endfor %}
-		</ul>
-
-		<p>Users with permissions:</p>
-		<ul>
-		  {% for u, u_perms in users_with_perms.items %}
-		    <li>{{ u.first_name }} {{ u.last_name }}: {{ u_perms }}</li>
-		  {% endfor %}
-		</ul>
-	      </div>
-	    </div>
+	    {% if can_change_forum %}
+	      <details id="forum-permissions-details"
+		       class="border border-danger bg-danger bg-opacity-10 m-2">
+		<summary class="bg-danger bg-opacity-10 p-2">
+		  Permissions on this {% if forum.meeting %}Meeting{% else %}Forum{% endif %} instance (view/manage)
+		  <span id="forum-permissions-details-contents-indicator" class="htmx-indicator p-2">
+		    <button class="btn btn-warning" type="button" disabled>
+		      <strong>Loading...</strong>
+		      <div class="spinner-grow spinner-grow-sm ms-2" role="status" aria-hidden="true"></div>
+		    </button>
+		  </span>
+		</summary>
+		<div id="forum-permissions-details-contents"
+		     class="p-2"
+		     hx-get="{% url 'forums:_hx_forum_permissions' slug=forum.slug %}"
+		     hx-trigger="toggle once from:#forum-permissions-details"
+		     hx-target="#forum-permissions-details-contents"
+		     hx-indicator="#forum-permissions-details-contents-indicator"
+		>
+		</div>
+
+	      </details>
+	    {% endif %}
+
 	  </div>
 	{% endif %}
       </div>
diff --git a/scipost_django/forums/urls.py b/scipost_django/forums/urls.py
index 1da90687e..fcc270eb9 100644
--- a/scipost_django/forums/urls.py
+++ b/scipost_django/forums/urls.py
@@ -2,7 +2,7 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.urls import path
+from django.urls import path, include
 
 from . import views
 
@@ -21,18 +21,45 @@ urlpatterns = [
         name="meeting_create",
     ),
     path("meeting/add/", views.MeetingCreateView.as_view(), name="meeting_create"),
-    path("<slug:slug>/", views.ForumDetailView.as_view(), name="forum_detail"),
-    path("<slug:slug>/update/", views.ForumUpdateView.as_view(), name="forum_update"),
-    path("<slug:slug>/delete/", views.ForumDeleteView.as_view(), name="forum_delete"),
     path(
-        "<slug:slug>/permissions/<int:group_id>/",
-        views.ForumPermissionsView.as_view(),
-        name="forum_permissions",
-    ),
-    path(
-        "<slug:slug>/permissions/",
-        views.ForumPermissionsView.as_view(),
-        name="forum_permissions",
+        "<slug:slug>/",
+        include([
+            path(
+                "",
+                views.ForumDetailView.as_view(),
+                name="forum_detail",
+            ),
+            path(
+                "update/",
+                views.ForumUpdateView.as_view(),
+                name="forum_update",
+            ),
+            path(
+                "delete/",
+                views.ForumDeleteView.as_view(),
+                name="forum_delete",
+            ),
+            path(
+                "permissions/",
+                include([
+                    path(
+                        "",
+                        views.ForumPermissionsView.as_view(),
+                        name="forum_permissions",
+                    ),
+                    path(
+                        "<int:group_id>/",
+                        views.ForumPermissionsView.as_view(),
+                        name="forum_permissions",
+                    ),
+                    path(
+                        "_hx_forum_permissions/",
+                        views.HXForumPermissionsView.as_view(),
+                        name="_hx_forum_permissions",
+                    ),
+                ]),
+            ),
+        ]),
     ),
     path("", views.ForumListView.as_view(), name="forums"),
     path(
diff --git a/scipost_django/forums/views.py b/scipost_django/forums/views.py
index 8802801a6..32de8524c 100644
--- a/scipost_django/forums/views.py
+++ b/scipost_django/forums/views.py
@@ -142,18 +142,21 @@ class ForumDetailView(PermissionRequiredMixin, DetailView):
         )
         return qs
 
+
+class HXForumPermissionsView(PermissionRequiredMixin, DetailView):
+    permission_required = "forums.add_forum"
+    model = Forum
+    template_name = "forums/_hx_forum_permissions.html"
+
     def get_context_data(self, *args, **kwargs):
         context = super().get_context_data(*args, **kwargs)
-        if self.request.user.has_perm("forums.add_forum"):
-            context["groups_with_perms"] = get_groups_with_perms(self.object).order_by(
-                "name"
-            )
-            context["users_with_perms"] = get_users_with_perms(
-                self.object,
-                attach_perms=True,
-            )
-            context["group_permissions_form"] = ForumGroupPermissionsForm()
-            context["organization_permissions_form"] = ForumOrganizationPermissionsForm()
+        context["groups_with_perms"] = get_groups_with_perms(self.object).order_by(
+            "name"
+        )
+        context["users_with_perms"] = get_users_with_perms(
+            self.object,
+            attach_perms=True,
+        )
         return context
 
 
-- 
GitLab