Согласно нашему обсуждению ниже, мои Шаги:
Переопределить роль с компанией ИЛИ вы можете оставить это на уровне Супер Администратора.http://127.0.0.1:8000/admin/auth/role/
Добавить отдельную таблицу для разрешений со столбцами pk, ID клиента, RoleID, добавить, изменить, просмотреть, удалить, модель, действие (URL)
Добавьте декоратор для каждого действия или модели и проверьте разрешения для этого конкретного действия или модели.
Проверьте роли и разрешения в Admin с помощью общей функции, например, check_role_permissions_admin
// Добавить указанную ниже функцию в отдельный / общий файл функций.
def check_role_permissions_admin(request, url=None):
if not hasattr(request.user,"client"):
return {
'clientwise': False,
'add': False,
'change': False,
'delete': False,
'view': False,
'icon': ''
}
super_admin_role = Role.objects.get(pk=1)
all_roles = request.user.groups.all()
try:
action = Actions.objects.get(
url=url
)
except:
action = None
if super_admin_role in all_roles:
return {
'clientwise': False,
'add': True,
'change': True,
'delete': True,
'view': True,
'icon': str(action.icon) if action else ''
}
// Write Logic here for Role and Permissions of requested action(s)
roles = [group for group in request.user.groups.all()]
permissions = ActionPermissions.objects.filter(
client=request.user.client,
role__in=roles,
action__url=url
)
if permissions.exists():
permobj = permissions[0]
return {
'clientwise': True if permobj.client else False,
'add': True if permobj.add else False,
'change': True if permobj.change else False,
'delete': True if permobj.delete else False,
'view': True if permobj.view else False,
'icon': permobj.action.icon
}
else:
return {
'clientwise': False,
'add': False,
'change': False,
'delete': False,
'view': False,
'icon': ''
}
// Добавлять приведенный ниже код в admin.py, для каждого действия администратора, которое вам необходимо выполнить после // thing и нужно // чтобы убедиться, что аналогичная запись добавлена в разрешения таблицы.
from module.function import check_role_permissions_admin
@admin.register(ConfigRuleMaster)
class ModelMasterAdmin(admin.ModelAdmin):
action_form=CustomActionForm
form = ModelMasterForm
fields=(('title','template'))
list_display=('title','template')
search_fields = ('title','template',)
list_display_links = []
def get_model_perms(self, request):
perms = decorators.check_role_permissions_admin(request, '/admin/lmt/modelmaster/')
perms['clientwise'] = False
return perms
def has_add_permission(self, request):
perms = decorators.check_role_permissions_admin(request, '/admin/lmt/modelmaster/')
return perms['add']
def has_change_permission(self, request, obj=None):
perms = decorators.check_role_permissions_admin(request, '/admin/lmt/modelmaster/')
return perms['change']
Другая работа заключается в обработке действий через декораторы.
Но это очень сырая версия кода, которую я нашел в моем репозитории, вам нужно сделать эту логику на очень высоком уровне, чтобы ваш клиент был доволен и имел полностью защищенный код.