admin: полная матрица доступа групп в админке

Кнопка «Матрица доступа» на списке групп (unfold actions_list) открывает
сетку: строки — разделы портала, колонки — все группы, галочки просмотра.
Сохранение через apply_full_access_matrix (CUD не трогает — они на карточке
группы). Логика переиспользована из user_groups_portal. Смоук-тесты рендера
и сохранения.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-09-21 15:33:25 +03:00
parent 385fa07eef
commit 7074244479
4 changed files with 141 additions and 0 deletions
+22
View File
@@ -8,6 +8,7 @@ from django.utils.html import format_html
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
from unfold.admin import ModelAdmin, TabularInline
from unfold.decorators import action
from core.models import Directory, PortalAccess
from core.security import filter_portal_permissions_for_user, log_security_event
@@ -491,6 +492,27 @@ class GroupAdmin(ModelAdmin):
filter_horizontal = ('permissions',)
search_fields = ('name',)
list_display = ('name', 'active_display', 'description_display', 'portal_matrix_link')
actions_list = ['access_matrix_action']
@action(description=_('Матрица доступа'), url_path='access-matrix')
def access_matrix_action(self, request):
from django.core.exceptions import PermissionDenied
from django.shortcuts import redirect
from django.template.response import TemplateResponse
from core.user_groups_portal import apply_full_access_matrix, full_access_matrix
if not request.user.has_perm('auth.change_group'):
raise PermissionDenied
if request.method == 'POST':
apply_full_access_matrix(request.POST)
self.message_user(request, _('Матрица доступа сохранена.'), level=messages.SUCCESS)
return redirect(request.path)
ctx = {
**self.admin_site.each_context(request),
'title': _('Матрица доступа'),
**full_access_matrix(),
}
return TemplateResponse(request, 'admin/group_access_matrix.html', ctx)
fieldsets = (
(None, {'fields': ('name', 'description', 'is_active')}),