From b30d86a21d6955eeb968c8b83d9953618663c9ec Mon Sep 17 00:00:00 2001 From: Dirk Alders Date: Mon, 21 Oct 2024 20:15:20 +0200 Subject: [PATCH] Admin page for Piki pages improved --- pages/admin.py | 37 ++++++++++++++++++++++++++-- pages/forms.py | 17 ++++++++++--- pages/templates/admin/set_group.html | 22 +++++++++++++++++ pages/templates/admin/set_perms.html | 22 +++++++++++++++++ 4 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 pages/templates/admin/set_group.html create mode 100644 pages/templates/admin/set_perms.html diff --git a/pages/admin.py b/pages/admin.py index 1c30807..cbd29ce 100644 --- a/pages/admin.py +++ b/pages/admin.py @@ -2,18 +2,51 @@ from django.contrib import admin from simple_history.admin import SimpleHistoryAdmin from .models import PikiPage +from .forms import GroupForm, PermForm + +from django.shortcuts import render +from django.http import HttpResponseRedirect +from django.contrib.auth.models import Group class PikiPageAdmin(SimpleHistoryAdmin): - list_display = ('rel_path', 'tags', 'deleted') + list_display = ('rel_path', 'tags', 'group', 'other_perms_read', 'other_perms_write') history_list_display = ('rel_path', 'tags', 'deleted') search_fields = ('rel_path', 'tags', ) list_filter = ( - ('deleted', admin.BooleanFieldListFilter), + ('group', admin.RelatedFieldListFilter), ('other_perms_read', admin.BooleanFieldListFilter), ('other_perms_write', admin.BooleanFieldListFilter), ) ordering = ["rel_path"] + actions = ["remove_access_others", "set_group", "set_perms", ] + + @admin.action(description="Remove access for others") + def remove_access_others(self, request, query_set): + query_set.update(other_perms_read=False, other_perms_write=False) + + @admin.action(description="Set group for pages") + def set_group(self, request, queryset): + if 'apply' in request.POST: + if request.POST.get("group"): + group = Group.objects.get(id=request.POST.get("group")) + else: + group = None + queryset.update(group=group) + self.message_user(request, "Changed group for {} pages".format(queryset.count())) + return HttpResponseRedirect(request.get_full_path()) + return render(request, 'admin/set_group.html', context={'pages': queryset, 'form': GroupForm()}) + + @admin.action(description="Set permissions") + def set_perms(self, request, queryset): + if 'apply' in request.POST: + keys = ["owner_perms_read", "owner_perms_write", "group_perms_read", "group_perms_write", "other_perms_read", "other_perms_write"] + perms = {key: key in request.POST for key in keys} + queryset.update(**perms) + self.message_user(request, "Changed permissions for {} pages".format(queryset.count())) + return HttpResponseRedirect(request.get_full_path()) + return render(request, 'admin/set_perms.html', context={'pages': queryset, 'form': PermForm()}) +admin.site.disable_action('delete_selected') admin.site.register(PikiPage, PikiPageAdmin) diff --git a/pages/forms.py b/pages/forms.py index b192ddd..cf0de9e 100644 --- a/pages/forms.py +++ b/pages/forms.py @@ -1,7 +1,5 @@ -from typing import Any, Mapping from django import forms -from django.forms.renderers import BaseRenderer -from django.forms.utils import ErrorList +from django.contrib.auth.models import Group from .models import PikiPage @@ -17,6 +15,19 @@ class EditForm(forms.ModelForm): "other_perms_read", "other_perms_write",] +class GroupForm(forms.Form): + group = forms.ModelChoiceField(queryset=Group.objects.all(), required=False) + + +class PermForm(forms.Form): + owner_perms_read = forms.BooleanField(initial=True, required=False, label="Read (owner)") + owner_perms_write = forms.BooleanField(initial=True, required=False, label="Write (owner)") + group_perms_read = forms.BooleanField(initial=True, required=False, label="Read (group)") + group_perms_write = forms.BooleanField(initial=True, required=False, label="Write (group)") + other_perms_read = forms.BooleanField(initial=True, required=False, label="Read (other)") + other_perms_write = forms.BooleanField(initial=False, required=False, label="Write (other)") + + class RenameForm(forms.Form): # Note that it is not inheriting from forms.ModelForm page_name = forms.CharField(max_length=500, label="Change the page name:", required=True) diff --git a/pages/templates/admin/set_group.html b/pages/templates/admin/set_group.html new file mode 100644 index 0000000..54f709f --- /dev/null +++ b/pages/templates/admin/set_group.html @@ -0,0 +1,22 @@ +{% extends "admin/base_site.html" %} + +{% block content %} +
+ {% csrf_token %} +

+Choose a group for the following pages: +

+ + + {{ form.as_p }} + + +
+{% endblock %} \ No newline at end of file diff --git a/pages/templates/admin/set_perms.html b/pages/templates/admin/set_perms.html new file mode 100644 index 0000000..7b35b9f --- /dev/null +++ b/pages/templates/admin/set_perms.html @@ -0,0 +1,22 @@ +{% extends "admin/base_site.html" %} + +{% block content %} +
+ {% csrf_token %} +

+Choose a group for the following pages: +

+ + + {{ form.as_p }} + + +
+{% endblock %} \ No newline at end of file