0002-django_rbac-annotate-roles-with-actual-auth-level-gi.patch
| src/django_rbac/managers.py | ||
|---|---|---|
|
import threading
|
||
|
from django.db import models
|
||
|
from django.db.models import query
|
||
|
from django.db.models import query, Min, Case, When
|
||
|
from django.contrib.contenttypes.models import ContentType
|
||
|
from django.db.models.query import Q, Prefetch
|
||
|
from django.contrib.auth import get_user_model
|
||
| ... | ... | |
|
class RoleQuerySet(query.QuerySet):
|
||
|
def for_user(self, user, max_auth_level=None):
|
||
|
def for_user(self, user, max_auth_level=None, annotate=False):
|
||
|
qs = self.filter(members=user)
|
||
|
if max_auth_level:
|
||
|
qs = qs.filter(auth_level__lte=max_auth_level)
|
||
|
qs = qs.parents()
|
||
|
if max_auth_level:
|
||
|
qs = qs.filter(auth_level__lte=max_auth_level)
|
||
|
return qs.distinct()
|
||
|
qs = qs.distinct()
|
||
|
if annotate:
|
||
|
qs = qs.set_needed_auth_levels(user)
|
||
|
return qs
|
||
|
def parents(self, include_self=True, annotate=False):
|
||
|
qs = self.model.objects.filter(child_relation__child__in=self)
|
||
| ... | ... | |
|
qs = qs.annotate(direct=models.Max(IntCast('child_relation__direct')))
|
||
|
return qs
|
||
|
def set_needed_auth_levels(self, user):
|
||
|
return self.annotate(needed_auth_level=Case(
|
||
|
When(~Q(members=user), then=Min('child_relation__child__auth_level')),
|
||
|
default='auth_level'
|
||
|
))
|
||
|
def children(self, include_self=True, annotate=False):
|
||
|
qs = self.model.objects.filter(parent_relation__parent__in=self)
|
||
|
if include_self:
|
||