/ / jak dodać uprawnienia w Django do modeli i testować je za pomocą powłoki - python, django, django-models, django-forms, django-admin

jak dodawać uprawnienia w Django do modeli i testować je za pomocą powłoki - python, django, django-models, django-forms, django-admin

Dodałem klasę Meta do mojego modelu izsynchronizował DB, a następnie utworzył obiekt w powłoce zwraca false, więc naprawdę nie mogę zrozumieć, gdzie jest błąd lub czego brakuje, jest jakaś konfiguracja może w innych plikach.

class Employer(User):#Employer inherits from User
employer_verified = models.BooleanField(default=False)

class Meta:
permissions = (
("is_member", "Friendly permission description"),
)

emp = Employer.objects.create(blablabla)
emp.save()
emp.has_perm("myappname.is_member")

Odpowiedzi:

18 dla odpowiedzi № 1

W podanym przykładzie, oczekiwałbym emp.has_perm("myappname.is_member") być naprawdę False. O ile wyraźnie nie podasz nowego Employer obiekt is_member pozwolenie, nie będzie go mieć.

Aby programowo nadać mu pozwolenie potrzebne do uzyskania rzeczywistego obiektu uprawnień i dodać go do Employer"s user_permissions:

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get_for_model(Employer)
permission = Permission.objects.get(content_type=content_type, codename="is_member")

emp = Employer.objects.create(blablabla)
emp.save()
emp.user_permissions.add(permission)

Aby przetestować go w powłoce, może być konieczne usunięcie pamięci podręcznej uprawnień, która jest tworzona dla każdego użytkownika - w przeciwnym razie has_perm może nie odzwierciedlać faktycznych uprawnień:

delattr(emp, "_perm_cache")

Odpowiadając na twoje pytania:

Jeśli chcesz każdy Employer mieć is_member pozwolenie jest kilka opcji:

  1. Zastąpić save metoda Employer sprawdzić, czy nie ma self.pk (co oznacza, że ​​jest to nowy obiekt i utwórz pozwolenie, jak pokazałem powyżej po zapisaniu.) Nie bardzo ładne, ale zadziała.

  2. Napisz swoje własne serwer uwierzytelniania. Jeśli kod uprawnień jest "is_member" i User ma Employer instancja, return True

  3. Nie używaj uprawnień System uprawnień jest zaprojektowany, aby móc dynamicznie nadawać i odbierać uprawnienia. User to jest Employer- następnie sprawdź to. Nie komplikuj go, używając uprawnień.