2013-05-15 6 views
16

Chcę odzyskać wszystkie uprawnienia dla użytkownika, jak liście, ale id premission:Jak uzyskać uprawnienia użytkownika?

user.get_all_permissions() 

dać mi listę nazwisk uprawnień. Jak to zrobić?

+0

dlaczego trzeba to? – karthikr

+0

Potrzebuję tego, aby ustawić odpowiednie pola wyboru w ModelMultipleChoiceField w mojej formie – Nips

+0

czy ujawniasz uprawnienia do aplikacji? to nie jest dobry pomysł. – karthikr

Odpowiedz

11

Kluczem jest dostać obiekty uprawnień jak to:

from django.contrib.auth.models import Permission 
permissions = Permission.objects.filter(user=user) 

i tam można uzyskać dostępu do właściwości id takiego:

permissions[0].id 

Jeśli chcesz lista (id, permission_name) wykonaj następujące czynności:

perm_tuple = [(x.id, x.name) for x in Permission.objects.filter(user=user)] 

Mam nadzieję, że pomoże!

+0

Co się stanie, jeśli użytkownik znajduje się w grupie, która ma takie uprawnienia? –

+0

@AmoghTalpallikar Mam problem, aby rozwiązać ten problem, który wskazałeś. – DRC

18

aby uzyskać wszystkie uprawnienia danego użytkownika, również uprawnienia związane z grupą ta osoba jest częścią:

from django.contrib.auth.models import Permission 

def get_user_permissions(user): 
    if user.is_superuser: 
     return Permission.objects.all() 
    return user.user_permissions.all() | Permission.objects.filter(group__user=user) 
+0

Używam tego kodu, ale z jakiegoś powodu powraca on zduplikowanych uprawnień. –

+0

Oto opcja usuwania duplikatów (prawdopodobnie z powodu uprawnień grupowych i użytkowników): 'list (set (chain (user.user_permissions.filter (content_type = ctype) .values_list ('nazwa kodowa', flat = True), Permission. objects.filter (group__user = user, content_type = ctype) .values_list ('codename', flat = True)))) 'Łańcuch podejrzany jest czasem bardziej wydajny niż |. Listy wartości i filtrowanie według typu zawartości są niepotrzebne, ale są to dalsze opcje w zależności od potrzeb. – Chris