コード例 #1
0
ファイル: suite.py プロジェクト: superwx1985/py_test_site
def multiple_delete(request):
    if request.method == 'POST':
        try:
            pk_list = json.loads(request.POST['pk_list'])
            is_admin = check_admin(request.user)
            if is_admin:
                Suite.objects.filter(pk__in=pk_list).update(
                    is_active=False,
                    modifier=request.user,
                    modified_date=timezone.now())
            else:
                Suite.objects.filter(pk__in=pk_list,
                                     creator=request.user).update(
                                         is_active=False,
                                         modifier=request.user,
                                         modified_date=timezone.now())
        except Exception as e:
            return JsonResponse({'state': 2, 'message': str(e), 'data': None})
        return JsonResponse({'state': 1, 'message': 'OK', 'data': pk_list})
    else:
        return JsonResponse({
            'state': 2,
            'message': 'Only accept "POST" method',
            'data': []
        })
コード例 #2
0
ファイル: suite.py プロジェクト: superwx1985/py_test_site
def status(request):
    is_admin = check_admin(request.user)
    suites = system.RUNNING_SUITES.get_suites()
    active_thread = threading.active_count()
    pool_size = settings.SUITE_MAX_CONCURRENT_EXECUTE_COUNT
    pool_state = '使用中' if thread_pool.SUITE_EXECUTE_POOL else '已关闭'
    return render(request, 'main/suite/status.html', locals())
コード例 #3
0
def continue_(request):
    execute_uuid = request.POST.get('execute_uuid')
    case_order = request.POST.get('case_order')

    success = False

    if execute_uuid and case_order:
        if check_admin(request.user):
            user = None
        else:
            user = request.user
        try:
            case_order = int(case_order)
        except (ValueError, TypeError):
            msg = '无效的用例编号'
        else:
            success, msg = system.RUNNING_SUITES.continue_case(
                execute_uuid, case_order, user)
    else:
        msg = '未提供执行ID或用例编号'

    if success:
        return JsonResponse({'state': 1, 'message': msg, 'data': execute_uuid})
    else:
        return JsonResponse({'state': 2, 'message': msg, 'data': execute_uuid})
コード例 #4
0
ファイル: suite.py プロジェクト: superwx1985/py_test_site
def continue_(request):
    execute_uuid = request.POST.get('execute_uuid')

    if execute_uuid:
        if check_admin(request.user):
            user = None
        else:
            user = request.user
        success, msg = system.RUNNING_SUITES.continue_suite(execute_uuid, user)
    else:
        success = False
        msg = '未提供执行ID'

    if success:
        return JsonResponse({'state': 1, 'message': msg, 'data': execute_uuid})
    else:
        return JsonResponse({'state': 2, 'message': msg, 'data': execute_uuid})
コード例 #5
0
ファイル: step.py プロジェクト: superwx1985/py_test_site
def detail(request, pk):
    next_ = request.GET.get('next', '')
    inside = request.GET.get('inside')
    new_pk = request.GET.get('new_pk')
    order = request.GET.get('order')
    reference_url = reverse(reference, args=[pk])  # 被其他对象调用
    action_map_json = other.get_action_map_json()
    has_sub_object = True
    is_admin = check_admin(request.user)

    try:
        obj = Step.objects.select_related('creator', 'modifier').get(pk=pk)
    except Step.DoesNotExist:
        raise Http404('Step does not exist')

    if request.method == 'POST' and (is_admin or request.user == obj.creator):
        obj_temp = copy.deepcopy(obj)
        form = StepForm(data=request.POST, instance=obj_temp)
        if form.is_valid():
            obj_temp = form.save(commit=False)
            obj_temp.modifier = request.user
            obj_temp.save()
            form.save_m2m()
            request.session['state'] = 'success'
            _redirect = request.POST.get('redirect')
            if _redirect:
                if _redirect == 'close':
                    request.session['state'] = None
                    return render(request, 'main/other/close.html')
                if not next_:
                    next_ = reverse(list_)
                    request.session['state'] = None
                return HttpResponseRedirect(next_)
            else:
                return HttpResponseRedirect(request.get_full_path())

        return render(request, 'main/step/detail.html', locals())
    else:
        form = StepForm(instance=obj)
        if request.session.get('state', None) == 'success':
            prompt = 'success'
        request.session['state'] = None
        return render(request, 'main/step/detail.html', locals())
