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:
@@ -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')}),
|
||||
|
||||
Reference in New Issue
Block a user