Skip to content

Commit 687464b

Browse files
committed
工单部分接口调用合并至api
1 parent d81eb68 commit 687464b

File tree

15 files changed

+279
-240
lines changed

15 files changed

+279
-240
lines changed

archery/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@
198198
"rest_framework.authentication.SessionAuthentication",
199199
),
200200
# 权限
201-
"DEFAULT_PERMISSION_CLASSES": ("sql_api.permissions.IsInUserWhitelist",),
201+
"DEFAULT_PERMISSION_CLASSES": ("sql_api.permissions.common.IsInUserWhitelist",),
202202
# 限速(anon:未认证用户 user:认证用户)
203203
"DEFAULT_THROTTLE_CLASSES": (
204204
"rest_framework.throttling.AnonRateThrottle",

sql/sql_workflow.py

Lines changed: 10 additions & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -7,195 +7,31 @@
77
from django.contrib.auth.decorators import permission_required
88
from django.core.exceptions import PermissionDenied
99
from django.db import transaction
10-
from django.db.models import Q
1110
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
1211
from django.shortcuts import render, get_object_or_404
1312
from django.urls import reverse
14-
from django.utils import timezone
1513

1614
from common.config import SysConfig
17-
from common.utils.const import Const, WorkflowDict
15+
from common.utils.const import WorkflowDict
1816
from common.utils.extend_json_encoder import ExtendJSONEncoder
19-
from sql.engines.models import ReviewResult, ReviewSet
2017
from sql.notify import notify_for_audit, notify_for_execute
21-
from sql.models import ResourceGroup
22-
from sql.utils.resource_group import user_groups, user_instances
2318
from sql.utils.tasks import add_sql_schedule, del_schedule
2419
from sql.utils.sql_review import (
2520
can_timingtask,
2621
can_cancel,
2722
can_execute,
2823
on_correct_time_period,
29-
can_view,
3024
can_rollback,
3125
)
3226
from sql.utils.workflow_audit import Audit
33-
from .models import SqlWorkflow, SqlWorkflowContent, Instance
27+
from .models import SqlWorkflow
3428
from django_q.tasks import async_task
3529

3630
from sql.engines import get_engine
3731

3832
logger = logging.getLogger("default")
3933

4034

41-
@permission_required("sql.menu_sqlworkflow", raise_exception=True)
42-
def sql_workflow_list(request):
43-
return _sql_workflow_list(request)
44-
45-
46-
@permission_required("sql.audit_user", raise_exception=True)
47-
def sql_workflow_list_audit(request):
48-
return _sql_workflow_list(request)
49-
50-
51-
def _sql_workflow_list(request):
52-
"""
53-
获取审核列表
54-
:param request:
55-
:return:
56-
"""
57-
nav_status = request.POST.get("navStatus")
58-
instance_id = request.POST.get("instance_id")
59-
resource_group_id = request.POST.get("group_id")
60-
start_date = request.POST.get("start_date")
61-
end_date = request.POST.get("end_date")
62-
limit = int(request.POST.get("limit", 0))
63-
offset = int(request.POST.get("offset", 0))
64-
limit = offset + limit
65-
limit = limit if limit else None
66-
search = request.POST.get("search")
67-
user = request.user
68-
69-
# 组合筛选项
70-
filter_dict = dict()
71-
# 工单状态
72-
if nav_status:
73-
filter_dict["status"] = nav_status
74-
# 实例
75-
if instance_id:
76-
filter_dict["instance_id"] = instance_id
77-
# 资源组
78-
if resource_group_id:
79-
filter_dict["group_id"] = resource_group_id
80-
# 时间
81-
if start_date and end_date:
82-
end_date = datetime.datetime.strptime(
83-
end_date, "%Y-%m-%d"
84-
) + datetime.timedelta(days=1)
85-
filter_dict["create_time__range"] = (start_date, end_date)
86-
# 管理员,审计员,可查看所有工单
87-
if user.is_superuser or user.has_perm("sql.audit_user"):
88-
pass
89-
# 非管理员,拥有审核权限、资源组粒度执行权限的,可以查看组内所有工单
90-
elif user.has_perm("sql.sql_review") or user.has_perm(
91-
"sql.sql_execute_for_resource_group"
92-
):
93-
# 先获取用户所在资源组列表
94-
group_list = user_groups(user)
95-
group_ids = [group.group_id for group in group_list]
96-
filter_dict["group_id__in"] = group_ids
97-
# 其他人只能查看自己提交的工单
98-
else:
99-
filter_dict["engineer"] = user.username
100-
101-
# 过滤组合筛选项
102-
workflow = SqlWorkflow.objects.filter(**filter_dict)
103-
104-
# 过滤搜索项,模糊检索项包括提交人名称、工单名
105-
if search:
106-
workflow = workflow.filter(
107-
Q(engineer_display__icontains=search) | Q(workflow_name__icontains=search)
108-
)
109-
110-
count = workflow.count()
111-
workflow_list = workflow.order_by("-create_time")[offset:limit].values(
112-
"id",
113-
"workflow_name",
114-
"engineer_display",
115-
"status",
116-
"is_backup",
117-
"create_time",
118-
"instance__instance_name",
119-
"db_name",
120-
"group_name",
121-
"syntax_type",
122-
)
123-
124-
# QuerySet 序列化
125-
rows = [row for row in workflow_list]
126-
result = {"total": count, "rows": rows}
127-
# 返回查询结果
128-
return HttpResponse(
129-
json.dumps(result, cls=ExtendJSONEncoder, bigint_as_string=True),
130-
content_type="application/json",
131-
)
132-
133-
134-
def detail_content(request):
135-
"""获取工单内容"""
136-
workflow_id = request.GET.get("workflow_id")
137-
workflow_detail = get_object_or_404(SqlWorkflow, pk=workflow_id)
138-
if not can_view(request.user, workflow_id):
139-
raise PermissionDenied
140-
if workflow_detail.status in ["workflow_finish", "workflow_exception"]:
141-
rows = workflow_detail.sqlworkflowcontent.execute_result
142-
else:
143-
rows = workflow_detail.sqlworkflowcontent.review_content
144-
145-
review_result = ReviewSet()
146-
if rows:
147-
try:
148-
# 检验rows能不能正常解析
149-
loaded_rows = json.loads(rows)
150-
# 兼容旧数据'[[]]'格式,转换为新格式[{}]
151-
if isinstance(loaded_rows[-1], list):
152-
for r in loaded_rows:
153-
review_result.rows += [ReviewResult(inception_result=r)]
154-
rows = review_result.json()
155-
except IndexError:
156-
review_result.rows += [
157-
ReviewResult(
158-
id=1,
159-
sql=workflow_detail.sqlworkflowcontent.sql_content,
160-
errormessage="Json decode failed." "执行结果Json解析失败, 请联系管理员",
161-
)
162-
]
163-
rows = review_result.json()
164-
except json.decoder.JSONDecodeError:
165-
review_result.rows += [
166-
ReviewResult(
167-
id=1,
168-
sql=workflow_detail.sqlworkflowcontent.sql_content,
169-
# 迫于无法单元测试这里加上英文报错信息
170-
errormessage="Json decode failed." "执行结果Json解析失败, 请联系管理员",
171-
)
172-
]
173-
rows = review_result.json()
174-
else:
175-
rows = workflow_detail.sqlworkflowcontent.review_content
176-
177-
result = {"rows": json.loads(rows)}
178-
return HttpResponse(json.dumps(result), content_type="application/json")
179-
180-
181-
def backup_sql(request):
182-
"""获取回滚语句"""
183-
workflow_id = request.GET.get("workflow_id")
184-
if not can_rollback(request.user, workflow_id):
185-
raise PermissionDenied
186-
workflow = get_object_or_404(SqlWorkflow, pk=workflow_id)
187-
188-
try:
189-
query_engine = get_engine(instance=workflow.instance)
190-
list_backup_sql = query_engine.get_rollback(workflow=workflow)
191-
except Exception as msg:
192-
logger.error(traceback.format_exc())
193-
return JsonResponse({"status": 1, "msg": f"{msg}", "rows": []})
194-
195-
result = {"status": 0, "msg": "", "rows": list_backup_sql}
196-
return HttpResponse(json.dumps(result), content_type="application/json")
197-
198-
19935
@permission_required("sql.sql_review", raise_exception=True)
20036
def alter_run_date(request):
20137
"""
@@ -264,8 +100,8 @@ def passed(request):
264100

265101
# 按照审核结果更新业务表审核状态
266102
if (
267-
audit_result["data"]["workflow_status"]
268-
== WorkflowDict.workflow_status["audit_success"]
103+
audit_result["data"]["workflow_status"]
104+
== WorkflowDict.workflow_status["audit_success"]
269105
):
270106
# 将流程状态修改为审核通过
271107
SqlWorkflow(id=workflow_id, status="workflow_review_pass").save(
@@ -303,8 +139,8 @@ def execute(request):
303139
"""
304140
# 校验多个权限
305141
if not (
306-
request.user.has_perm("sql.sql_execute")
307-
or request.user.has_perm("sql.sql_execute_for_resource_group")
142+
request.user.has_perm("sql.sql_execute")
143+
or request.user.has_perm("sql.sql_execute_for_resource_group")
308144
):
309145
raise PermissionDenied
310146
workflow_id = int(request.POST.get("workflow_id", 0))
@@ -390,8 +226,8 @@ def timing_task(request):
390226
"""
391227
# 校验多个权限
392228
if not (
393-
request.user.has_perm("sql.sql_execute")
394-
or request.user.has_perm("sql.sql_execute_for_resource_group")
229+
request.user.has_perm("sql.sql_execute")
230+
or request.user.has_perm("sql.sql_execute_for_resource_group")
395231
):
396232
raise PermissionDenied
397233
workflow_id = request.POST.get("workflow_id")
@@ -537,8 +373,8 @@ def cancel(request):
537373
workflow_type=WorkflowDict.workflow_type["sqlreview"],
538374
)
539375
if audit_detail.current_status in (
540-
WorkflowDict.workflow_status["audit_abort"],
541-
WorkflowDict.workflow_status["audit_reject"],
376+
WorkflowDict.workflow_status["audit_abort"],
377+
WorkflowDict.workflow_status["audit_reject"],
542378
):
543379
async_task(
544380
notify_for_audit,

sql/templates/audit_sqlworkflow.html

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ <h4 class="modal-title text-danger">工单日志</h4>
125125
//初始化table
126126
$('#sqlaudit-list').bootstrapTable('destroy').bootstrapTable({
127127
escape: true,
128-
method: 'post',
129-
contentType: "application/x-www-form-urlencoded",
130-
url: "/sqlworkflow_list_audit/",
128+
method: 'get',
129+
contentType: "application/json",
130+
url: "/api/v2/workflow/sql/",
131131
striped: true, //是否显示行间隔色
132132
cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
133133
pagination: true, //是否显示分页(*)
@@ -140,7 +140,7 @@ <h4 class="modal-title text-danger">工单日志</h4>
140140
showExport: true, //是否显示导出按钮
141141
exportDataType: "all",
142142
exportOptions: {
143-
fileName: "sqlworkflow_" + dateFormat("yyyyMMddhhmmss",new Date())
143+
fileName: "sqlworkflow_" + dateFormat("yyyyMMddhhmmss", new Date())
144144
},
145145
search: true, //是否显示表格搜索
146146
strictSearch: false, //是否全匹配搜索
@@ -154,7 +154,7 @@ <h4 class="modal-title text-danger">工单日志</h4>
154154
detailView: false, //是否显示父子表
155155
locale: 'zh-CN', //本地化
156156
toolbar: "#toolbar", //指明自定义的toolbar
157-
queryParamsType: 'limit',
157+
queryParamsType: '',
158158
//请求服务数据时所传参数
159159
queryParams:
160160
function (params) {
@@ -168,14 +168,14 @@ <h4 class="modal-title text-danger">工单日志</h4>
168168
end_date = ''
169169
}
170170
return {
171-
limit: params.limit,
172-
offset: params.offset,
173-
navStatus: $("#navStatus").val(),
171+
page: params.pageNumber,
172+
page_size: params.pageSize,
173+
status: $("#navStatus").val(),
174174
instance_id: $("#instance_id").val(),
175175
group_id: $("#group_id").val(),
176-
start_date: start_date,
177-
end_date: end_date,
178-
search: params.search
176+
create_time_before: end_date,
177+
create_time_after: start_date,
178+
search: params.searchText
179179
}
180180
},
181181
columns: [{

sql/templates/detail.html

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -539,16 +539,16 @@ <h4 class="modal-title text-danger">修改可执行时间</h4>
539539
$('#tb-detail').bootstrapTable('destroy').bootstrapTable({
540540
escape: true,
541541
method: 'get',
542-
contentType: "application/x-www-form-urlencoded",
543-
url: "/sqlworkflow/detail_content/",
542+
contentType: "application/json",
543+
url: "/api/v2/workflow/sql/{{ workflow_detail.id }}/",
544544
striped: true, //是否显示行间隔色
545545
cache: true, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
546546
pagination: true, //是否显示分页(*)
547547
sortable: true, //是否启用排序
548548
sidePagination: "client", //分页方式:client客户端分页,server服务端分页(*)
549549
pageNumber: 1, //初始化加载第一页,默认第一页,并记录
550-
pageSize: 500, //每页的记录行数(*)
551-
pageList: [500, 1000, 5000], //可供选择的每页的行数(*)
550+
pageSize: 14, //每页的记录行数(*)
551+
pageList: [14, 500, 1000, 5000], //可供选择的每页的行数(*)
552552
search: true, //是否显示表格搜索
553553
strictSearch: false, //是否全匹配搜索
554554
showColumns: true, //是否显示所有的列(选择显示的列)
@@ -588,14 +588,6 @@ <h4 class="modal-title text-danger">修改可执行时间</h4>
588588
});
589589
return html.join('');
590590
},
591-
queryParamsType: 'limit',
592-
//请求服务数据时所传参数
593-
queryParams:
594-
function (params) {
595-
return {
596-
workflow_id: "{{ workflow_detail.id }}",
597-
}
598-
},
599591
locale: 'zh-CN', //本地化
600592
columns: [{
601593
title: 'ID',
@@ -609,7 +601,7 @@ <h4 class="modal-title text-danger">修改可执行时间</h4>
609601
title: 'SQL内容',
610602
field: 'sql',
611603
formatter: function (value, row, index) {
612-
var sql=row.sql;
604+
var sql = row.sql;
613605
if (sql.length > 80) {
614606
return sql.substr(0, 80) + '...';
615607
} else {
@@ -674,6 +666,10 @@ <h4 class="modal-title text-danger">修改可执行时间</h4>
674666
}
675667
return {classes: style}
676668
},
669+
responseHandler: function (data) {
670+
//在ajax获取到数据,渲染表格之前,修改数据源
671+
return data.display_content;
672+
},
677673
onLoadSuccess: function () {
678674
},
679675
onLoadError: onLoadErrorCallback,

0 commit comments

Comments
 (0)