コード例 #6
0
def detail(request, pk):
    next_ = request.GET.get('next', '')
    inside = request.GET.get('inside')
    is_admin = check_admin(request.user)

    try:
        obj = SuiteResult.objects.select_related('creator',
                                                 'modifier').get(pk=pk)
    except SuiteResult.DoesNotExist:
        raise Http404('SuiteResult does not exist')
    sub_objects = obj.caseresult_set.filter(step_result=None)

    if request.method == 'POST' and (is_admin or request.user == obj.creator):
        import copy
        obj_temp = copy.deepcopy(obj)
        form = SuiteResultForm(data=request.POST, instance=obj_temp)
        if form.is_valid():
            form_ = form.save(commit=False)
            form_.modifier = request.user
            form_.save()
            form.save_m2m()
            request.session['state'] = 'success'
            redirect = request.POST.get('redirect')
            if redirect:
                if not next_:
                    next_ = reverse(list_)
                    request.session['state'] = None
                return HttpResponseRedirect(next_)
            else:
                return HttpResponseRedirect(request.get_full_path())

        return render(request, 'main/result/detail.html', locals())
    else:
        _project = obj.project.pk if obj.project is not None else None
        form = SuiteResultForm(instance=obj)
        if request.session.get('state', None) == 'success':
            prompt = 'success'
        request.session['state'] = None
        return render(request, 'main/result/detail.html', locals())
コード例 #7
0
ファイル: step.py プロジェクト: superwx1985/py_test_site
def delete(request, pk):
    err = None
    if request.method == 'POST':
        try:
            obj = Step.objects.select_related('creator', 'modifier').get(pk=pk)
        except Step.DoesNotExist:
            err = '对象不存在'
        else:
            is_admin = check_admin(request.user)
            if is_admin or obj.creator == request.user:
                obj.is_active = False
                obj.modifier = request.user
                obj.save()
            else:
                err = '无权限'
    else:
        err = '无效请求'

    if err:
        return JsonResponse({'state': 2, 'message': err, 'data': pk})
    else:
        return JsonResponse({'state': 1, 'message': 'OK', 'data': pk})
コード例 #8
0
ファイル: suite.py プロジェクト: superwx1985/py_test_site
def list_(request):
    if request.session.get('state', None) == 'success':
        prompt = 'success'
    request.session['state'] = None

    project_list = get_project_list()
    has_sub_object = True
    is_admin = check_admin(request.user)

    page = request.GET.get('page')
    size = request.GET.get('size', request.COOKIES.get('size'))
    search_text = request.GET.get('search_text', '')
    order_by = request.GET.get('order_by', 'pk')
    order_by_reverse = request.GET.get('order_by_reverse', 'True')
    all_ = request.GET.get('all_', 'False')
    search_project = request.GET.get('search_project', None)

    page = change_to_positive_integer(page, 1)
    size = change_to_positive_integer(size, 10)
    if order_by_reverse == 'True':
        order_by_reverse = True
    else:
        order_by_reverse = False
    if all_ == 'False':
        all_ = False
    else:
        all_ = True
    if search_project in ('', 'None'):
        search_project = None

    q = get_query_condition(search_text)
    q &= Q(is_active=True)
    if not all_:
        q &= Q(creator=request.user)
    if search_project:
        q &= Q(project=search_project)

    objects = Suite.objects.filter(q).values(
        'pk', 'uuid', 'name', 'keyword', 'project__name', 'config__name',
        'creator', 'creator__username',
        'modified_date').annotate(real_name=Concat('creator__last_name',
                                                   'creator__first_name',
                                                   output_field=CharField()))
    m2m_objects = Suite.objects.filter(
        is_active=True,
        case__is_active=True).values('pk').annotate(m2m_count=Count('case'))
    m2m_count = {o['pk']: o['m2m_count'] for o in m2m_objects}
    result_objects = Suite.objects.filter(
        is_active=True, suiteresult__is_active=True).values('pk').annotate(
            result_count=Count('suiteresult'))
    result_count = {o['pk']: o['result_count'] for o in result_objects}
    for o in objects:
        o['m2m_count'] = m2m_count.get(o['pk'], 0)
        o['result_count'] = result_count.get(o['pk'], 0)
    # 排序
    if objects:
        if order_by not in objects[0]:
            order_by = 'pk'
        objects = sorted(objects,
                         key=lambda x: x[order_by],
                         reverse=order_by_reverse)
    paginator = Paginator(objects, size)
    try:
        objects = paginator.page(page)
    except PageNotAnInteger:
        objects = paginator.page(1)
        page = 1
    except EmptyPage:
        objects = paginator.page(paginator.num_pages)
        page = paginator.num_pages
    order_by_form = OrderByForm(initial={
        'order_by': order_by,
        'order_by_reverse': order_by_reverse
    })
    paginator_form = PaginatorForm(initial={
        'page': page,
        'size': size
    },
                                   page_max_value=paginator.num_pages)
    # 设置cookie
    cookies = [Cookie('size', size, path=request.path)]
    respond = render(request, 'main/suite/list.html', locals())
    for cookie in cookies:
        respond.set_cookie(cookie.key, cookie.value, cookie.max_age,
                           cookie.expires, cookie.path)
    return respond
コード例 #9
0
ファイル: suite.py プロジェクト: superwx1985/py_test_site
def detail(request, pk):
    next_ = request.GET.get('next', '')
    inside = request.GET.get('inside')
    new_pk = request.GET.get('new_pk')
    project_list = get_project_list()
    has_sub_object = True
    is_admin = check_admin(request.user)

    try:
        obj = Suite.objects.select_related('creator', 'modifier').get(pk=pk)
    except Suite.DoesNotExist:
        raise Http404('Suite does not exist')

    if request.method == 'POST' and (is_admin or request.user == obj.creator):
        obj_temp = copy.deepcopy(obj)
        form = SuiteForm(data=request.POST, instance=obj_temp)
        try:
            m2m_list = json.loads(request.POST.get('case', 'null'))
        except json.decoder.JSONDecodeError:
            logger.warning('无法获取m2m值', exc_info=True)
            m2m_list = None
        if form.is_valid():
            obj_temp = form.save(commit=False)
            obj_temp.modifier = request.user
            obj_temp.save()
            if m2m_list is not None:
                m2m = SuiteVsCase.objects.filter(suite=obj).order_by('order')
                original_m2m_list = list()
                for dict_ in m2m.values('case'):
                    original_m2m_list.append(str(dict_['case']))
                if original_m2m_list != m2m_list:
                    m2m.delete()
                    order = 0
                    for m2m_pk in m2m_list:
                        if m2m_pk is None or m2m_pk.strip() == '':
                            continue
                        try:
                            m2m_obj = Case.objects.get(pk=m2m_pk)
                        except Case.DoesNotExist:
                            logger.warning('找不到m2m对象[{}]'.format(m2m_pk),
                                           exc_info=True)
                            continue
                        order += 1
                        SuiteVsCase.objects.create(suite=obj,
                                                   case=m2m_obj,
                                                   order=order,
                                                   creator=request.user,
                                                   modifier=request.user)
            request.session['state'] = 'success'
            _redirect = request.POST.get('redirect')
            if _redirect:
                if _redirect == 'close':
                    request.session['state'] = None
                    return render(request, 'main/other/close.html')
                if not next_:
                    next_ = reverse(list_)
                    request.session['state'] = None
                return HttpResponseRedirect(next_)
            else:
                return HttpResponseRedirect(request.get_full_path())
        else:
            temp_config = request.POST.get('config')
            if m2m_list is not None:
                # 暂存step列表
                m2m = SuiteVsCase.objects.filter(suite=obj).order_by('order')
                original_m2m_list = list()
                for dict_ in m2m.values('case'):
                    original_m2m_list.append(str(dict_['case']))
                temp_list = list()
                temp_dict = dict()
                if original_m2m_list != m2m_list:
                    temp_list_json = json.dumps(m2m_list)

        return render(request, 'main/suite/detail.html', locals())
    else:
        form = SuiteForm(instance=obj)
        if request.session.get('state', None) == 'success':
            prompt = 'success'
        request.session['state'] = None
        return render(request, 'main/suite/detail.html', locals())
コード例 #10
0
def list_(request):
    if request.session.get('state', None) == 'success':
        prompt = 'success'
    request.session['state'] = None

    project_list = get_project_list()
    is_admin = check_admin(request.user)

    page = request.GET.get('page')
    size = request.GET.get('size', request.COOKIES.get('size'))
    search_text = request.GET.get('search_text', '')
    order_by = request.GET.get('order_by', 'pk')
    order_by_reverse = request.GET.get('order_by_reverse', 'True')
    all_ = request.GET.get('all_', 'False')
    search_project = request.GET.get('search_project', None)
    suite_id = request.GET.get('suite_id', None)

    page = change_to_positive_integer(page, 1)
    size = change_to_positive_integer(size, 10)
    if order_by_reverse == 'True':
        order_by_reverse = True
    else:
        order_by_reverse = False
    if all_ == 'False':
        all_ = False
    else:
        all_ = True
    if search_project in ('', 'None'):
        search_project = None

    q = get_query_condition(search_text)
    q &= Q(is_active=True)
    if not all_:
        q &= Q(creator=request.user)
    if search_project:
        q &= Q(project=search_project)
    if suite_id:
        try:
            obj = Suite.objects.get(pk=suite_id)
        except Suite.DoesNotExist:
            raise Http404('Suite does not exist')
        q &= Q(suite=obj)

    objects = SuiteResult.objects.filter(q).values(
        'pk', 'uuid', 'name', 'keyword', 'project__name', 'creator',
        'creator__username', 'modified_date', 'suite__pk', 'start_date',
        'end_date',
        'result_state').annotate(real_name=Concat('creator__last_name',
                                                  'creator__first_name',
                                                  output_field=CharField()))

    d = {l[0]: l[1] for l in result_state_list}
    m2m_objects = SuiteResult.objects.filter(
        # is_active=True, caseresult__case_order__isnull=False).values('pk').annotate(
        is_active=True,
        caseresult__step_result__isnull=True).values('pk').annotate(
            m2m_count=Count('caseresult'))
    m2m_count = {o['pk']: o['m2m_count'] for o in m2m_objects}
    for o in objects:
        # 获取状态文字
        o['result_state_str'] = d.get(o['result_state'], 'N/A')
        # 获取耗时
        # 为了减少查询数据库,没有使用models里的方法
        if o['end_date'] is None or o['start_date'] is None:
            o['elapsed_time'] = datetime.timedelta(days=9999)
        else:
            o['elapsed_time'] = o['end_date'] - o['start_date']
        if o['elapsed_time'] >= datetime.timedelta(days=9999):
            o['elapsed_time_str'] = 'N/A'
        else:
            o['elapsed_time_str'] = get_timedelta_str(o['elapsed_time'], 1)
        # 获取子对象数量
        o['m2m_count'] = m2m_count.get(o['pk'], 0)
    # 排序
    if objects:
        if order_by not in objects[0]:
            order_by = 'pk'
        objects = sorted(objects,
                         key=lambda x: x[order_by],
                         reverse=order_by_reverse)
    paginator = Paginator(objects, size)
    try:
        objects = paginator.page(page)
    except PageNotAnInteger:
        objects = paginator.page(1)
        page = 1
    except EmptyPage:
        objects = paginator.page(paginator.num_pages)
        page = paginator.num_pages
    order_by_form = OrderByForm(initial={
        'order_by': order_by,
        'order_by_reverse': order_by_reverse
    })
    paginator_form = PaginatorForm(initial={
        'page': page,
        'size': size
    },
                                   page_max_value=paginator.num_pages)
    # 设置cookie
    cookies = [Cookie('size', size, path=request.path)]
    respond = render(request, 'main/result/list.html', locals())
    for cookie in cookies:
        respond.set_cookie(cookie.key, cookie.value, cookie.max_age,
                           cookie.expires, cookie.path)
    return respond
