Django: User: Permission コードのどれかを持っているユーザーを検索

1
2
3
from operator import or_
from functools import reduce
from django.db.models import Q
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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",
    )