где существует определение таможенного разрешения? - PullRequest
0 голосов
/ 28 июня 2018

В документации указано, что указанный ниже способ может использоваться для предоставления пользовательских разрешений. Декоратор has_perm используется для проверки пользовательских разрешений. Но это не говорит, где эти разрешения определены или что они делают. Разве мне не нужно их определять? Если да, где и как мне это сделать? Спасибо за помощь.

class Task(models.Model):
    ...
    class Meta:
        permissions = (
        ("view_task", "Can see available tasks"),
        ("change_task_status", "Can change the status of tasks"),
        ("close_task", "Can remove a task by setting its status as closed"),
    )

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете создать собственный класс разрешений, я сделал это ниже.

class BaseModelPerm(permissions.DjangoModelPermissions):

    def get_custom_perms(self, method, view):
        app_name = view.model._meta.app_label
        if hasattr(view, 'extra_perms_map'):
            return [app_name+"."+perms for perms in view.extra_perms_map.get(method, [])]
        else:
            return []

    def has_permission(self, request, view):
        perms = self.get_required_permissions(request.method, view.model)
        perms.extend(self.get_custom_perms(request.method, view))
        return (
            request.user and
            (request.user.is_authenticated() or not self.authenticated_users_only) and
            request.user.has_perms(perms)
        )

Выше разрешения может пользователь в любом представлении, как показано ниже

class UserView(viewsets.ModelViewSet):
    """ User model view for the admin user """
    model = User
    permission_classes = (
      permissions.IsAuthenticated,
      accounts_permissions.IsStaffOrVendor,
      accounts_permissions.BaseModelPerm,
    )
    extra_perms_map = {
      'GET': ["can_view_user"]
    }

extra_perms_map - это разрешение, связанное с этим методом.

...