fix: 登录日志不显示

pull/12517/head
wangruidong 2024-01-09 11:28:25 +08:00 committed by Bryan
parent 25223719cb
commit df655f304a
4 changed files with 20 additions and 5 deletions

View File

@ -41,6 +41,7 @@ from .serializers import (
PasswordChangeLogSerializer, ActivityUnionLogSerializer, PasswordChangeLogSerializer, ActivityUnionLogSerializer,
FileSerializer, UserSessionSerializer FileSerializer, UserSessionSerializer
) )
from .utils import construct_userlogin_usernames
logger = get_logger(__name__) logger = get_logger(__name__)
@ -126,15 +127,16 @@ class UserLoginCommonMixin:
class UserLoginLogViewSet(UserLoginCommonMixin, OrgReadonlyModelViewSet): class UserLoginLogViewSet(UserLoginCommonMixin, OrgReadonlyModelViewSet):
@staticmethod @staticmethod
def get_org_members(): def get_org_member_usernames():
users = current_org.get_members().values_list('username', flat=True) user_queryset = current_org.get_members()
users = construct_userlogin_usernames(user_queryset)
return users return users
def get_queryset(self): def get_queryset(self):
queryset = super().get_queryset() queryset = super().get_queryset()
if current_org.is_root(): if current_org.is_root():
return queryset return queryset
users = self.get_org_members() users = self.get_org_member_usernames()
queryset = queryset.filter(username__in=users) queryset = queryset.filter(username__in=users)
return queryset return queryset

View File

@ -4,6 +4,8 @@ from itertools import chain
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.db import models from django.db import models
from django.db.models import F, Value, CharField
from django.db.models.functions import Concat
from common.db.fields import RelatedManager from common.db.fields import RelatedManager
from common.utils import validate_ip, get_ip_city, get_logger from common.utils import validate_ip, get_ip_city, get_logger
@ -115,3 +117,12 @@ def model_to_dict_for_operate_log(
get_related_values(f) get_related_values(f)
return data return data
def construct_userlogin_usernames(user_queryset):
usernames_original = user_queryset.values_list('username', flat=True)
usernames_combined = user_queryset.annotate(
usernames_combined_field=Concat(F('name'), Value('('), F('username'), Value(')'), output_field=CharField())
).values_list("usernames_combined_field", flat=True)
usernames = list(chain(usernames_original, usernames_combined))
return usernames

View File

@ -25,9 +25,10 @@ def check_different_city_login_if_need(user, request):
is_private = ipaddress.ip_address(ip).is_private is_private = ipaddress.ip_address(ip).is_private
if is_private: if is_private:
return return
usernames = [user.username, f"{user.name}({user.username})"]
last_user_login = UserLoginLog.objects.exclude( last_user_login = UserLoginLog.objects.exclude(
city__in=city_white city__in=city_white
).filter(username=user.username, status=True).first() ).filter(username__in=usernames, status=True).first()
if not last_user_login: if not last_user_login:
return return

View File

@ -17,6 +17,7 @@ from assets.models import Asset
from audits.api import OperateLogViewSet from audits.api import OperateLogViewSet
from audits.const import LoginStatusChoices from audits.const import LoginStatusChoices
from audits.models import UserLoginLog, PasswordChangeLog, OperateLog, FTPLog, JobLog from audits.models import UserLoginLog, PasswordChangeLog, OperateLog, FTPLog, JobLog
from audits.utils import construct_userlogin_usernames
from common.utils import lazyproperty from common.utils import lazyproperty
from common.utils.timezone import local_now, local_zero_hour from common.utils.timezone import local_now, local_zero_hour
from ops.const import JobStatus from ops.const import JobStatus
@ -79,7 +80,7 @@ class DateTimeMixin:
if not self.org.is_root(): if not self.org.is_root():
if query_params == 'username': if query_params == 'username':
query = { query = {
f'{query_params}__in': users.values_list('username', flat=True) f'{query_params}__in': construct_userlogin_usernames(users)
} }
else: else:
query = { query = {