from django.apps import apps from django.utils import translation from django_filters import rest_framework as drf_filters from rest_framework import filters from rest_framework.compat import coreapi, coreschema from common.drf.filters import BaseFilterSet from common.sessions.cache import user_session_manager from orgs.utils import current_org from .models import UserSession, OperateLog __all__ = ['CurrentOrgMembersFilter'] class CurrentOrgMembersFilter(filters.BaseFilterBackend): def get_schema_fields(self, view): return [ coreapi.Field( name='user', location='query', required=False, type='string', schema=coreschema.String( title='user', description='user' ) ) ] def _get_user_list(self): users = current_org.get_members(exclude=('Auditor',)) return users def filter_queryset(self, request, queryset, view): user_id = request.GET.get('user') if user_id: queryset = queryset.filter(user=user_id) else: queryset = queryset.filter(user__in=self._get_user_list()) return queryset class UserSessionFilterSet(BaseFilterSet): is_active = drf_filters.BooleanFilter(method='filter_is_active') @staticmethod def filter_is_active(queryset, name, is_active): keys = user_session_manager.get_active_keys() if is_active: queryset = queryset.filter(key__in=keys) else: queryset = queryset.exclude(key__in=keys) return queryset class Meta: model = UserSession fields = ['id', 'ip', 'city', 'type'] class OperateLogFilterSet(BaseFilterSet): resource_type = drf_filters.CharFilter(method='filter_resource_type') @staticmethod def filter_resource_type(queryset, name, resource_type): current_lang = translation.get_language() with translation.override(current_lang): mapper = {str(m._meta.verbose_name): m._meta.verbose_name_raw for m in apps.get_models()} tp = mapper.get(resource_type) queryset = queryset.filter(resource_type=tp) return queryset class Meta: model = OperateLog fields = [ 'user', 'action', 'resource', 'remote_addr' ]