Home > OS >  Make permission methods in Django admin more DRY
Make permission methods in Django admin more DRY

Time:03-31

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

CodePudding user response:

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',
    )
  • Related