本文へスキップ
hdknr blog
戻る

Django: User: Permissionコードのどれかを保有しているユーザーを検索

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",
    )


前の記事
DRF: Userを所属グループで検索
次の記事
django-mptt: tree_idの重複問題