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: