Make permission methods in Django admin more DRY
I have two ModelAdmins in my admin.py.
Each have the exact same permission methods (has_view_permission, has_add_permission, has_change_permission, has_delete_permission, has_module_permission).
Is there a way I could make this more 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
Something like:
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',
)
Yes, you can easily do that using a class mixin, I've also managed to reduce the method body to one line.
Here's how:
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',
)