From 385bf47b11eec95503054b21781277f17a1e4187 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Wed, 26 Feb 2025 15:16:16 +0800 Subject: [PATCH 1/2] perf: Add last login date update for account on session save --- apps/accounts/filters.py | 2 +- apps/accounts/models/account.py | 5 +++++ apps/terminal/models/session/session.py | 5 +++++ apps/terminal/signal_handlers/session.py | 5 +++-- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/apps/accounts/filters.py b/apps/accounts/filters.py index 32968ca71..406f5b832 100644 --- a/apps/accounts/filters.py +++ b/apps/accounts/filters.py @@ -108,7 +108,7 @@ class AccountFilterSet(BaseFilterSet): ) if kwargs: - queryset = queryset.filter(date_last_login__gte=date) + queryset = queryset.filter(**kwargs) return queryset @staticmethod diff --git a/apps/accounts/models/account.py b/apps/accounts/models/account.py index 1f363b678..5e90aee98 100644 --- a/apps/accounts/models/account.py +++ b/apps/accounts/models/account.py @@ -1,4 +1,5 @@ from django.db import models +from django.utils import timezone from django.utils.translation import gettext_lazy as _ from simple_history.models import HistoricalRecords @@ -167,6 +168,10 @@ class Account(AbsConnectivity, LabeledMixin, BaseAccount): return escape(value) + def update_last_login_date(self): + self.date_last_login = timezone.now() + self.save(update_fields=['date_last_login']) + def replace_history_model_with_mixin(): """ diff --git a/apps/terminal/models/session/session.py b/apps/terminal/models/session/session.py index 85a8e8273..b037e83bc 100644 --- a/apps/terminal/models/session/session.py +++ b/apps/terminal/models/session/session.py @@ -11,6 +11,7 @@ from django.db import models from django.utils import timezone from django.utils.translation import gettext_lazy as _ +from accounts.models import Account from assets.models import Asset from common.const.signals import OP_LOG_SKIP_SIGNAL from common.utils import get_object_or_none, lazyproperty @@ -125,6 +126,10 @@ class Session(OrgModelMixin): def user_obj(self): return User.objects.get(id=self.user_id) + @property + def account_obj(self): + return get_object_or_none(Account, pk=self.account_id) + def can_replay(self): return self.has_replay diff --git a/apps/terminal/signal_handlers/session.py b/apps/terminal/signal_handlers/session.py index 4c79de9ed..6a75c42e8 100644 --- a/apps/terminal/signal_handlers/session.py +++ b/apps/terminal/signal_handlers/session.py @@ -5,9 +5,11 @@ from terminal.models import Session @receiver(pre_save, sender=Session) -def on_session_pre_save(sender, instance,**kwargs): +def on_session_pre_save(sender, instance, **kwargs): if instance.need_update_cmd_amount: instance.cmd_amount = instance.compute_command_amount() + if instance.account_obj: + instance.account_obj.update_last_login_date() @receiver(post_save, sender=Session) @@ -16,4 +18,3 @@ def on_session_finished(sender, instance: Session, created, **kwargs): return # 清理一次可能因 task 未执行的缓存数据 Session.unlock_session(instance.id) - From a498b22e807d947e2b00a4d8638fb0525d675721 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Wed, 26 Feb 2025 15:38:46 +0800 Subject: [PATCH 2/2] perf: Update account change secret status and date on successful secret change --- apps/accounts/automations/base/manager.py | 4 +++- apps/accounts/filters.py | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/accounts/automations/base/manager.py b/apps/accounts/automations/base/manager.py index b52dd4c2a..bc33f588e 100644 --- a/apps/accounts/automations/base/manager.py +++ b/apps/accounts/automations/base/manager.py @@ -138,10 +138,12 @@ class BaseChangeSecretPushManager(AccountBasePlaybookManager): account.secret = getattr(recorder, 'new_secret', account.secret) account.date_updated = timezone.now() + account.date_change_secret = timezone.now() + account.change_secret_status = ChangeSecretRecordStatusChoice.success with safe_db_connection(): recorder.save(update_fields=['status', 'date_finished']) - account.save(update_fields=['secret', 'date_updated']) + account.save(update_fields=['secret', 'date_updated', 'date_change_secret', 'change_secret_status']) self.summary['ok_accounts'] += 1 self.result['ok_accounts'].append( diff --git a/apps/accounts/filters.py b/apps/accounts/filters.py index 406f5b832..b305196df 100644 --- a/apps/accounts/filters.py +++ b/apps/accounts/filters.py @@ -7,6 +7,7 @@ from django_filters import rest_framework as drf_filters from assets.models import Node from common.drf.filters import BaseFilterSet from common.utils.timezone import local_zero_hour, local_now +from .const.automation import ChangeSecretRecordStatusChoice from .models import Account, GatheredAccount, ChangeSecretRecord, PushSecretRecord, IntegrationApplication @@ -104,7 +105,7 @@ class AccountFilterSet(BaseFilterSet): if name == "latest_secret_change_failed": queryset = queryset.filter(date_change_secret__gt=date).exclude( - change_secret_status="ok" + change_secret_status=ChangeSecretRecordStatusChoice.success ) if kwargs: