|
|
|
from django_filters import rest_framework as filters
|
|
|
|
from django.db.models import Q
|
|
|
|
from rest_framework.compat import coreapi, coreschema
|
|
|
|
from rest_framework.filters import BaseFilterBackend
|
|
|
|
|
|
|
|
from common.drf.filters import BaseFilterSet
|
|
|
|
from users.models.user import User
|
|
|
|
from users.const import SystemOrOrgRole
|
|
|
|
from orgs.utils import current_org
|
|
|
|
|
|
|
|
|
|
|
|
class OrgRoleUserFilterBackend(BaseFilterBackend):
|
|
|
|
def filter_queryset(self, request, queryset, view):
|
|
|
|
org_role = request.query_params.get('org_role')
|
|
|
|
if not org_role:
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
if org_role == 'admins':
|
|
|
|
return queryset & (current_org.admins | User.objects.filter(role=User.ROLE.ADMIN))
|
|
|
|
elif org_role == 'auditors':
|
|
|
|
return queryset & current_org.auditors
|
|
|
|
elif org_role == 'users':
|
|
|
|
return queryset & current_org.users
|
|
|
|
elif org_role == 'members':
|
|
|
|
return queryset & current_org.get_members()
|
|
|
|
|
|
|
|
def get_schema_fields(self, view):
|
|
|
|
return [
|
|
|
|
coreapi.Field(
|
|
|
|
name='org_role', location='query', required=False, type='string',
|
|
|
|
schema=coreschema.String(
|
|
|
|
title='Organization role users',
|
|
|
|
description='Organization role users can be {admins|auditors|users|members}'
|
|
|
|
)
|
|
|
|
)
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
class UserFilter(BaseFilterSet):
|
|
|
|
system_or_org_role = filters.ChoiceFilter(choices=SystemOrOrgRole.choices, method='filter_system_or_org_role')
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = User
|
|
|
|
fields = (
|
|
|
|
'id', 'username', 'email', 'name', 'source', 'system_or_org_role'
|
|
|
|
)
|
|
|
|
|
|
|
|
def filter_system_or_org_role(self, queryset, name, value):
|
|
|
|
value = value.split('_')
|
|
|
|
if len(value) == 1:
|
|
|
|
role_type, value = None, value[0]
|
|
|
|
else:
|
|
|
|
role_type, value = value
|
|
|
|
value = value.title()
|
|
|
|
system_queries = Q(role=value)
|
|
|
|
org_queries = Q(m2m_org_members__role=value, m2m_org_members__org_id=current_org.id)
|
|
|
|
if not role_type:
|
|
|
|
queries = system_queries | org_queries
|
|
|
|
elif role_type == 'system':
|
|
|
|
queries = system_queries
|
|
|
|
elif role_type == 'org':
|
|
|
|
queries = org_queries
|
|
|
|
return queryset.filter(queries)
|