From c78bf80885e27aeea81495dce8e326dcf8cb0f87 Mon Sep 17 00:00:00 2001 From: yanta Date: Wed, 17 Jul 2024 17:17:46 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E4=BD=8E=E5=B3=B0=E6=97=B6=E9=97=B4=E8=8C=83=E5=9B=B4=EF=BC=8C?= =?UTF-8?q?ddl=E5=8F=AA=E8=83=BD=E5=A4=9F=E5=9C=A8=E5=9C=A8=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E4=BD=8E=E5=B3=B0=E6=89=A7=E8=A1=8C=E9=80=89=E9=A1=B9?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E9=9D=9Edba=E6=89=A7=E8=A1=8Csql?= =?UTF-8?q?=E9=94=81=E8=A1=A8=E5=BD=B1=E5=93=8D=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/templates/config.html | 27 +++++++++++++++++++++++++++ sql/sql_workflow.py | 9 +++++++++ sql/utils/sql_review.py | 20 ++++++++++++++++++++ sql_api/api_workflow.py | 9 ++++++++- 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/common/templates/config.html b/common/templates/config.html index 93af8eeb1f..1e3d619c0e 100755 --- a/common/templates/config.html +++ b/common/templates/config.html @@ -161,6 +161,26 @@

功能模块配置

SQL上线

