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