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