Skip to content

Commit e40d728

Browse files
authored
在前端独立展示审批流 (#2423)
* 在前端独立展示审批流 * 修复测试 * 删除老 review_info * 增加 archive detail view 的测试
1 parent f483213 commit e40d728

13 files changed

+233
-194
lines changed

conftest.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,9 @@ def create_audit_workflow(normal_user, create_resource_group):
190190
)
191191
yield audit_wf
192192
audit_wf.delete()
193+
194+
195+
@pytest.fixture
196+
def clean_auth_group(db):
197+
yield
198+
Group.objects.all().delete()

sql/notify.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
SqlWorkflowContent,
2727
)
2828
from sql.utils.resource_group import auth_group_users
29-
from sql.utils.workflow_audit import Audit
29+
from sql.utils.workflow_audit import Audit, AuditV2
3030
from sql_api.serializers import (
3131
WorkflowContentSerializer,
3232
WorkflowAuditListSerializer,
@@ -156,9 +156,8 @@ def render_audit(self):
156156
workflow_from = self.audit.create_user_display
157157
group_name = self.audit.group_name
158158
# 获取当前审批和审批流程
159-
workflow_auditors, current_workflow_auditors = Audit.review_info(
160-
self.audit.workflow_id, self.audit.workflow_type
161-
)
159+
audit_handler = AuditV2(workflow=self.workflow, audit=self.audit)
160+
review_info = audit_handler.get_review_info()
162161
# workflow content, 即申请通过后要执行什么东西
163162
# 执行的 SQL 语句, 授权的范围
164163
if workflow_type == WorkflowType.QUERY:
@@ -221,8 +220,8 @@ def render_audit(self):
221220
group_name,
222221
instance,
223222
db_name,
224-
workflow_auditors,
225-
current_workflow_auditors,
223+
review_info.readable_info,
224+
review_info.current_node.group.name,
226225
workflow_title,
227226
workflow_url,
228227
workflow_content,
@@ -238,7 +237,7 @@ def render_audit(self):
238237
group_name,
239238
instance,
240239
db_name,
241-
workflow_auditors,
240+
review_info.readable_info,
242241
workflow_title,
243242
workflow_url,
244243
workflow_content,
@@ -284,9 +283,8 @@ def render_execute(self):
284283
base_url = self.sys_config.get(
285284
"archery_base_url", "http://127.0.0.1:8000"
286285
).rstrip("/")
287-
audit_auth_group, current_audit_auth_group = Audit.review_info(
288-
self.workflow.id, 2
289-
)
286+
audit_handler = AuditV2(workflow=self.workflow, audit=self.audit)
287+
review_info = audit_handler.get_review_info()
290288
audit_id = Audit.detail_by_workflow_id(self.workflow.id, 2).audit_id
291289
url = "{base_url}/workflow/{audit_id}".format(
292290
base_url=base_url, audit_id=audit_id
@@ -305,7 +303,7 @@ def render_execute(self):
305303
组:{self.workflow.group_name}
306304
目标实例:{self.workflow.instance.instance_name}
307305
数据库:{self.workflow.db_name}
308-
审批流程:{audit_auth_group}
306+
审批流程:{review_info.readable_info}
309307
工单名称:{self.workflow.workflow_name}
310308
工单地址:{url}
311309
工单详情预览:{preview}"""

sql/templates/archivedetail.html

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,21 @@ <h4 style="display: inline;">工单名称:<span>{{ archive_config.title }}</sp
2121
<input type="hidden" id="sqlMaxRowNumber" value="{{ rows|length }}">
2222
<input type="hidden" id="editSqlContent" value="{{ archive_config.sql_content }}"/>
2323
<hr>
24+
<h4>
25+
审批流
26+
</h4>
27+
<h5>
28+
{% include "workflow_display.html" %}
29+
<h4>
30+
其他信息
31+
</h4>
2432
<table data-toggle="table" class="table table-striped table-hover"
2533
style="table-layout:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
2634
<thead>
2735
<tr>
2836
<th>
2937
申请人
3038
</th>
31-
<th>
32-
审批流程
33-
</th>
34-
<th>
35-
当前审批
36-
</th>
3739
<th>
3840
实例
3941
</th>
@@ -65,12 +67,6 @@ <h4 style="display: inline;">工单名称:<span>{{ archive_config.title }}</sp
6567
<td>
6668
{{ archive_config.user_display }}
6769
</td>
68-
<td>
69-
{{ audit_auth_group }}
70-
</td>
71-
<td>
72-
{{ current_audit_auth_group }}
73-
</td>
7470
<td>
7571
{{ archive_config.src_instance }}
7672
</td>
@@ -240,7 +236,7 @@ <h4><b>归档条件</b></h4>
240236
<br>
241237
{% endif %}
242238
{% if archive_config.status == 0 %}
243-
{% if is_can_review %}
239+
{% if can_review %}
244240
<textarea id="remark" name="remark" class="form-control" data-name="审核备注"
245241
placeholder="请填写审核备注" rows=3></textarea>
246242
<br>

sql/templates/detail.html

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,21 @@ <h4 style="display: inline;">
1818
<input type="hidden" id="sqlMaxRowNumber" value="{{ rows|length }}">
1919
<input type="hidden" id="editSqlContent" value="{{ workflow_detail.sqlworkflowcontent.sql_content }}"/>
2020
<hr>
21+
<h4>
22+
审批流
23+
</h4>
24+
<h5>
25+
{% include "workflow_display.html" %}
26+
<h4>
27+
其他信息
28+
</h4>
2129
<table data-toggle="table" class="table table-striped table-hover"
2230
style="table-layout:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
2331
<thead>
2432
<tr>
2533
<th>
2634
发起人
2735
</th>
28-
<th>
29-
审批流程
30-
</th>
31-
<th>
32-
当前审批
33-
</th>
3436
<th>
3537
目标实例
3638
</th>
@@ -65,12 +67,6 @@ <h4 style="display: inline;">
6567
<td>
6668
{{ workflow_detail.engineer_display }}
6769
</td>
68-
<td>
69-
{{ audit_auth_group }}
70-
</td>
71-
<td>
72-
{{ current_audit_auth_group }}
73-
</td>
7470
<td>
7571
{{ workflow_detail.instance.instance_name }}
7672
</td>

sql/templates/queryapplydetail.html

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,21 @@ <h4 style="display: inline;">工单名称:<span>{{ workflow_detail.title }}</s
1010
<input type="hidden" id="sqlMaxRowNumber" value="{{ rows|length }}">
1111
<input type="hidden" id="editSqlContent" value="{{ workflow_detail.sql_content }}"/>
1212
<hr>
13+
<h4>
14+
审批流
15+
</h4>
16+
<h5>
17+
{% include "workflow_display.html" %}
18+
<h4>
19+
其他信息
20+
</h4>
1321
<table data-toggle="table" class="table table-striped table-hover"
1422
style="table-layout:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
1523
<thead>
1624
<tr>
1725
<th>
1826
申请人
1927
</th>
20-
<th>
21-
审批流程
22-
</th>
23-
<th>
24-
当前审批
25-
</th>
2628
<th>
2729
实例
2830
</th>
@@ -54,12 +56,6 @@ <h4 style="display: inline;">工单名称:<span>{{ workflow_detail.title }}</s
5456
<td>
5557
{{ workflow_detail.user_display }}
5658
</td>
57-
<td>
58-
{{ audit_auth_group }}
59-
</td>
60-
<td>
61-
{{ current_audit_auth_group }}
62-
</td>
6359
<td>
6460
{{ workflow_detail.instance.instance_name }}
6561
</td>

sql/templates/workflow_display.html

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{# review_info 应为 ReviewInfo 对象, 本模板为所有用到 audit 工作流的审批共用 #}
2+
{% for n in review_info.nodes %}
3+
{% if n.is_passed_node %}
4+
<span class="text-success">{{ n.group.name }}</span>
5+
{% elif n.is_current_node %}
6+
<!-- 当前节点 -->
7+
<u class="text-danger">
8+
{{ n.group.name }}(
9+
{% for u in n.group.user_set.all %}
10+
<span class="text-primary">{{ u.username }}</span>
11+
{% endfor %})
12+
</u>
13+
{% else %}
14+
{{ n.group.name }}
15+
{% endif %}
16+
{% if not forloop.last %}
17+
<span class="glyphicon glyphicon-arrow-right" aria-hidden="true"></span>
18+
{% endif %}
19+
{% endfor %}

sql/test_archiver.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
from django.conf import settings
55
from django.contrib.auth.models import Permission
66
from django.test import TestCase, Client
7+
from pytest_django.asserts import assertTemplateUsed
78

89
from common.config import SysConfig
910
from common.utils.const import WorkflowStatus, WorkflowType
10-
from sql.utils.workflow_audit import AuditSetting
11+
from sql.utils.workflow_audit import AuditSetting, AuditV2
1112
from sql.archiver import add_archive_task, archive
1213
from sql.models import (
1314
Instance,
@@ -299,3 +300,23 @@ def test_archive_log(self, _async_task):
299300
self.client.force_login(self.superuser)
300301
r = self.client.post(path="/archive/log/", data=data)
301302
self.assertDictEqual(json.loads(r.content), {"total": 0, "rows": []})
303+
304+
305+
def test_archive_detail_view(
306+
archive_apply,
307+
resource_group,
308+
admin_client,
309+
fake_generate_audit_setting,
310+
create_auth_group,
311+
):
312+
audit = AuditV2(workflow=archive_apply, resource_group=resource_group.group_name)
313+
audit.create_audit()
314+
audit.workflow.save()
315+
response = admin_client.get(f"/archive/{archive_apply.id}/")
316+
assert response.status_code == 200
317+
assertTemplateUsed(response, "archivedetail.html")
318+
review_info = response.context["review_info"]
319+
assert len(review_info.nodes) == len(
320+
fake_generate_audit_setting.return_value.audit_auth_groups
321+
)
322+
assert review_info.nodes[0].group.name == create_auth_group.name

sql/test_notify.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ def setUp(self):
131131
workflow_type=1,
132132
workflow_title="申请标题",
133133
workflow_remark="申请备注",
134-
audit_auth_groups="1,2,3",
135-
current_audit="1",
136-
next_audit="2",
134+
audit_auth_groups=",".join([str(self.aug.id)]),
135+
current_audit=str(self.aug.id),
136+
next_audit="-1",
137137
current_status=0,
138138
)
139139
self.audit_query_detail = WorkflowAuditDetail.objects.create(
@@ -167,9 +167,9 @@ def setUp(self):
167167
workflow_type=3,
168168
workflow_title=self.archive_apply.title,
169169
workflow_remark="申请备注",
170-
audit_auth_groups="1,2,3",
171-
current_audit="1",
172-
next_audit="2",
170+
audit_auth_groups=",".join([str(self.aug.id)]),
171+
current_audit=str(self.aug.id),
172+
next_audit="-1",
173173
current_status=0,
174174
)
175175

sql/test_workflow.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ def test_get_sql_workflow(
1919
assert response.status_code == 200
2020
assertTemplateUsed(response, "detail.html")
2121
# 展示审批人用户名
22-
assert (
23-
response.context["current_audit_auth_group"]
24-
== f"{create_auth_group.name}: {super_user.username}"
22+
review_info = response.context["review_info"]
23+
assert len(review_info.nodes) == len(
24+
fake_generate_audit_setting.return_value.audit_auth_groups
2525
)
26+
assert review_info.nodes[0].group.name == create_auth_group.name

sql/tests.py

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -825,52 +825,6 @@ def test_alter_run_date(self, _can_review):
825825
r, f"/detail/{self.wf1.id}/", fetch_redirect_response=False
826826
)
827827

828-
@patch("sql.utils.workflow_audit.Audit.logs")
829-
@patch("sql.utils.workflow_audit.Audit.detail_by_workflow_id")
830-
@patch("sql.utils.workflow_audit.Audit.review_info")
831-
@patch("sql.utils.workflow_audit.Audit.can_review")
832-
def testWorkflowDetailView(self, _can_review, _review_info, _detail_by_id, _logs):
833-
"""测试工单详情"""
834-
_review_info.return_value = ("some_auth_group", "current_auth_group")
835-
_can_review.return_value = False
836-
_detail_by_id.return_value.audit_id = 123
837-
_logs.return_value.latest("id").operation_info = ""
838-
c = Client()
839-
c.force_login(self.u1)
840-
r = c.get("/detail/{}/".format(self.wf1.id))
841-
expected_status_display = r"""id="workflow_detail_disaply">已正常结束"""
842-
self.assertContains(r, expected_status_display)
843-
exepcted_status = r"""id="workflow_detail_status">workflow_finish"""
844-
self.assertContains(r, exepcted_status)
845-
846-
# 测试执行详情解析失败
847-
self.wfc1.execute_result = "cannotbedecode:1,:"
848-
self.wfc1.save()
849-
r = c.get("/detail/{}/".format(self.wf1.id))
850-
self.assertContains(r, expected_status_display)
851-
self.assertContains(r, exepcted_status)
852-
853-
# 执行详情为空
854-
self.wfc1.review_content = [
855-
{
856-
"id": 1,
857-
"stage": "CHECKED",
858-
"errlevel": 0,
859-
"stagestatus": "Audit completed",
860-
"errormessage": "None",
861-
"sql": "use archery",
862-
"affected_rows": 0,
863-
"sequence": "'0_0_0'",
864-
"backup_dbname": "None",
865-
"execute_time": "0",
866-
"sqlsha1": "",
867-
"actual_affected_rows": "",
868-
}
869-
]
870-
self.wfc1.execute_result = ""
871-
self.wfc1.save()
872-
r = c.get("/detail/{}/".format(self.wf1.id))
873-
874828
def testWorkflowListView(self):
875829
"""测试工单列表"""
876830
c = Client()

0 commit comments

Comments
 (0)