Django: User: Permission コードのどれかを持っているユーザーを検索
from operator import or_
from functools import reduce
from django.db.models import Q
class UserQuerySet(models.QuerySet):
def filter_has_perm(self, perm_codeset: List[str]):
""" Permission code(List[app_label.codename]) の一覧のどれかを含むユーザーの検索 """
def _query(item):
return reduce(or_, [
Q(user_permissions__content_type__app_label=item[0], user_permissions__codename=item[1]),
Q(groups__permissions__content_type__app_label=item[0], groups__permissions__codename=item[1]),
])
query = reduce(or_, map(_query, map(lambda i: i.strip().split("."), perm_codeset)))
return self.filter(query)
class UserFilter(django_filters.FilterSet)
def filter_permission_codes__in_csv(self, queryset, name, value):
if not value:
return queryset
values = value.split(",") if isinstance(value, str) else value
if len(values) < 1:
return queryset
return queryset.filter_has_perm(values)
permission_codes__in_csv = DF.BaseInFilter(
label="パーミッションコード(CSV)",
method="filter_permission_codes__in_csv",
)