Проверка пользовательских разрешений Django Rest Framework - PullRequest
0 голосов
/ 20 октября 2018

У меня есть собственный ViewSet, который делает составные запросы и обновления базы данных.Я хочу установить разные уровни разрешений, чтобы я мог разрешить некоторым пользователям отправлять GET метод в представлении, а некоторым другим пользователям разрешать запрашивать POST и PUT методов.

В документации, которую я нашел , все разрешения считаются глобальными для представления класса, поэтому я не знаю, как применить некоторые разрешения к listметод и некоторые другие права доступа к create и update методам ViewSet.

Это основной код ViewSet:

class ReservationCompositionViewSet(viewsets.ViewSet):

    def list(self, request, pk):
            reservation = models.Reservation.objects.filter(booking=pk).order_by('timestamp').last()
            if reservation == None:
                raise CustomValidation(_('There is not such Reservation: {}'.format(pk)), 'booking', status.HTTP_400_BAD_REQUEST)

            result_set = serializers.ReservationSerializer(reservation).data

            result_set['pax'] = self.get_reservation_people(reservation)
            result_set['itinerary'] = self.get_reservation_composition(reservation)

            return Response(result_set)
    ...

    def create(self, request):
        reservation_data = request.data
        user = request.user

        reservation = models.Reservation()
        reservation.booking = reservation_data['booking']
        reservation.agency = models.Agency.objects.get(id=reservation_data['agency'])
        reservation.comment = reservation_data.pop('comment', None)
        reservation.status = reservation_data.pop('status', 'UNCONFIRMED')
        if reservation.status == None:
            reservation.status = 'UNCONFIRMED'
        reservation.arrival_date = reservation_data['arrival_date']
        reservation.departure_date = reservation_data['departure_date']
        reservation.confirmation = reservation_data.pop('confirmation', None)
        reservation.is_invoiced = reservation_data['is_invoiced']
        reservation.user = user

        reservation.save()

        reservation_to_return = serializers.ReservationSerializer(reservation).data
        reservation_to_return['pax'] = self.save_reservation_people(reservation, reservation_data.pop('pax'))
        reservation_to_return['itinerary'] = self.save_reservation_components(reservation, reservation_data.pop('itinerary'))

        return Response(reservation_to_return)

    def update(self, request, pk):
        reservation_data = request.data
        user = request.user

        reservation = self.save_reservation(reservation_data, user, pk)

        reservation_to_return = serializers.ReservationSerializer(reservation).data
        reservation_to_return['pax'] = self.save_reservation_people(reservation, reservation_data.pop('pax'))
        reservation_to_return['itinerary'] = self.save_reservation_components(reservation, reservation_data.pop('itinerary'))

        return Response(reservation_to_return)
        ...

Я хочу проверить, что пользователь имеетРазрешение can_view при вызове метода list() и разрешение can_edit при вызове методов create() или update().

1 Ответ

0 голосов
/ 20 октября 2018

Методы list(), create() и update() набора просмотра сопоставлены с соответствующими методами HTTP маршрутизатором.

Таким образом, вы можете создать собственное разрешение, которое проверяеттип HTTP-метода для определения выполняемого действия.

Например:

from rest_framework import permissions

class ReservationCompositionPermission(permissions.BasePermission):

    def has_permission(self, request, view):
        if request.method == 'GET':
            return request.user.has_perm('can_view')
        elif request.method in ('POST', 'PUT', 'PATCH'):
            return request.user.has_perm('can_edit')
        return False

И указать это в наборе:

class ReservationCompositionViewSet(viewsets.ViewSet):
    permission_classes = (ReservationCompositionPermission, )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...