Иначе их обычно слишком много и непонятно какие в реальности имеют смысл.
Просто перегружаются Admin-классы и формы в них, где фильтруется ModelForm.queryset у нужного поля формы.
admin.pyfrom django.contrib.auth.models import User, Group, Permission
from django.contrib.auth.admin import UserAdmin, GroupAdmin
from django.contrib.auth.forms import UserChangeForm
from django.db.models import Q
from django import forms
USED_PERMS = [
'reports.add_report',
'reports.change_report',
'app2.custom_perm',
]
def qs_perm_filter(qs):
ups = [up.split('.') for up in USED_PERMS]
q_expressions = [Q(content_type__app_label=up[0], codename=up[1]) for up in ups]
return qs.filter(reduce(operator.or_, q_expressions))
# наследуем форму (у меня там ещё много помимо этого), также см. нужную model
class UserProfileChangeForm(UserChangeForm):
class Meta:
model = UserProfile
fields = '__all__'
def __init__(self, *args, **kwargs):
super(UserProfileChangeForm, self).__init__(*args, **kwargs)
f = self.fields.get('user_permissions')
if f is not None:
f.queryset = qs_perm_filter(f.queryset)
# наследуем кастомный UserAdmin
class UserProfileAdmin(UserAdmin):
...
form = UserProfileChangeForm
...
# показываем профиль, родной User не показываем
admin.site.unregister(User)
admin.site.register(UserProfile, UserProfileAdmin)
# для групп тоже аналогично всё
class MyGroupAdminForm(forms.ModelForm):
class Meta:
model = Group
fields = '__all__'
def __init__(self, *args, **kwargs):
super(MyGroupAdminForm, self).__init__(*args, **kwargs)
f = self.fields.get('permissions')
if f is not None:
f.queryset = qs_perm_filter(f.queryset)
class MyGroupAdmin(GroupAdmin):
form = MyGroupAdminForm
admin.site.unregister(Group)
admin.site.register(Group, MyGroupAdmin)
Также для бонуса - вынос пермишенов пользователя в таблицу с юзерами в админке. Из списка видно кто и каким правами обладает, там все группы, персональные права, указание на доступ к админке и т.д:
class UserProfileAdmin(UserAdmin):
...
list_display = (..., 'custom_groups', ...)
...
# список групп юзера через запятую, указание что персонал итд
def custom_groups(self, obj):
cg = [g.name for g in obj.groups.all()]
if obj.is_superuser:
cg.insert(0, '[all perms]')
if obj.is_staff:
cg.insert(0, '[staff]')
if obj.user_permissions.count() > 0:
listperm = ',\n'.join(up.__str__() for up in obj.user_permissions.all())
cg.append('[Personal perms]' % listperm)
return ', '.join(cg)
custom_groups.short_description = 'User perms'
custom_groups.allow_tags = True
Комментариев нет:
Отправить комментарий