You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jumpserver/apps/users/models/user/_json.py

33 lines
1.1 KiB

from django.db import models
from django.db.models import Count
class JSONFilterMixin:
@staticmethod
def get_json_filter_attr_q(name, value, match):
from rbac.models import RoleBinding
from orgs.utils import current_org
kwargs = {}
if name == "system_roles":
kwargs["scope"] = "system"
elif name == "org_roles":
kwargs["scope"] = "org"
if not current_org.is_root():
kwargs["org_id"] = current_org.id
else:
return None
bindings = RoleBinding.objects.filter(**kwargs, role__in=value)
if match == "m2m_all":
user_id = (
bindings.values("user_id")
.annotate(count=Count("user_id")) # 这里不能有 distinct 会导致 count 不准确, acls 中过滤用户时会出现问题
.filter(count=len(value))
.values_list("user_id", flat=True)
)
else:
user_id = bindings.values_list("user_id", flat=True)
return models.Q(id__in=user_id)