From 55de785947222810d74f5c68de1a6b31fc15a6d0 Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 3 Feb 2023 12:22:27 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/signal_handlers.py | 37 +++++++++++++++++-- apps/locale/zh/LC_MESSAGES/django.po | 2 +- apps/settings/signal_handlers.py | 18 +-------- .../migrations/0042_auto_20230203_1201.py | 23 ++++++++++++ apps/users/models/user.py | 6 +-- apps/users/serializers/user.py | 17 +++++---- 6 files changed, 72 insertions(+), 31 deletions(-) create mode 100644 apps/users/migrations/0042_auto_20230203_1201.py diff --git a/apps/common/signal_handlers.py b/apps/common/signal_handlers.py index 4471edb94..660cb4b95 100644 --- a/apps/common/signal_handlers.py +++ b/apps/common/signal_handlers.py @@ -1,15 +1,16 @@ # -*- coding: utf-8 -*- # -import re -import os import logging +import re from collections import defaultdict + from django.conf import settings from django.core.signals import request_finished from django.db import connection +from django.db.models.signals import pre_save +from django.dispatch import receiver from jumpserver.utils import get_current_request - from .local import thread_local pattern = re.compile(r'FROM `(\w+)`') @@ -83,6 +84,36 @@ def on_request_finished_release_local(sender, **kwargs): thread_local.__release_local__() +def _get_request_user_name(): + user_name = 'System' + current_request = get_current_request() + if current_request and current_request.user.is_authenticated: + user_name = current_request.user.name + if isinstance(user_name, str): + user_name = user_name[:30] + return user_name + + +@receiver(pre_save) +def on_create_set_created_by(sender, instance=None, **kwargs): + if getattr(instance, '_ignore_auto_created_by', False): + return + if not hasattr(instance, 'created_by') or instance.created_by: + return + user_name = _get_request_user_name() + instance.created_by = user_name + + +@receiver(pre_save) +def on_update_set_updated_by(sender, instance=None, created=False, **kwargs): + if getattr(instance, '_ignore_auto_updated_by', False): + return + if not hasattr(instance, 'updated_by'): + return + user_name = _get_request_user_name() + instance.updated_by = user_name + + if settings.DEBUG_DEV: request_finished.connect(on_request_finished_logging_db_query) else: diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 1f16f7a8f..7d6549fe3 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -2887,7 +2887,7 @@ msgstr "忽略时间" #: common/db/models.py:34 msgid "Updated by" -msgstr "更新人" +msgstr "最后更新者" #: common/db/validators.py:9 #, fuzzy diff --git a/apps/settings/signal_handlers.py b/apps/settings/signal_handlers.py index 7568de368..f4f4c74ce 100644 --- a/apps/settings/signal_handlers.py +++ b/apps/settings/signal_handlers.py @@ -3,18 +3,15 @@ import json from django.conf import LazySettings -from django.db.models.signals import post_save, pre_save +from django.db.models.signals import post_save from django.db.utils import ProgrammingError, OperationalError from django.dispatch import receiver from django.utils.functional import LazyObject -from jumpserver.utils import current_request - from common.decorator import on_transaction_commit from common.signals import django_ready from common.utils import get_logger, ssh_key_gen from common.utils.connection import RedisPubSub - from .models import Setting logger = get_logger(__file__) @@ -58,19 +55,6 @@ def auto_generate_terminal_host_key(sender, **kwargs): pass -@receiver(pre_save, dispatch_uid="my_unique_identifier") -def on_create_set_created_by(sender, instance=None, **kwargs): - if getattr(instance, '_ignore_auto_created_by', False) is True: - return - if not hasattr(instance, 'created_by') or instance.created_by: - return - if current_request and current_request.user.is_authenticated: - user_name = current_request.user.name - if isinstance(user_name, str): - user_name = user_name[:30] - instance.created_by = user_name - - @receiver(django_ready) def subscribe_settings_change(sender, **kwargs): logger.debug("Start subscribe setting change") diff --git a/apps/users/migrations/0042_auto_20230203_1201.py b/apps/users/migrations/0042_auto_20230203_1201.py new file mode 100644 index 000000000..d434ea12d --- /dev/null +++ b/apps/users/migrations/0042_auto_20230203_1201.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.14 on 2023-02-03 04:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0041_auto_20221220_1956'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='date_updated', + field=models.DateTimeField(auto_now=True, verbose_name='Date updated'), + ), + migrations.AddField( + model_name='user', + name='updated_by', + field=models.CharField(blank=True, default='', max_length=30, verbose_name='Updated by'), + ), + ] diff --git a/apps/users/models/user.py b/apps/users/models/user.py index b77d1151f..6996f6603 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -718,9 +718,8 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, AbstractUser): default=date_expired_default, blank=True, null=True, db_index=True, verbose_name=_('Date expired') ) - created_by = models.CharField( - max_length=30, default='', blank=True, verbose_name=_('Created by') - ) + created_by = models.CharField(max_length=30, default='', blank=True, verbose_name=_('Created by')) + updated_by = models.CharField(max_length=30, default='', blank=True, verbose_name=_('Updated by')) source = models.CharField( max_length=30, default=Source.local, choices=Source.choices, @@ -733,6 +732,7 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, AbstractUser): need_update_password = models.BooleanField( default=False, verbose_name=_('Need update password') ) + date_updated = models.DateTimeField(auto_now=True, verbose_name=_('Date updated')) wecom_id = models.CharField(null=True, default=None, unique=True, max_length=128, verbose_name=_('WeCom')) dingtalk_id = models.CharField(null=True, default=None, unique=True, max_length=128, verbose_name=_('DingTalk')) feishu_id = models.CharField(null=True, default=None, unique=True, max_length=128, verbose_name=_('FeiShu')) diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index d1cd63fc5..74c182fed 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -115,17 +115,21 @@ class UserSerializer(RolesSerializerMixin, CommonBulkSerializerMixin, serializer # small 指的是 不需要计算的直接能从一张表中获取到的数据 fields_small = fields_mini + fields_write_only + [ "email", "wechat", "phone", "mfa_level", "source", - "need_update_password", "mfa_enabled", + "wecom_id", "dingtalk_id", "feishu_id", + "created_by", "updated_by", "comment", # 通用字段 + ] + fields_date = [ + "date_expired", "date_joined", + "last_login", "date_updated" # 日期字段 + ] + fields_bool = [ "is_service_account", "is_valid", "is_expired", "is_active", # 布尔字段 "is_otp_secret_key_bound", "can_public_key_auth", - "date_expired", "date_joined", - "last_login", # 日期字段 - "created_by", "comment", # 通用字段 - "wecom_id", "dingtalk_id", "feishu_id", + "mfa_enabled", "need_update_password", ] # 包含不太常用的字段,可以没有 - fields_verbose = fields_small + [ + fields_verbose = fields_small + fields_date + fields_bool + [ "mfa_force_enabled", "is_first_login", "date_password_last_updated", "avatar_url", ] @@ -281,7 +285,6 @@ class ServiceAccountSerializer(serializers.ModelSerializer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) from authentication.serializers import AccessKeySerializer - self.fields["access_key"] = AccessKeySerializer(read_only=True) def get_username(self):