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': [] })
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())
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})
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})
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())
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())
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})
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
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())
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
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())
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())