コード例 #11
0
def detail(request, pk):
    next_ = request.GET.get('next', '')
    inside = request.GET.get('inside')
    new_pk = request.GET.get('new_pk')
    reference_url = reverse(reference, args=[pk])  # 被其他对象调用
    by_list_json = json.dumps(Step.ui_by_list)
    is_admin = check_admin(request.user)

    try:
        obj = ElementGroup.objects.select_related('creator',
                                                  'modifier').get(pk=pk)
    except ElementGroup.DoesNotExist:
        raise Http404('Step does not exist')

    if request.method == 'POST' and (is_admin or request.user == obj.creator):
        obj_temp = copy.deepcopy(obj)
        form = ElementGroupForm(data=request.POST, instance=obj_temp)
        try:
            element_list = json.loads(request.POST.get('element', 'null'))
        except json.decoder.JSONDecodeError:
            logger.warning('无法获取m2m值', exc_info=True)
            element_list = None
        if form.is_valid():
            obj_temp = form.save(commit=False)
            obj_temp.modifier = request.user
            obj_temp.save()
            form.save_m2m()
            if element_list is not None:
                objects = Element.objects.filter(element_group=obj)
                object_values = objects.order_by('order').values(
                    'name', 'by', 'locator', 'description')
                object_values = list(object_values)
                if object_values != element_list:
                    objects.delete()
                    order = 0
                    for v in element_list:
                        _name = str(v['name']).strip()
                        if not v or v['name'] is None or _name == '':
                            continue
                        else:
                            order += 1
                            try:
                                Element.objects.create(
                                    element_group=obj,
                                    name=_name,
                                    by=v['by'],
                                    locator=v['locator'],
                                    description=v['description'],
                                    order=order)
                            except Exception as e:
                                form.add_error(
                                    None,
                                    '添加子对象[{}]时出错:{}'.format(_name, str(e)))
            if not form.non_field_errors():
                request.session['state'] = 'success'
                _redirect = request.POST.get('redirect')
                if _redirect:
                    if _redirect == 'close':
                        request.session['state'] = None
                        return render(request, 'main/other/close.html')
                    if not next_:
                        next_ = reverse(list_)
                        request.session['state'] = None
                    return HttpResponseRedirect(next_)
                else:
                    return HttpResponseRedirect(request.get_full_path())

        if element_list is not None:
            # 暂存
            temp_dict = dict()
            temp_dict['data'] = element_list
            temp_list_json = json.dumps(temp_dict)

        return render(request, 'main/element_group/detail.html', locals())
    else:
        form = ElementGroupForm(instance=obj)
        if request.session.get('state', None) == 'success':
            prompt = 'success'
        request.session['state'] = None
        return render(request, 'main/element_group/detail.html', locals())
コード例 #12
0
def status(request, execute_uuid):
    is_admin = check_admin(request.user)
    running_suite = system.RUNNING_SUITES.get_suite(execute_uuid)
    return render(request, 'main/case/status.html', locals())