diff --git a/models/product_model.py b/models/product_model.py index 52f5bcbcdcdd59b8523e5f4ebaf59a7afe192e48..fc251d1595b0d87d6f37af49848d3fec8a32fde1 100644 --- a/models/product_model.py +++ b/models/product_model.py @@ -1,4 +1,6 @@ -from sqlalchemy import Column, String, Integer +from sqlalchemy import Column, String, Integer, select + +from app import db from models import CommonModel @@ -11,8 +13,7 @@ class TestProduct(CommonModel): desc = Column(String(256), nullable=True, comment='产品描述') test_method = Column(String(256), nullable=True, comment='测试方法') test_requirement = Column(String(256), nullable=True, comment='测试要求') - owner = Column(String(256), nullable=False, comment='测试产品负责人') - executor = Column(String(256), nullable=False, comment='测试产品执行人') + owner = Column(String(256), nullable=False, comment='测试产品创建人') class ProductCategory(CommonModel): @@ -26,3 +27,17 @@ class ProductPlan(CommonModel): test_product_id = Column(Integer(), nullable=False, default=0, comment='测试产品id') plan_id = Column(Integer(), nullable=False, default=0, comment='测试产品实际复制执行的plan id') + executor = Column(String(256), nullable=False, comment='测试产品执行者') + + +async def query_product_detail_info(ids): + select_orm = select(TestProduct, ProductCategory.name).where( + TestProduct.id.in_(ids), TestProduct.category_id == ProductCategory.id) + async with db.conn() as session: + results = await session.execute(select_orm) + product_dict = dict() + for result in results: + product = result[0].to_dict() + product.update({"category_name": result[1]}) + product_dict[product["id"]] = product + return product_dict diff --git a/services/product_service.py b/services/product_service.py index 164a8b8d7c481a8369b4789eee8682692d2e2286..ee103ce2548651055328482bf332f505e29395e8 100644 --- a/services/product_service.py +++ b/services/product_service.py @@ -1,11 +1,11 @@ from datetime import datetime from common.enums import User_Role -from models.product_model import TestProduct, ProductCategory, ProductPlan from models.plan_model import Plan -from services.plan_service import run_task, make_a_copy -from services.const import ERROR_NO_OP_PERMISSION, ERROR_UN_EXISTED_PRODUCT, ERROR_UN_EXISTED_TASK,\ +from models.product_model import TestProduct, ProductCategory, ProductPlan, query_product_detail_info +from services.const import ERROR_NO_OP_PERMISSION, ERROR_UN_EXISTED_PRODUCT, ERROR_UN_EXISTED_TASK, \ ERROR_DUPLICATED_NAME +from services.plan_service import run_task, make_a_copy ERROR_UN_EXISTED_CASE_IN_PLAN = '该用例不存在于当前方案中,禁止关联' @@ -15,39 +15,46 @@ async def get_products(name=None, is_paginate='', page_num=1, page_size=10): if name: conditions_list.append(TestProduct.name.startswith(name)) conditions_dict['name'] = f'{name}%' - product_list = await TestProduct.query_dict_all(*conditions_list) + product_list = await TestProduct.query_obj_all(*conditions_list) + category_set, plan_set = set(), set() + for product in product_list: + category_set.add(product.category_id) + plan_set.add(product.origin_plan_id) + category_dict, plan_dict = dict(), dict() + for category in await ProductCategory.query_obj_all_by_fields( + [ProductCategory.id, ProductCategory.name], None, ProductCategory.id.in_(list(category_set)) + ): + category_dict[category['id']] = category['name'] + for plan in await Plan.query_obj_all_by_fields([Plan.id, Plan.title], None, Plan.id.in_(list(plan_set))): + plan_dict[plan['id']] = plan['title'] + results = dict() for product in product_list: - category = await ProductCategory.query_obj_one(ProductCategory.id == product.get('category_id')) - if category: - product['category_name'] = category.name - plan = await Plan.query_obj_one(Plan.id == product.get('origin_plan_id')) - if plan: - product['plan_name'] = plan.title - return product_list + _product = product.to_dict() + _product['plan_name'] = plan_dict.get(product.origin_plan_id, '方案已失效') + category_name = category_dict.get(product.category_id, '类别已失效') + if category_name not in results: + results[category_name] = list() + results[category_name].append(_product) + return results async def get_run_record(user, page_num=1, page_size=10): + search_conditions = dict() if user['role'] == User_Role.VISITOR.value: - product_list = await TestProduct.query_page(page_num=page_num, page_size=page_size, - search={'executor': user['user_name']}) - else: - product_list = await TestProduct.query_page(page_num=page_num, page_size=page_size) - for product in product_list.get('data'): - category = await ProductCategory.query_obj_one(ProductCategory.id == product.get('category_id')) - if category: - product['category_name'] = category.name - plan = await Plan.query_obj_one(Plan.id == product.get('origin_plan_id')) - if plan: - product['plan_name'] = plan.title - run_plan = list() - product_plans = await ProductPlan.query_dict_all(ProductPlan.test_product_id == product.get('id')) - for product_plan in product_plans: - plan = await Plan.query_dict_one(Plan.id == product_plan.get('plan_id')) - if plan: - run_plan.append(plan) - product['plans'] = run_plan - product['run_count'] = len(run_plan) - return product_list + search_conditions = {'executor': user['user_name']} + records = await ProductPlan.query_page(page_num=page_num, page_size=page_size, search=search_conditions) + product_list, plan_list = set(), list() + for record in records['data']: + product_list.add(record['test_product_id']) + plan_list.append(record['plan_id']) + plan_dict = dict() + for plan in await Plan.query_obj_all_by_fields([Plan.id, Plan.status], None, Plan.id.in_(plan_list)): + plan_dict[plan['id']] = plan['status'] + product_dict = await query_product_detail_info(list(product_list)) + for record in records['data']: + record['product_info'] = product_dict[record['test_product_id']] + record['status'] = plan_dict.get(record['plan_id'], "stop") + return records async def get_product_by_id(test_product_id): @@ -76,7 +83,11 @@ async def run_check(test_product_id, user_infos): if not origin_plan: return ERROR_UN_EXISTED_TASK, False result, ok = await make_a_copy(origin_plan.id, user_infos) - await ProductPlan().save({'test_product_id': test_product.id, 'plan_id': result['id']}) + await ProductPlan().save({ + 'test_product_id': test_product.id, + 'plan_id': result['id'], + 'executor': user_infos['user_name'] + }) return await run_task(result['id'], user_infos) diff --git a/services/tone_service.py b/services/tone_service.py index 409e653f7f20d28c2d166694262538d07fbad8ce..2d34b8f7d501210f21e24b7352798ee3a2c0bb9a 100644 --- a/services/tone_service.py +++ b/services/tone_service.py @@ -1,6 +1,6 @@ import asyncio import json -from common.tone.api import TONE_SUITE_QUERY, TONE_WS_QUERY, TONE_PROJECT_QUERY, TONE_JOB_TYPE_QUERY, TONE_SERVER_LIST,\ +from common.tone.api import TONE_SUITE_QUERY, TONE_WS_QUERY, TONE_PROJECT_QUERY, TONE_JOB_TYPE_QUERY, TONE_SERVER_LIST, \ TONE_SERVER_TAG, TONE_CLUSTER_LIST from common.tone.tone_request import get_res_from_tone from app import log @@ -83,11 +83,10 @@ async def sync_suite_by_manual(): last_sync_time = '2000-01-01 00:00:00' log.logger.info("begin sync suite result manual.......") result, ok = await query_suite_from_tone(last_sync_time) - print(result, ok) if not ok: return '手动更新失败', False case_list = list() - for case in result['data']: + for case in result['data']['increase']: case_obj = { 'tone_case_id': case['case_id'], 'tone_case_name': case['case_name'], @@ -96,8 +95,12 @@ async def sync_suite_by_manual(): 'test_type': case['test_type'] } case_list.append(case_obj) + case_id_deleted = result['data']['deleted'] + if case_id_deleted and len(case_id_deleted) > 0: + await ToneCase.batch_delete(ToneCase.tone_case_id.in_(case_id_deleted)) log.logger.debug(f'modified case list length {len(case_list)}') - await batch_insert_or_update_case(case_list) + if case_list and len(case_list) > 0: + await batch_insert_or_update_case(case_list) await ToneSyncPull().save(dict()) return None, True diff --git a/views/product_view.py b/views/product_view.py index fbdd0307d11643008b40700421450a669190f613..436a7c5e71da8f4fb9f577f4c360b4b8a973c4ac 100644 --- a/views/product_view.py +++ b/views/product_view.py @@ -1,7 +1,7 @@ from sanic import Blueprint from common.http import rsp -from services.auth_service import login_auth, read_auth, visitor +from services.auth_service import read_auth, login_auth from services.product_service import * from views.utils import check_args @@ -9,14 +9,14 @@ bp = Blueprint('product', url_prefix='api/product') @bp.route('') -@visitor +@login_auth async def get_product_list(request, user_infos): name = request.args.get('name', None) return rsp(data=await get_products(name)) -@bp.get('/test_record') -@visitor +@bp.get('/record') +@login_auth async def get_test_record_list(request, user_infos): page_num = int(request.args.get('page_num')) if request.args.get('page_num') else 1 page_size = int(request.args.get('page_size')) if request.args.get('page_size') else 50 @@ -38,7 +38,7 @@ async def create(request, user_infos): @bp.get('/') -@visitor +@login_auth async def get_product(_, test_product_id, user_infos): result, ok = await get_product_by_id(test_product_id) if not ok: @@ -69,7 +69,7 @@ async def delete(_, test_product_id, user_infos): @bp.get('/run/') -@visitor +@login_auth async def run(_, test_product_id, user_infos): result, ok = await run_check(test_product_id, user_infos) if not ok: @@ -77,14 +77,14 @@ async def run(_, test_product_id, user_infos): return rsp(data=result) -@bp.get('/get_category') -@visitor +@bp.get('/category') +@login_auth async def get_category_list(request, user_infos): name = request.args.get('name', None) return rsp(data=await get_categories(name)) -@bp.post('/create_category') +@bp.post('/category') @read_auth async def create(request, user_infos): check_list = ['name'] diff --git a/views/pub_view.py b/views/pub_view.py index f22556dd338e451a488d02ca3d8b990d8b4e38fb..8f4af932da0b2cf0667e50f708dd41b6c9871e7d 100644 --- a/views/pub_view.py +++ b/views/pub_view.py @@ -1,7 +1,6 @@ from sanic import Blueprint from common.tools import md5 -from common.enums import User_Role from services.auth_service import * bp = Blueprint('pub', url_prefix='api')