Сделать методы разрешения в администрировании Django более DRY
У меня два ModelAdmin в моем admin.py.
У каждого из них точно такие же методы разрешения (has_view_permission, has_add_permission, has_change_permission, has_delete_permission, has_module_permission).
Есть ли способ, с помощью которого я мог бы сделать это более DRY?
admin.py:
class FirstAdmin(admin.ModelAdmin):
list_display = (
'id',
'title',
'author'
)
def has_view_permission(self, request, obj=None):
if request.user.is_admin:
return True
def has_add_permission(self, request):
if request.user.is_admin:
return True
def has_change_permission(self, request, obj=None):
if request.user.is_admin:
return True
def has_delete_permission(self, request, obj=None):
if request.user.is_admin:
return True
def has_module_permission(self, request):
if request.user.is_admin:
return True
class SecondAdmin(admin.ModelAdmin):
list_display = (
'id',
'category',
)
def has_view_permission(self, request, obj=None):
if request.user.is_admin:
return True
def has_add_permission(self, request):
if request.user.is_admin:
return True
def has_change_permission(self, request, obj=None):
if request.user.is_admin:
return True
def has_delete_permission(self, request, obj=None):
if request.user.is_admin:
return True
def has_module_permission(self,request):
if request.user.is_admin:
return True
Что-то вроде:
class AdminOnly(object): # can also inherit directly from admin.ModelAdmin
"""Access template class"""
def has_view_permission(self, request, obj=None):
return request.user.is_admin
has_add_permission = has_change_permission = \
has_delete_permission = has_module_permission = \
has_view_permission
class FirstAdmin(admin.ModelAdmin, AdminOnly):
list_display = (
'id',
'title',
'author'
)
class SecondAdmin(admin.ModelAdmin, AdminOnly):
list_display = (
'id',
'category',
)
Да, вы можете легко сделать это с помощью миксина класса, мне также удалось сократить тело метода до одной строки.
Вот как:
class AdminUserPermissionMixin:
def has_view_permission(self, request, obj=None):
return request.user.is_admin
def has_add_permission(self, request):
return request.user.is_admin
def has_change_permission(self, request, obj=None):
return request.user.is_admin
def has_delete_permission(self, request, obj=None):
return request.user.is_admin
def has_module_permission(self, request):
return request.user.is_admin
class FirstAdmin(AdminUserPermissionMixin, admin.ModelAdmin):
list_display = (
'id',
'title',
'author'
)
class SecondAdmin(AdminUserPermissionMixin, admin.ModelAdmin):
list_display = (
'id',
'category',
)