mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-08-17 13:47:49 +00:00
perf: User report
This commit is contained in:
parent
0fb7e84678
commit
e3c33bca32
@ -170,7 +170,6 @@
|
||||
"AssetLoginACLHelpText": "Al iniciar sesión en el activo, puede auditar según la IP del usuario y el intervalo de tiempo, para determinar si se puede acceder al activo",
|
||||
"AssetLoginTrends": "Tendencias de inicio de sesión de activos",
|
||||
"AssetName": "Nombre del activo",
|
||||
"AssetOverview": "Resumen de usuarios",
|
||||
"AssetPermission": "Autorización de activos",
|
||||
"AssetPermissionCreate": "Crear reglas de autorización de activos",
|
||||
"AssetPermissionDetail": "Detalles de autorización de activos",
|
||||
|
@ -168,7 +168,6 @@
|
||||
"AssetLoginACLHelpMsg": "ユーザのログインIPと時間帯をもとに、アセットへのログインの承認可否を判断します",
|
||||
"AssetLoginACLHelpText": "資産にログインする際、ユーザーのログインIPと時間帯を審査し、資産にログインできるかどうかを判断します",
|
||||
"AssetName": "資産名称",
|
||||
"AssetOverview": "ユーザー概要",
|
||||
"AssetPermission": "アセット権限",
|
||||
"AssetPermissionCreate": "資産認証ルールの作成",
|
||||
"AssetPermissionDetail": "資産認証の詳細",
|
||||
|
@ -170,7 +170,6 @@
|
||||
"AssetLoginACLHelpText": "자산에 로그인할 때, 사용자의 로그인 IP 및 시간대를 기반으로 검토하여 자산에 로그인할 수 있는지 판단",
|
||||
"AssetLoginTrends": "자산 로그인 추세",
|
||||
"AssetName": "자산 이름",
|
||||
"AssetOverview": "사용자 개요",
|
||||
"AssetPermission": "자산 권한 부여",
|
||||
"AssetPermissionCreate": "자산 권한 규칙 생성",
|
||||
"AssetPermissionDetail": "자산 권한 세부정보",
|
||||
|
@ -170,7 +170,6 @@
|
||||
"AssetLoginACLHelpText": "Ao fazer login no ativo, você pode revisar de acordo com o IP de login do usuário e o intervalo de tempo para determinar se pode fazer login no ativo.",
|
||||
"AssetLoginTrends": "Tendências de Login de Ativos",
|
||||
"AssetName": "Nome do ativo",
|
||||
"AssetOverview": "Visão geral do usuário",
|
||||
"AssetPermission": "Ativos de autorização",
|
||||
"AssetPermissionCreate": "Criar regra de autorização de ativos",
|
||||
"AssetPermissionDetail": " Detalhes da autorização de ativos",
|
||||
|
@ -171,7 +171,6 @@
|
||||
"AssetLoginACLHelpText": "Подключение к активам можно контролировать, исходя из IP-адреса пользователя и временного интервала, чтобы определить возможность подключения к активу.",
|
||||
"AssetLoginTrends": "Тенденция входа в активы",
|
||||
"AssetName": "Название актива",
|
||||
"AssetOverview": "Обзор пользователей",
|
||||
"AssetPermission": "Доступ к активам",
|
||||
"AssetPermissionCreate": "Создать правило доступа к активам",
|
||||
"AssetPermissionDetail": "Подробности доступа к активам",
|
||||
|
@ -170,7 +170,7 @@
|
||||
"AssetLoginACLHelpText": "登录资产时,可以根据用户的登录 IP 和时间段进行审核,判断是否可以登录资产",
|
||||
"AssetLoginTrends": "资产登录趋势",
|
||||
"AssetName": "资产名称",
|
||||
"AssetOverview": "用户概览",
|
||||
"AssetOverview": "资产概览",
|
||||
"AssetPermission": "资产授权",
|
||||
"AssetPermissionCreate": "创建资产授权规则",
|
||||
"AssetPermissionDetail": "资产授权详情",
|
||||
|
@ -172,7 +172,6 @@
|
||||
"AssetLoginACLHelpText": "登入資產時,可以依照使用者的登入 IP 和時間段進行審核,判斷是否可以登入資產",
|
||||
"AssetLoginTrends": "資產登錄趨勢",
|
||||
"AssetName": "資產名稱",
|
||||
"AssetOverview": "用戶概覽",
|
||||
"AssetPermission": "資產授權",
|
||||
"AssetPermissionCreate": "創建資產授權規則",
|
||||
"AssetPermissionDetail": "資產授權詳情",
|
||||
|
@ -2,13 +2,18 @@ from django.db.models import Count, F
|
||||
|
||||
|
||||
def group_stats(queryset, alias, key, label_map=None):
|
||||
grouped = (
|
||||
queryset
|
||||
.exclude(**{f'{key}__isnull': True})
|
||||
.values(**{alias: F(key)})
|
||||
.annotate(total=Count('id', distinct=True))
|
||||
pk_name = queryset.model._meta.pk.name
|
||||
|
||||
base = (
|
||||
queryset.order_by()
|
||||
.exclude(**{f"{key}__isnull": True})
|
||||
.annotate(**{alias: F(key)})
|
||||
.values(pk_name, alias)
|
||||
.distinct()
|
||||
)
|
||||
|
||||
grouped = base.values(alias).annotate(total=Count(pk_name))
|
||||
|
||||
data = [
|
||||
{
|
||||
alias: val,
|
||||
@ -17,5 +22,4 @@ def group_stats(queryset, alias, key, label_map=None):
|
||||
}
|
||||
for val, cnt in grouped.values_list(alias, 'total')
|
||||
]
|
||||
|
||||
return data
|
||||
|
@ -4,6 +4,7 @@ from collections import defaultdict
|
||||
|
||||
from django.db.models import Count, Q
|
||||
from django.http.response import JsonResponse
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from rest_framework.views import APIView
|
||||
|
||||
@ -55,19 +56,19 @@ class UserReportApi(DateRangeMixin, APIView):
|
||||
return metrics
|
||||
|
||||
def get_user_login_time_metrics(self):
|
||||
time_buckets = {
|
||||
'00:00-06:00': (0, 6),
|
||||
'06:00-12:00': (6, 12),
|
||||
'12:00-18:00': (12, 18),
|
||||
'18:00-24:00': (18, 24),
|
||||
}
|
||||
filtered_queryset = self.filter_by_date_range(self.user_login_log_queryset, 'datetime').all()
|
||||
metrics = {bucket: 0 for bucket in time_buckets.keys()}
|
||||
for date in filtered_queryset:
|
||||
hour = date.datetime.hour
|
||||
for bucket, (start, end) in time_buckets.items():
|
||||
if start <= hour < end:
|
||||
metrics[bucket] = metrics.get(bucket, 0) + 1
|
||||
buckets = ['00:00-06:00', '06:00-12:00', '12:00-18:00', '18:00-24:00']
|
||||
metrics = {k: 0 for k in buckets}
|
||||
|
||||
qs = self.filter_by_date_range(self.user_login_log_queryset, 'datetime').only('datetime')
|
||||
|
||||
for obj in qs:
|
||||
dt = obj.datetime
|
||||
if dt is None:
|
||||
continue
|
||||
dt_local = timezone.localtime(dt)
|
||||
hour = dt_local.hour
|
||||
metrics[buckets[hour // 6]] += 1
|
||||
|
||||
return metrics
|
||||
|
||||
@lazyproperty
|
||||
|
Loading…
Reference in New Issue
Block a user