NewToJS
NewToJS

Reputation: 2101

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

Upvotes: 0

Views: 907

Answers (1)

jabez
jabez

Reputation: 906

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

Upvotes: 1

Related Questions