From d402780d00627efe4cce5b6f5d38acb160b942ac Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 18 Apr 2023 20:21:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9C=8D=E5=8A=A1=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E6=97=B6=E6=A0=A1=E9=AA=8C=20migrations=20=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E6=9C=89=E5=86=B2=E7=AA=81(DEBUG=5FDEV)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/signal_handlers.py | 55 ++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/apps/common/signal_handlers.py b/apps/common/signal_handlers.py index 6beb2d187..752682c51 100644 --- a/apps/common/signal_handlers.py +++ b/apps/common/signal_handlers.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # import logging +import os import re from collections import defaultdict @@ -12,6 +13,7 @@ from django.dispatch import receiver from jumpserver.utils import get_current_request from .local import thread_local +from .signals import django_ready pattern = re.compile(r'FROM `(\w+)`') logger = logging.getLogger("jumpserver.common") @@ -123,3 +125,56 @@ if settings.DEBUG_DEV: request_finished.connect(on_request_finished_logging_db_query) else: request_finished.connect(on_request_finished_release_local) + + +@receiver(django_ready) +def check_migrations_file_prefix_conflict(*args, **kwargs): + + if not settings.DEBUG_DEV: + return + + from jumpserver.const import BASE_DIR + print('>>> Check migrations file prefix conflict') + # 指定 app 目录 + _dir = BASE_DIR + # 获取所有子目录 + sub_dirs = next(os.walk(_dir))[1] + # 记录冲突的文件,元素为 (subdir, file1, file2) + conflict_files = [] + + # 遍历每个子目录 + for subdir in sub_dirs: + # 拼接 migrations 目录路径 + migrations_dir = os.path.join(_dir, subdir, 'migrations') + # 判断是否存在 migrations 目录 + if not os.path.exists(migrations_dir): + continue + # 获取所有文件名 + files = os.listdir(migrations_dir) + # 遍历每个文件名 + prefix_file_map = dict() + for file in files: + file = str(file) + # 判断是否为 Python 文件 + if not file.endswith('.py'): + continue + if 'squashed' in file: + continue + # file 为文件名 + file_prefix = file.split('_')[0] + if file_prefix in prefix_file_map.keys(): + conflict_files.append((subdir, file, prefix_file_map.get(file_prefix))) + else: + prefix_file_map[file_prefix] = file + + print('='*80) + print(f'Conflict count:({len(conflict_files)})') + for conflict_file in conflict_files: + msg_dir = '{:<15}'.format(conflict_file[0]) + msg_split = '=> ' + msg_left = msg_dir + msg_right1 = msg_split + '{:<80}'.format(conflict_file[1]) + msg_right2 = ' ' * len(msg_left) + msg_split + conflict_file[2] + print(f'{msg_left}{msg_right1}\n{msg_right2}\n') + + print('='*80)