Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

在前端独立展示审批流 (#2423) #4

Merged
merged 1 commit into from
Nov 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,3 +190,9 @@ def create_audit_workflow(normal_user, create_resource_group):
)
yield audit_wf
audit_wf.delete()


@pytest.fixture
def clean_auth_group(db):
yield
Group.objects.all().delete()
20 changes: 9 additions & 11 deletions sql/notify.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
SqlWorkflowContent,
)
from sql.utils.resource_group import auth_group_users
from sql.utils.workflow_audit import Audit
from sql.utils.workflow_audit import Audit, AuditV2
from sql_api.serializers import (
WorkflowContentSerializer,
WorkflowAuditListSerializer,
Expand Down Expand Up @@ -156,9 +156,8 @@ def render_audit(self):
workflow_from = self.audit.create_user_display
group_name = self.audit.group_name
# 获取当前审批和审批流程
workflow_auditors, current_workflow_auditors = Audit.review_info(
self.audit.workflow_id, self.audit.workflow_type
)
audit_handler = AuditV2(workflow=self.workflow, audit=self.audit)
review_info = audit_handler.get_review_info()
# workflow content, 即申请通过后要执行什么东西
# 执行的 SQL 语句, 授权的范围
if workflow_type == WorkflowType.QUERY:
Expand Down Expand Up @@ -221,8 +220,8 @@ def render_audit(self):
group_name,
instance,
db_name,
workflow_auditors,
current_workflow_auditors,
review_info.readable_info,
review_info.current_node.group.name,
workflow_title,
workflow_url,
workflow_content,
Expand All @@ -238,7 +237,7 @@ def render_audit(self):
group_name,
instance,
db_name,
workflow_auditors,
review_info.readable_info,
workflow_title,
workflow_url,
workflow_content,
Expand Down Expand Up @@ -284,9 +283,8 @@ def render_execute(self):
base_url = self.sys_config.get(
"archery_base_url", "http://127.0.0.1:8000"
).rstrip("/")
audit_auth_group, current_audit_auth_group = Audit.review_info(
self.workflow.id, 2
)
audit_handler = AuditV2(workflow=self.workflow, audit=self.audit)
review_info = audit_handler.get_review_info()
audit_id = Audit.detail_by_workflow_id(self.workflow.id, 2).audit_id
url = "{base_url}/workflow/{audit_id}".format(
base_url=base_url, audit_id=audit_id
Expand All @@ -305,7 +303,7 @@ def render_execute(self):
组:{self.workflow.group_name}
目标实例:{self.workflow.instance.instance_name}
数据库:{self.workflow.db_name}
审批流程:{audit_auth_group}
审批流程:{review_info.readable_info}
工单名称:{self.workflow.workflow_name}
工单地址:{url}
工单详情预览:{preview}"""
Expand Down
22 changes: 9 additions & 13 deletions sql/templates/archivedetail.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,21 @@ <h4 style="display: inline;">工单名称:<span>{{ archive_config.title }}</sp
<input type="hidden" id="sqlMaxRowNumber" value="{{ rows|length }}">
<input type="hidden" id="editSqlContent" value="{{ archive_config.sql_content }}"/>
<hr>
<h4>
审批流
</h4>
<h5>
{% include "workflow_display.html" %}
<h4>
其他信息
</h4>
<table data-toggle="table" class="table table-striped table-hover"
style="table-layout:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
<thead>
<tr>
<th>
申请人
</th>
<th>
审批流程
</th>
<th>
当前审批
</th>
<th>
实例
</th>
Expand Down Expand Up @@ -65,12 +67,6 @@ <h4 style="display: inline;">工单名称:<span>{{ archive_config.title }}</sp
<td>
{{ archive_config.user_display }}
</td>
<td>
{{ audit_auth_group }}
</td>
<td>
{{ current_audit_auth_group }}
</td>
<td>
{{ archive_config.src_instance }}
</td>
Expand Down Expand Up @@ -240,7 +236,7 @@ <h4><b>归档条件</b></h4>
<br>
{% endif %}
{% if archive_config.status == 0 %}
{% if is_can_review %}
{% if can_review %}
<textarea id="remark" name="remark" class="form-control" data-name="审核备注"
placeholder="请填写审核备注" rows=3></textarea>
<br>
Expand Down
20 changes: 8 additions & 12 deletions sql/templates/detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,21 @@ <h4 style="display: inline;">
<input type="hidden" id="sqlMaxRowNumber" value="{{ rows|length }}">
<input type="hidden" id="editSqlContent" value="{{ workflow_detail.sqlworkflowcontent.sql_content }}"/>
<hr>
<h4>
审批流
</h4>
<h5>
{% include "workflow_display.html" %}
<h4>
其他信息
</h4>
<table data-toggle="table" class="table table-striped table-hover"
style="table-layout:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
<thead>
<tr>
<th>
发起人
</th>
<th>
审批流程
</th>
<th>
当前审批
</th>
<th>
目标实例
</th>
Expand Down Expand Up @@ -65,12 +67,6 @@ <h4 style="display: inline;">
<td>
{{ workflow_detail.engineer_display }}
</td>
<td>
{{ audit_auth_group }}
</td>
<td>
{{ current_audit_auth_group }}
</td>
<td>
{{ workflow_detail.instance.instance_name }}
</td>
Expand Down
20 changes: 8 additions & 12 deletions sql/templates/queryapplydetail.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,21 @@ <h4 style="display: inline;">工单名称:<span>{{ workflow_detail.title }}</s
<input type="hidden" id="sqlMaxRowNumber" value="{{ rows|length }}">
<input type="hidden" id="editSqlContent" value="{{ workflow_detail.sql_content }}"/>
<hr>
<h4>
审批流
</h4>
<h5>
{% include "workflow_display.html" %}
<h4>
其他信息
</h4>
<table data-toggle="table" class="table table-striped table-hover"
style="table-layout:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
<thead>
<tr>
<th>
申请人
</th>
<th>
审批流程
</th>
<th>
当前审批
</th>
<th>
实例
</th>
Expand Down Expand Up @@ -54,12 +56,6 @@ <h4 style="display: inline;">工单名称:<span>{{ workflow_detail.title }}</s
<td>
{{ workflow_detail.user_display }}
</td>
<td>
{{ audit_auth_group }}
</td>
<td>
{{ current_audit_auth_group }}
</td>
<td>
{{ workflow_detail.instance.instance_name }}
</td>
Expand Down
19 changes: 19 additions & 0 deletions sql/templates/workflow_display.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{# review_info 应为 ReviewInfo 对象, 本模板为所有用到 audit 工作流的审批共用 #}
{% for n in review_info.nodes %}
{% if n.is_passed_node %}
<span class="text-success">{{ n.group.name }}</span>
{% elif n.is_current_node %}
<!-- 当前节点 -->
<u class="text-danger">
{{ n.group.name }}(
{% for u in n.group.user_set.all %}
<span class="text-primary">{{ u.username }}</span>
{% endfor %})
</u>
{% else %}
{{ n.group.name }}
{% endif %}
{% if not forloop.last %}
<span class="glyphicon glyphicon-arrow-right" aria-hidden="true"></span>
{% endif %}
{% endfor %}
23 changes: 22 additions & 1 deletion sql/test_archiver.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
from django.conf import settings
from django.contrib.auth.models import Permission
from django.test import TestCase, Client
from pytest_django.asserts import assertTemplateUsed

from common.config import SysConfig
from common.utils.const import WorkflowStatus, WorkflowType
from sql.utils.workflow_audit import AuditSetting
from sql.utils.workflow_audit import AuditSetting, AuditV2
from sql.archiver import add_archive_task, archive
from sql.models import (
Instance,
Expand Down Expand Up @@ -299,3 +300,23 @@ def test_archive_log(self, _async_task):
self.client.force_login(self.superuser)
r = self.client.post(path="/archive/log/", data=data)
self.assertDictEqual(json.loads(r.content), {"total": 0, "rows": []})


def test_archive_detail_view(
archive_apply,
resource_group,
admin_client,
fake_generate_audit_setting,
create_auth_group,
):
audit = AuditV2(workflow=archive_apply, resource_group=resource_group.group_name)
audit.create_audit()
audit.workflow.save()
response = admin_client.get(f"/archive/{archive_apply.id}/")
assert response.status_code == 200
assertTemplateUsed(response, "archivedetail.html")
review_info = response.context["review_info"]
assert len(review_info.nodes) == len(
fake_generate_audit_setting.return_value.audit_auth_groups
)
assert review_info.nodes[0].group.name == create_auth_group.name
12 changes: 6 additions & 6 deletions sql/test_notify.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,9 @@ def setUp(self):
workflow_type=1,
workflow_title="申请标题",
workflow_remark="申请备注",
audit_auth_groups="1,2,3",
current_audit="1",
next_audit="2",
audit_auth_groups=",".join([str(self.aug.id)]),
current_audit=str(self.aug.id),
next_audit="-1",
current_status=0,
)
self.audit_query_detail = WorkflowAuditDetail.objects.create(
Expand Down Expand Up @@ -167,9 +167,9 @@ def setUp(self):
workflow_type=3,
workflow_title=self.archive_apply.title,
workflow_remark="申请备注",
audit_auth_groups="1,2,3",
current_audit="1",
next_audit="2",
audit_auth_groups=",".join([str(self.aug.id)]),
current_audit=str(self.aug.id),
next_audit="-1",
current_status=0,
)

Expand Down
7 changes: 4 additions & 3 deletions sql/test_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ def test_get_sql_workflow(
assert response.status_code == 200
assertTemplateUsed(response, "detail.html")
# 展示审批人用户名
assert (
response.context["current_audit_auth_group"]
== f"{create_auth_group.name}: {super_user.username}"
review_info = response.context["review_info"]
assert len(review_info.nodes) == len(
fake_generate_audit_setting.return_value.audit_auth_groups
)
assert review_info.nodes[0].group.name == create_auth_group.name
46 changes: 0 additions & 46 deletions sql/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -825,52 +825,6 @@ def test_alter_run_date(self, _can_review):
r, f"/detail/{self.wf1.id}/", fetch_redirect_response=False
)

@patch("sql.utils.workflow_audit.Audit.logs")
@patch("sql.utils.workflow_audit.Audit.detail_by_workflow_id")
@patch("sql.utils.workflow_audit.Audit.review_info")
@patch("sql.utils.workflow_audit.Audit.can_review")
def testWorkflowDetailView(self, _can_review, _review_info, _detail_by_id, _logs):
"""测试工单详情"""
_review_info.return_value = ("some_auth_group", "current_auth_group")
_can_review.return_value = False
_detail_by_id.return_value.audit_id = 123
_logs.return_value.latest("id").operation_info = ""
c = Client()
c.force_login(self.u1)
r = c.get("/detail/{}/".format(self.wf1.id))
expected_status_display = r"""id="workflow_detail_disaply">已正常结束"""
self.assertContains(r, expected_status_display)
exepcted_status = r"""id="workflow_detail_status">workflow_finish"""
self.assertContains(r, exepcted_status)

# 测试执行详情解析失败
self.wfc1.execute_result = "cannotbedecode:1,:"
self.wfc1.save()
r = c.get("/detail/{}/".format(self.wf1.id))
self.assertContains(r, expected_status_display)
self.assertContains(r, exepcted_status)

# 执行详情为空
self.wfc1.review_content = [
{
"id": 1,
"stage": "CHECKED",
"errlevel": 0,
"stagestatus": "Audit completed",
"errormessage": "None",
"sql": "use archery",
"affected_rows": 0,
"sequence": "'0_0_0'",
"backup_dbname": "None",
"execute_time": "0",
"sqlsha1": "",
"actual_affected_rows": "",
}
]
self.wfc1.execute_result = ""
self.wfc1.save()
r = c.get("/detail/{}/".format(self.wf1.id))

def testWorkflowListView(self):
"""测试工单列表"""
c = Client()
Expand Down
Loading
Loading