Не удается получить Django Rest Framework ViewSet для распознавания разрешения пользователя - PullRequest
0 голосов
/ 21 октября 2018

У меня есть модель Reservation с двумя пользовательскими разрешениями reservation_can_view и reservation_can_edit:

class Reservation(models.Model):
    UNCONFIRMED = 'UNCONFIRMED'
    CONFIRMED = 'CONFIRMED'
    CANCELED = 'CANCELED'
    NO_SHOW = 'NO SHOW'
    GO_SHOW = 'GO SHOW'
    STATUS_CHOICES = (
        (UNCONFIRMED, _('Unconfirmed')),
        (CONFIRMED, _('Confirmed')),
        (CANCELED, _('Canceled')),
        (NO_SHOW, _('No show')),
        (GO_SHOW, _('Go show')),
    )

    booking = models.CharField(max_length=15, verbose_name=_('Booking'))
    agency = models.ForeignKey(Agency, on_delete=models.PROTECT, related_name='reservations', verbose_name=_('Agency'))
    comment = models.TextField(null=True, blank=True, verbose_name=_('Comment'))
    status = models.CharField(max_length=15, choices=STATUS_CHOICES, default=UNCONFIRMED, verbose_name=_('Status'))
    confirmation_date = models.DateTimeField(null=True, blank=True, verbose_name=_("Confirmation Date"))
    arrival_date = models.DateField(verbose_name=_('Arrival Date'))
    departure_date = models.DateField(verbose_name=_('Departure Date'))
    confirmation = models.CharField(max_length=15, null=True, blank=True, verbose_name=_('Confirmation Code'))
    is_invoiced = models.BooleanField(default=False, verbose_name=_('Is invoiced?'))
    euroamerica = models.BooleanField(default=False, verbose_name=_("Is Euroamerica sale"))
    user = models.ForeignKey(User, null=True, blank=True, on_delete=models.PROTECT, related_name='reservations')
    timestamp = models.DateTimeField(null=True, blank=True, auto_now_add=True)
    handle_fee = models.FloatField(null=True, blank=True, verbose_name=_("Handle Fee"))

    class Meta:
        verbose_name = _('Reservation')
        verbose_name_plural = _('Reservations')
        permissions = (
            ('reservation_can_edit', 'Can Edit Reservation'),
            ('reservation_can_view', 'Can View Reservation')
        )

И ModelViewSet, который проверяет такие разрешения:

class ReservationCompositionPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        user_permissions = Permission.objects.filter(user=request.user)
        print(str(user_permissions))

        if request.method == 'GET':
            return request.user.has_perm('reservation_can_view')
        elif request.method in ('POST', 'PUT', 'PATCH'):
            return request.user.has_perm('reservation_can_edit')

        return False

class ReservationCompositionViewSet(viewsets.ViewSet):
    permission_classes = (ReservationCompositionPermission,)

    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)

Я могусм. в консоли, что текущий пользователь имеет оба разрешения:

<QuerySet [<Permission: ReservationsManagerApp | Reservación | Can Edit Reservation>, <Permission: ReservationsManagerApp | Reservación | Can View Reservation>]>

Но я все равно получаю False, когда пользовательский класс разрешений оценивает request.user.has_perm('reservation_can_view'), если пользователь не является суперпользователем.

Наверное, я что-то упустил, но не могу найти, что.

1 Ответ

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

Ознакомьтесь с документацией has_perm (ссылка для Django 2.1).Похоже, что метод ожидает разрешения в виде <app label>.<permission codename>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...