From df0b26de3650113320eb61538ff716e802d9eab6 Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 29 Dec 2025 09:53:57 +0000 Subject: [PATCH] Add user group archiving functionality with HTMX support --- .../generic/partials/user_group_card.html | 30 +++++++++++ .../templates/generic/user_group_view.html | 53 +++++++------------ generic/urls.py | 5 ++ generic/views.py | 31 +++++++++++ 4 files changed, 86 insertions(+), 33 deletions(-) create mode 100644 generic/templates/generic/partials/user_group_card.html diff --git a/generic/templates/generic/partials/user_group_card.html b/generic/templates/generic/partials/user_group_card.html new file mode 100644 index 00000000..5639d7e9 --- /dev/null +++ b/generic/templates/generic/partials/user_group_card.html @@ -0,0 +1,30 @@ +{% comment %}Partial for a single user group card. Rendered by HTMX after archive toggles.{% endcomment %} +
+
+
+
{{ group.name }}
+ {% if group.description %} +

{{ group.description }}

+ {% endif %} +
+ +
+ Edit + Delete + +
+ {% csrf_token %} + {% if view_all %} + + {% endif %} + {% if group.archive %} + + + {% else %} + + + {% endif %} +
+
+
+
diff --git a/generic/templates/generic/user_group_view.html b/generic/templates/generic/user_group_view.html index d2a0915d..8897e8da 100755 --- a/generic/templates/generic/user_group_view.html +++ b/generic/templates/generic/user_group_view.html @@ -1,38 +1,25 @@ {% extends 'generic/base.html' %} {% block content %} -

User Groups

-

- Create new group -

- {% for group in groups %} -

{{group.name}}

-{% comment %} - - - {% endcomment %} - - -

- {% endfor %} +
+
+

User Groups

+
+ Create new group + {% if view_all %} + View active + {% else %} + View all + {% endif %} +
+
- - - {% if view_all %} - View active - {% else %} - View all - {% endif %} +
+ {% for group in groups %} + {% include 'generic/partials/user_group_card.html' with group=group view_all=view_all %} + {% empty %} +
No groups found.
+ {% endfor %} +
+
{% endblock %} diff --git a/generic/urls.py b/generic/urls.py index de5f3afb..df7b7ac4 100755 --- a/generic/urls.py +++ b/generic/urls.py @@ -201,6 +201,11 @@ urlpatterns = [ views.UserUserGroupDelete.as_view(), name="user_group_delete", ), + path( + "user/group//archive", + views.user_group_toggle_archive, + name="user_group_toggle_archive", + ), path( "user/group/create", views.UserUserGroupCreate.as_view(), diff --git a/generic/views.py b/generic/views.py index b270c1ba..d997e93e 100644 --- a/generic/views.py +++ b/generic/views.py @@ -4919,6 +4919,37 @@ def user_group_view_all(request): ) +@user_is_cid_user_manager +def user_group_toggle_archive(request, pk): + """HTMX endpoint to archive or unarchive a UserUserGroup. + + POST params: + - archive: 'true' or 'false' + - view_all: optional '1' to indicate the caller is viewing the all-groups list + + Returns an HTML fragment for the updated group card, or an empty + response when the card should be removed from the page (e.g. archiving + from the active-only view). + """ + if request.method != "POST": + return HttpResponse(status=405) + + group = get_object_or_404(UserUserGroup, pk=pk) + + archive_val = request.POST.get("archive", "true") + group.archive = True if archive_val == "true" else False + group.save() + + view_all = True if request.POST.get("view_all") == "1" else False + + # If the group is now archived and the caller is not viewing archived + # groups, remove the card from the page by returning an empty fragment. + if group.archive and not view_all: + return HttpResponse("") + + return render(request, "generic/partials/user_group_card.html", {"group": group, "view_all": view_all}) + + @login_required def user_toggle_group(request, user_id, group_id): """Toggle membership of a user in either a UserUserGroup or an auth Group.