提交所有代码到 qiaoxinjiu 分支
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
53
app/api/controller/automationController.py
Normal file
53
app/api/controller/automationController.py
Normal file
@@ -0,0 +1,53 @@
|
||||
# encoding: UTF-8
|
||||
from flask import g
|
||||
|
||||
from const import AUTOMATION_CALLBACK_SECRET
|
||||
from .baseCrudController import BaseCrudController
|
||||
from ..service.automationService import AutomationService
|
||||
|
||||
|
||||
class AutomationController(BaseCrudController):
|
||||
def validate_callback_secret(self):
|
||||
callback_secret = self.req_data.get('_callback_secret')
|
||||
if AUTOMATION_CALLBACK_SECRET and callback_secret != AUTOMATION_CALLBACK_SECRET:
|
||||
return False, '回调鉴权失败'
|
||||
return True, ''
|
||||
|
||||
def case_run(self):
|
||||
return AutomationService.create_case_execution(self.session, self.req_data, getattr(g, 'current_user_id', None))
|
||||
|
||||
def plan_run(self):
|
||||
return AutomationService.create_plan_execution(self.session, self.req_data, getattr(g, 'current_user_id', None))
|
||||
|
||||
def execution_list(self):
|
||||
return AutomationService.list_executions(self.session, self.req_data)
|
||||
|
||||
def execution_detail(self):
|
||||
execution_id = self._get(self.req_data, 'executionId', 'id')
|
||||
if not execution_id:
|
||||
return {}, 'executionId 为必传参数'
|
||||
return AutomationService.get_execution_detail(self.session, execution_id)
|
||||
|
||||
def execution_case_list(self):
|
||||
return AutomationService.list_execution_cases(self.session, self.req_data)
|
||||
|
||||
def execution_case_pull(self):
|
||||
execution_id = self._get(self.req_data, 'executionId', 'execution_id')
|
||||
if not execution_id:
|
||||
return {}, 'executionId 为必传参数'
|
||||
return AutomationService.pull_execution_cases(self.session, execution_id, self.req_data.get('_callback_token'))
|
||||
|
||||
def execution_queued(self):
|
||||
return AutomationService.mark_execution_queued(self.session, self.req_data)
|
||||
|
||||
def execution_start(self):
|
||||
return AutomationService.mark_execution_started(self.session, self.req_data)
|
||||
|
||||
def execution_case_result(self):
|
||||
return AutomationService.save_case_result(self.session, self.req_data)
|
||||
|
||||
def execution_finish(self):
|
||||
return AutomationService.finish_execution(self.session, self.req_data)
|
||||
|
||||
def execution_abort(self):
|
||||
return AutomationService.abort_execution(self.session, self.req_data)
|
||||
@@ -169,10 +169,12 @@ class CaseController(BaseCrudController):
|
||||
steps_value = self._get(self.req_data, 'steps', default='')
|
||||
if isinstance(steps_value, (list, dict)):
|
||||
steps_value = ''
|
||||
product_id = self._get(self.req_data, 'productId')
|
||||
module_id = self._get(self.req_data, 'moduleId')
|
||||
add_info = {
|
||||
'project_id': project_id,
|
||||
'module_id': self._get(self.req_data, 'moduleId'),
|
||||
'case_key': self._get(self.req_data, 'caseKey') or CaseService.next_case_key(self.session, project_id),
|
||||
'module_id': module_id,
|
||||
'case_key': self._get(self.req_data, 'caseKey') or CaseService.next_case_key(self.session, project_id, module_id, product_id),
|
||||
'title': title,
|
||||
'preconditions': self._get(self.req_data, 'preconditions'),
|
||||
'steps': steps_value,
|
||||
@@ -355,7 +357,7 @@ class CaseController(BaseCrudController):
|
||||
|
||||
retry_count = 0
|
||||
max_retries = 5
|
||||
case_key = CaseService.next_case_key(self.session, project_id)
|
||||
case_key = CaseService.next_case_key(self.session, project_id, module_id)
|
||||
|
||||
while retry_count < max_retries:
|
||||
try:
|
||||
|
||||
@@ -56,7 +56,7 @@ class PlanController(BaseCrudController):
|
||||
name = self._get(self.req_data, 'name')
|
||||
if not project_id or not name:
|
||||
return 0, 'projectId、name 为必传参数'
|
||||
add_info = {'project_id': project_id, 'name': name, 'version': self._get(self.req_data, 'version'), 'description': self._get(self.req_data, 'description'), 'start_date': self._get(self.req_data, 'startDate', 'start_time'), 'end_date': self._get(self.req_data, 'endDate', 'end_time'), 'owner_id': self._get(self.req_data, 'ownerId', 'owner_id'), 'status': int(self._get(self.req_data, 'status', default=0)), 'environment_id': self._get(self.req_data, 'environmentId', 'environment_id'), 'is_delete': 0}
|
||||
add_info = {'project_id': project_id, 'name': name, 'version': self._get(self.req_data, 'version'), 'description': self._get(self.req_data, 'description'), 'start_date': self._get(self.req_data, 'startDate', 'start_time'), 'end_date': self._get(self.req_data, 'endDate', 'end_time'), 'owner_id': self._get(self.req_data, 'ownerId', 'owner_id'), 'status': int(self._get(self.req_data, 'status', default=0)), 'environment_id': self._get(self.req_data, 'environmentId', 'environment_id'), 'jenkins_url': self._get(self.req_data, 'jenkinsUrl', 'jenkins_url'), 'is_auto': int(self._get(self.req_data, 'isAuto', 'is_auto', default=0)), 'is_delete': 0}
|
||||
return PlanService.create(self.session, TestPlan, add_info)
|
||||
|
||||
def plan_update(self):
|
||||
@@ -65,7 +65,7 @@ class PlanController(BaseCrudController):
|
||||
if not plan_id:
|
||||
return 0, 'planId 为必传参数'
|
||||
update_info = {}
|
||||
for req_keys, column_key in [(('name', 'name'), 'name'), (('version', 'version'), 'version'), (('description', 'description'), 'description'), (('startDate', 'start_time', 'start_date'), 'start_date'), (('endDate', 'end_time', 'end_date'), 'end_date'), (('ownerId', 'owner_id'), 'owner_id'), (('status', 'status'), 'status'), (('environmentId', 'environment_id'), 'environment_id')]:
|
||||
for req_keys, column_key in [(('name', 'name'), 'name'), (('version', 'version'), 'version'), (('description', 'description'), 'description'), (('startDate', 'start_time', 'start_date'), 'start_date'), (('endDate', 'end_time', 'end_date'), 'end_date'), (('ownerId', 'owner_id'), 'owner_id'), (('status', 'status'), 'status'), (('environmentId', 'environment_id'), 'environment_id'), (('jenkinsUrl', 'jenkins_url'), 'jenkins_url'), (('isAuto', 'is_auto'), 'is_auto')]:
|
||||
value = self._get(self.req_data, *req_keys)
|
||||
if value is not None:
|
||||
update_info[column_key] = value
|
||||
@@ -99,7 +99,7 @@ class PlanController(BaseCrudController):
|
||||
return PlanService.batch_create(self.session, PlanCase, batch_info_list)
|
||||
|
||||
def plan_case_list(self):
|
||||
plan_id = self._get(self.req_data, 'planId')
|
||||
plan_id = self._get(self.req_data, 'planId', 'plan_id')
|
||||
filters = [PlanCase.plan_id == int(plan_id)] if plan_id else []
|
||||
round_no = self._get(self.req_data, 'roundNo')
|
||||
if round_no not in (None, ''):
|
||||
@@ -151,38 +151,9 @@ class PlanController(BaseCrudController):
|
||||
update_info = {'status': int(self._get(self.req_data, 'status', default=0)), 'actual_result': self._get(self.req_data, 'actualResult'), 'defect_links': self._get(self.req_data, 'defectLinks', default=[]), 'attachments': self._get(self.req_data, 'attachments', default=[]), 'executed_time': datetime.now(), 'execution_duration': self._get(self.req_data, 'executionDuration')}
|
||||
result = PlanService.update_by_id(self.session, PlanCase, plan_case_id, update_info, soft_delete=False)
|
||||
|
||||
self._update_plan_status(plan_id)
|
||||
PlanService.refresh_plan_status(self.session, plan_id)
|
||||
|
||||
return result
|
||||
|
||||
def _update_plan_status(self, plan_id):
|
||||
total = self.session.query(PlanCase).filter(PlanCase.plan_id == plan_id).count()
|
||||
if total == 0:
|
||||
return
|
||||
|
||||
unexecuted_count = self.session.query(PlanCase).filter(PlanCase.plan_id == plan_id, PlanCase.status == 0).count()
|
||||
passed_count = self.session.query(PlanCase).filter(PlanCase.plan_id == plan_id, PlanCase.status == 1).count()
|
||||
failed_count = self.session.query(PlanCase).filter(PlanCase.plan_id == plan_id, PlanCase.status.in_([2, 3])).count()
|
||||
|
||||
plan = PlanService.get_by_id(self.session, TestPlan, plan_id)
|
||||
if not plan:
|
||||
return
|
||||
|
||||
if plan.status == 3:
|
||||
return
|
||||
|
||||
if unexecuted_count == 0:
|
||||
if failed_count == 0:
|
||||
new_status = 4
|
||||
else:
|
||||
new_status = 2
|
||||
elif unexecuted_count < total:
|
||||
new_status = 1
|
||||
else:
|
||||
new_status = plan.status
|
||||
|
||||
if new_status != plan.status:
|
||||
PlanService.update_by_id(self.session, TestPlan, plan_id, {'status': new_status})
|
||||
|
||||
def progress(self):
|
||||
"""查询计划进度统计。"""
|
||||
|
||||
@@ -208,9 +208,6 @@ class RbacController(BaseCrudController):
|
||||
(('name',), 'name'),
|
||||
(('code',), 'code'),
|
||||
(('type',), 'type'),
|
||||
(('path',), 'path'),
|
||||
(('component',), 'component'),
|
||||
(('icon',), 'icon'),
|
||||
(('permissionCode', 'permission_code'), 'permission_code'),
|
||||
(('sort',), 'sort'),
|
||||
(('visible',), 'visible'),
|
||||
@@ -220,12 +217,30 @@ class RbacController(BaseCrudController):
|
||||
value = self._get(self.req_data, *req_keys)
|
||||
if value is not None:
|
||||
update_info[column_key] = value
|
||||
|
||||
for key in ['path', 'component', 'icon']:
|
||||
if key in self.req_data:
|
||||
update_info[key] = self.req_data[key]
|
||||
|
||||
return RbacService.update_by_id(self.session, Menu, menu_id, update_info)
|
||||
|
||||
def menu_delete(self):
|
||||
menu_id = self._get(self.req_data, 'menuId', 'id')
|
||||
if not menu_id:
|
||||
return 0, 'menuId 为必传参数'
|
||||
|
||||
menu = RbacService.get_by_id(self.session, Menu, menu_id)
|
||||
if menu and menu.permission_code:
|
||||
permission = self.session.query(Permission).filter(
|
||||
Permission.code == menu.permission_code,
|
||||
Permission.is_delete == 0
|
||||
).first()
|
||||
if permission:
|
||||
self.session.query(RolePermission).filter(
|
||||
RolePermission.permission_id == permission.id,
|
||||
RolePermission.is_delete == 0
|
||||
).update({'is_delete': 1})
|
||||
|
||||
return RbacService.delete_by_id(self.session, Menu, menu_id)
|
||||
|
||||
def role_permission_list(self):
|
||||
@@ -254,4 +269,44 @@ class RbacController(BaseCrudController):
|
||||
menu_ids = self._get(self.req_data, 'menuIds', default=[])
|
||||
if not role_id:
|
||||
return 0, 'roleId 为必传参数'
|
||||
|
||||
if isinstance(menu_ids, str):
|
||||
import json
|
||||
menu_ids = json.loads(menu_ids)
|
||||
if not isinstance(menu_ids, list):
|
||||
menu_ids = []
|
||||
|
||||
menu_permission_codes = RbacService.get_menu_permission_codes(self.session, menu_ids)
|
||||
|
||||
permission_ids = RbacService.get_permission_ids_by_codes(self.session, menu_permission_codes)
|
||||
|
||||
existing_permission_ids = RbacService.get_role_permission_ids(self.session, role_id)
|
||||
|
||||
deleted_permission_ids = [pid for pid in existing_permission_ids if pid not in permission_ids]
|
||||
if deleted_permission_ids:
|
||||
self.session.query(RolePermission).filter(
|
||||
RolePermission.role_id == int(role_id),
|
||||
RolePermission.permission_id.in_(deleted_permission_ids),
|
||||
RolePermission.is_delete == 0
|
||||
).update({'is_delete': 1})
|
||||
|
||||
new_permission_ids = [pid for pid in permission_ids if pid not in existing_permission_ids]
|
||||
if new_permission_ids:
|
||||
existing_deleted = self.session.query(RolePermission).filter(
|
||||
RolePermission.role_id == int(role_id),
|
||||
RolePermission.permission_id.in_(new_permission_ids),
|
||||
RolePermission.is_delete == 1
|
||||
).all()
|
||||
existing_deleted_map = {rp.permission_id: rp for rp in existing_deleted}
|
||||
|
||||
for permission_id in new_permission_ids:
|
||||
if permission_id in existing_deleted_map:
|
||||
existing_deleted_map[permission_id].is_delete = 0
|
||||
else:
|
||||
self.session.add(RolePermission(
|
||||
role_id=int(role_id),
|
||||
permission_id=permission_id,
|
||||
is_delete=0
|
||||
))
|
||||
|
||||
return RbacService.assign_menus(self.session, role_id, menu_ids)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
from .baseCrudController import BaseCrudController
|
||||
from ..model.userModel import User
|
||||
from ..service.userService import UserService
|
||||
from ..utils.authMiddleware import TOKEN_REFRESH_THRESHOLD_SECONDS, create_token
|
||||
from ..utils.authMiddleware import TOKEN_REFRESH_THRESHOLD_SECONDS, create_token, create_refresh_token
|
||||
|
||||
|
||||
class UserController(BaseCrudController):
|
||||
@@ -118,11 +118,14 @@ class UserController(BaseCrudController):
|
||||
return {}, '用户已禁用!'
|
||||
UserService.update_last_login_time(self.session, user.id)
|
||||
token, expire_seconds = create_token(user.id)
|
||||
refresh_token, refresh_expire_seconds = create_refresh_token(user.id)
|
||||
ret = self.serialize(user, ['is_delete', 'password_hash'])
|
||||
ret['role_ids'] = UserService.get_user_role_ids(self.session, user.id)
|
||||
ret['token'] = token
|
||||
ret['token_type'] = 'Bearer'
|
||||
ret['expires_in'] = expire_seconds
|
||||
ret['refresh_token'] = refresh_token
|
||||
ret['refresh_expires_in'] = refresh_expire_seconds
|
||||
ret['refresh_threshold_seconds'] = TOKEN_REFRESH_THRESHOLD_SECONDS
|
||||
ret['refresh_mechanism'] = '请求任意已登录接口时,若token剩余有效期小于阈值则自动续期到完整有效期'
|
||||
return ret, ''
|
||||
|
||||
Reference in New Issue
Block a user