+
+ +
+ +
+
+
+ +
+ +
+
@@ -1319,6 +1339,13 @@
当前审批流程: end): + result = False + return result + def on_correct_time_period(workflow_id, run_date=None): """ diff --git a/sql_api/api_workflow.py b/sql_api/api_workflow.py index d834a5af30..b2533ff2b0 100644 --- a/sql_api/api_workflow.py +++ b/sql_api/api_workflow.py @@ -26,7 +26,7 @@ from sql.notify import notify_for_audit, notify_for_execute from sql.query_privileges import _query_apply_audit_call_back from sql.utils.resource_group import user_groups -from sql.utils.sql_review import can_cancel, can_execute, on_correct_time_period +from sql.utils.sql_review import can_cancel, can_execute, on_correct_time_period,on_query_low_peak_time_ddl from sql.utils.tasks import del_schedule from sql.utils.workflow_audit import Audit, get_auditor, AuditException from .filters import WorkflowFilter, WorkflowAuditFilter @@ -340,6 +340,13 @@ def post(self, request): "errors": "不在可执行时间范围内,如果需要修改执行时间请重新提交工单!" } ) + sys_config = SysConfig() + if not request.user.is_superuser and on_query_low_peak_time_ddl(workflow_id) is False: + start = sys_config.get("query_low_peak_start", 0) + end = sys_config.get("query_low_peak_end", 24) + raise serializers.ValidationError( + {"errMsg": "管理员设置了业务低峰期时间范围:每天%s:00至%s,你只能在业务低峰时间范围执行DDL工单操作!" % (start, end)} + ) # 获取审核信息 audit_id = Audit.detail_by_workflow_id( From b6d187b988acf789fee4e881b132c1113b3e2a12 Mon Sep 17 00:00:00 2001 From: "hai.yang" Date: Fri, 24 Jan 2025 16:58:27 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E5=9C=A8instance=E8=A1=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=B8=9A=E5=8A=A1=E4=BD=8E=E5=B3=B0=E6=97=B6=E6=AE=B5?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=B7=A5=E5=8D=95=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/templates/config.html | 44 ++++++++++++++---------------------- sql/models.py | 19 ++++++++++++++++ sql/sql_workflow.py | 17 ++++++++------ sql/utils/sql_review.py | 36 +++++++++++++++++++---------- sql_api/api_workflow.py | 21 +++++++++++------ 5 files changed, 84 insertions(+), 53 deletions(-) diff --git a/common/templates/config.html b/common/templates/config.html index 1e3d619c0e..236247dd5e 100755 --- a/common/templates/config.html +++ b/common/templates/config.html @@ -161,26 +161,6 @@

功能模块配置

SQL上线

-
- -
- -
-
-
- -
- -
-
@@ -324,6 +304,18 @@
SQL上线
+
+ +
+ +
+
@@ -1203,6 +1195,11 @@
当前审批流程:当前审批流程: end): - result = False - return result + if not any(start <= current_hour < end for start, end in time_periods): + return False,time_periods + + return True,None def on_correct_time_period(workflow_id, run_date=None): diff --git a/sql_api/api_workflow.py b/sql_api/api_workflow.py index b2533ff2b0..8bfa12747e 100644 --- a/sql_api/api_workflow.py +++ b/sql_api/api_workflow.py @@ -340,13 +340,20 @@ def post(self, request): "errors": "不在可执行时间范围内,如果需要修改执行时间请重新提交工单!" } ) - sys_config = SysConfig() - if not request.user.is_superuser and on_query_low_peak_time_ddl(workflow_id) is False: - start = sys_config.get("query_low_peak_start", 0) - end = sys_config.get("query_low_peak_end", 24) - raise serializers.ValidationError( - {"errMsg": "管理员设置了业务低峰期时间范围:每天%s:00至%s,你只能在业务低峰时间范围执行DDL工单操作!" % (start, end)} - ) + is_allowed, error_message = on_query_low_peak_time_ddl(workflow_id) + if not request.user.is_superuser and not is_allowed: + raise serializers.ValidationError({"errMsg": error_message}) + if not request.user.is_superuser: + sys_config = SysConfig() + is_allowed, time_periods = on_query_low_peak_time_ddl(workflow_id) + if not is_allowed: + peak_action = sys_config.get("query_low_peak_query", "") + raise serializers.ValidationError( + { + "errMsg": "管理员设置了业务低峰期时间范围:%s,你只能在业务低峰时间范围执行%s工单操作!" + % (time_periods, peak_action) + } + ) # 获取审核信息 audit_id = Audit.detail_by_workflow_id( From 06ee5e2bc284225166b68a80309cf60489132dbf Mon Sep 17 00:00:00 2001 From: "hai.yang" Date: Fri, 24 Jan 2025 17:07:17 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E4=BF=AEint=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/models.py | 6 ++++-- sql/sql_workflow.py | 2 +- sql/utils/sql_review.py | 8 ++++---- sql_api/api_workflow.py | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/sql/models.py b/sql/models.py index 8f474262dd..0393e21440 100755 --- a/sql/models.py +++ b/sql/models.py @@ -178,17 +178,19 @@ class Meta: verbose_name = "隧道配置" verbose_name_plural = "隧道配置" + def validate_peak_time_period(value): """ 验证 peak_time_period 格式是否正确。 格式示例: "14:00-14:50,15:00-16:00" """ - time_period_regex = r'^(\d{2}:\d{2}-\d{2}:\d{2})(,\d{2}:\d{2}-\d{2}:\d{2})*$' + time_period_regex = r"^(\d{2}:\d{2}-\d{2}:\d{2})(,\d{2}:\d{2}-\d{2}:\d{2})*$" if not re.match(time_period_regex, value): raise ValidationError( '时间段格式不正确,正确格式为 "HH:MM-HH:MM" 或 "HH:MM-HH:MM,HH:MM-HH:MM"' ) + class Instance(models.Model): """ 各个线上实例配置 @@ -240,7 +242,7 @@ class Instance(models.Model): max_length=255, default="", blank=True, - validators=[validate_peak_time_period] + validators=[validate_peak_time_period], ) create_time = models.DateTimeField("创建时间", auto_now_add=True) update_time = models.DateTimeField("更新时间", auto_now=True) diff --git a/sql/sql_workflow.py b/sql/sql_workflow.py index 1c992fc5a8..48a73bfe6a 100644 --- a/sql/sql_workflow.py +++ b/sql/sql_workflow.py @@ -314,7 +314,7 @@ def execute(request): peak_action = sys_config.get("query_low_peak_query", "") context = { "errMsg": "管理员设置了实例业务低峰时间范围:%s,你只能在业务低峰时间范围执行%s工单操作!" - % (time_periods, peak_action) + % (time_periods, peak_action) } return render(request, "error.html", context) diff --git a/sql/utils/sql_review.py b/sql/utils/sql_review.py index b2a2e89b37..446d5b66d4 100644 --- a/sql/utils/sql_review.py +++ b/sql/utils/sql_review.py @@ -40,6 +40,7 @@ def can_execute(user, workflow_id): result = True return result + def on_query_low_peak_time_ddl(workflow_id, run_date=None): """ 判断是否是DDL,DDL必须在业务低峰期执行,包括人工执行和定时执行 @@ -55,8 +56,7 @@ def on_query_low_peak_time_ddl(workflow_id, run_date=None): # 解析 peak_time_period 字符串为时间段列表 if peak_time_period: time_periods = [ - tuple(map(int, period.split('-'))) - for period in peak_time_period.split(',') + tuple(map(int, period.split("-"))) for period in peak_time_period.split(",") ] else: time_periods = [] @@ -68,9 +68,9 @@ def on_query_low_peak_time_ddl(workflow_id, run_date=None): # 如果是DDL操作,检查当前时间是否在低峰期 if syntax_type == 1: if not any(start <= current_hour < end for start, end in time_periods): - return False,time_periods + return False, time_periods - return True,None + return True, None def on_correct_time_period(workflow_id, run_date=None): diff --git a/sql_api/api_workflow.py b/sql_api/api_workflow.py index 8bfa12747e..347ef04fbc 100644 --- a/sql_api/api_workflow.py +++ b/sql_api/api_workflow.py @@ -351,7 +351,7 @@ def post(self, request): raise serializers.ValidationError( { "errMsg": "管理员设置了业务低峰期时间范围:%s,你只能在业务低峰时间范围执行%s工单操作!" - % (time_periods, peak_action) + % (time_periods, peak_action) } ) From 164ea8e59977686a7ceea7abe75c6346eb96d13c Mon Sep 17 00:00:00 2001 From: "hai.yang" Date: Fri, 24 Jan 2025 17:13:35 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E4=BF=AEint=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/utils/sql_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/utils/sql_review.py b/sql/utils/sql_review.py index 446d5b66d4..93f89a8710 100644 --- a/sql/utils/sql_review.py +++ b/sql/utils/sql_review.py @@ -4,7 +4,7 @@ from django.db import transaction from sql.engines.models import ReviewResult -from sql.models import SqlWorkflow,Instance +from sql.models import SqlWorkflow, Instance from common.config import SysConfig from sql.utils.resource_group import user_groups from sql.utils.sql_utils import remove_comments From d54135513c8b5bc3de211cc13dd023b8db21f76f Mon Sep 17 00:00:00 2001 From: "hai.yang" Date: Fri, 24 Jan 2025 17:22:49 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=8F=98=E6=9B=B4sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/models.py | 3 +++ src/init_sql/v1.11.4.sql | 1 + 2 files changed, 4 insertions(+) create mode 100644 src/init_sql/v1.11.4.sql diff --git a/sql/models.py b/sql/models.py index 0393e21440..9f8eec46bd 100755 --- a/sql/models.py +++ b/sql/models.py @@ -184,6 +184,9 @@ def validate_peak_time_period(value): 验证 peak_time_period 格式是否正确。 格式示例: "14:00-14:50,15:00-16:00" """ + if value is None or value == "": + return + time_period_regex = r"^(\d{2}:\d{2}-\d{2}:\d{2})(,\d{2}:\d{2}-\d{2}:\d{2})*$" if not re.match(time_period_regex, value): raise ValidationError( diff --git a/src/init_sql/v1.11.4.sql b/src/init_sql/v1.11.4.sql new file mode 100644 index 0000000000..bfebc35083 --- /dev/null +++ b/src/init_sql/v1.11.4.sql @@ -0,0 +1 @@ +ALTER TABLE sql_instance ADD COLUMN peak_time_period VARCHAR(255); \ No newline at end of file From 4575dc4f5cf78a90411ae5666603ef632ca3d1c9 Mon Sep 17 00:00:00 2001 From: "hai.yang" Date: Fri, 24 Jan 2025 17:25:50 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E4=BF=AEint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql_api/api_workflow.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sql_api/api_workflow.py b/sql_api/api_workflow.py index 347ef04fbc..9f39b84712 100644 --- a/sql_api/api_workflow.py +++ b/sql_api/api_workflow.py @@ -27,6 +27,12 @@ from sql.query_privileges import _query_apply_audit_call_back from sql.utils.resource_group import user_groups from sql.utils.sql_review import can_cancel, can_execute, on_correct_time_period,on_query_low_peak_time_ddl +from sql.utils.sql_review import ( + can_cancel, + can_execute, + on_correct_time_period, + on_query_low_peak_time_ddl, +) from sql.utils.tasks import del_schedule from sql.utils.workflow_audit import Audit, get_auditor, AuditException from .filters import WorkflowFilter, WorkflowAuditFilter From aa053eeb1e4c40ca684d00392ab7c385ea4826c1 Mon Sep 17 00:00:00 2001 From: "hai.yang" Date: Fri, 24 Jan 2025 17:27:41 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E4=BF=AEint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql_api/api_workflow.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sql_api/api_workflow.py b/sql_api/api_workflow.py index 9f39b84712..809bdcbc00 100644 --- a/sql_api/api_workflow.py +++ b/sql_api/api_workflow.py @@ -26,7 +26,6 @@ from sql.notify import notify_for_audit, notify_for_execute from sql.query_privileges import _query_apply_audit_call_back from sql.utils.resource_group import user_groups -from sql.utils.sql_review import can_cancel, can_execute, on_correct_time_period,on_query_low_peak_time_ddl from sql.utils.sql_review import ( can_cancel, can_execute, From d9785325f0bb7fe01de3989317d9b4b11fcf851a Mon Sep 17 00:00:00 2001 From: "hai.yang" Date: Fri, 24 Jan 2025 17:48:51 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9datetime=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/utils/sql_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/utils/sql_review.py b/sql/utils/sql_review.py index 93f89a8710..a1438ed9da 100644 --- a/sql/utils/sql_review.py +++ b/sql/utils/sql_review.py @@ -61,7 +61,7 @@ def on_query_low_peak_time_ddl(workflow_id, run_date=None): else: time_periods = [] - ctime = run_date or datetime.now() + ctime = run_date or datetime.datetime.now() current_hour = ctime.hour syntax_type = workflow_detail.syntax_type