Сделать методы разрешения в администрировании 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',
    )
Вернуться на верх