DRF – własne uprawnienia cz.2

Wcześniejszy wpis dotyczący uprawnień w DRF – zobacz tutaj.

Dla modelu magazynowego zamierzam określić uprawnienia, dzięki którym edycji utworzonej instancji modelu będzie mógł dokonywać tylko właściciel danego magazynu. Dodatkowo magazyn będzie mógł być utworzony tylko przez użytkownika o profilu „client” – będącym zleceniodawcą kontraktów.

Model magazynu wygląda następująco:

źródło pliku: backend/contracts/models/warehouse.py

class Warehouse(models.Model):
    warehouse_name = models.CharField(max_length=15, unique=True)
    warehouse_info = models.TextField(max_length=100)
    client = models.ForeignKey(ContractUser, on_delete=models.CASCADE)

    def __str__(self):
        return self.warehouse_name

Dla tego modelu utworzę klasę WarehouseWritePermission dziedziczącą po klasie BasePermission.

W klasie tej definiuję dwie metody tj. has_object_permission() oraz has_permission().

Metoda has_permission() definiuje uprawnienia podczas wykonywania metod GET oraz POST, natomiast metoda has_object_permission() będzie definiować uprawnienia podczas wykonywania metody GET wraz z parametrem określającą konkretny magazyn, jak również podczas edycji magazynu (metoda PUT), tzn.

    def has_permission(self, request, view):
        if request.method != "POST":
            return True
        return request.user.profile == "client"

W powyższej metodzie tylko użytkownik o profilu „client” może utworzyć nową instancję modelu magazyn. Użytkownicy o profilu „contractor” mogą tylko przeglądać listę utworzonych magazynów.

    def has_object_permission(self, request, view, obj):
        if request.method in SAFE_METHODS:
            return True
        return obj.client == request.user

W powyższej metodzie użytkownicy mogą wyświetlić konkretną instancję, ale edycji może dokonać tylko właściciel danego magazynu, który jest zapisany w zmiennej client instancji.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

÷ 2 = 1