diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 4c30afcc1d..36542db6d8 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -63,7 +63,7 @@ $lang->action->objectTypes['branch'] = '分支'; $lang->action->objectTypes['module'] = '模块'; $lang->action->objectTypes['testsuite'] = '套件'; $lang->action->objectTypes['caselib'] = '用例库'; -$lang->action->objectTypes['testreport'] = '测试报告'; +$lang->action->objectTypes['testreport'] = '报告'; /* 用来描述操作历史记录。*/ $lang->action->desc = new stdclass(); @@ -177,10 +177,13 @@ $lang->action->label->build = 'Build|build|view|buildID=%s'; $lang->action->label->bug = 'Bug|bug|view|bugID=%s'; $lang->action->label->case = '用例|testcase|view|caseID=%s'; $lang->action->label->testtask = '测试任务|testtask|view|caseID=%s'; +$lang->action->label->testsuite = '测试套件|testsuite|view|suiteID=%s'; +$lang->action->label->caselib = '测试库|testsuite|libview|libID=%s'; $lang->action->label->todo = 'todo|todo|view|todoID=%s'; $lang->action->label->doclib = '文档库|doc|browse|libID=%s'; $lang->action->label->doc = '文档|doc|view|docID=%s'; $lang->action->label->user = '用户|user|view|account=%s'; +$lang->action->label->testreport = '报告|testreport|view|report=%s'; $lang->action->label->space = ' '; /* Object type. */ @@ -204,6 +207,7 @@ $lang->action->search->objectTypeList['productplan'] = '计划'; $lang->action->search->objectTypeList['branch'] = '分支'; $lang->action->search->objectTypeList['testsuite'] = '套件'; $lang->action->search->objectTypeList['caselib'] = '公共库'; +$lang->action->search->objectTypeList['testreport'] = '报告'; /* 用来在动态显示中显示动作 */ $lang->action->search->label[''] = ''; diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 502dc4403d..71323297fa 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -261,7 +261,7 @@ $lang->testcase->menu->bug = array('link' => 'Bug|bug|browse|productID=%s' $lang->testcase->menu->testcase = array('link' => 'Case|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,batchedit,showimport,groupcase,importfromlib', 'subModule' => 'tree'); $lang->testcase->menu->testtask = array('link' => 'Build|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases,start,close,batchrun,groupcase'); $lang->testcase->menu->testsuite = array('link' => 'Suite|testsuite|browse|productID=%s', 'alias' => 'view,create,edit,linkcase'); -$lang->testcase->menu->report = array('link' => 'Report|testreport|browse|productID=%s', 'alias' => 'view,create'); +$lang->testcase->menu->report = array('link' => 'Report|testreport|browse|productID=%s', 'alias' => 'view,create,edit'); $lang->testcase->menu->caselib = array('link' => 'Library|testsuite|library'); $lang->testcase->menu->index = array('link' => "TestingHomepage|qa|index|locate=no&productID=%s", 'float' => 'right'); diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index c109e12e6c..d4c5b55d09 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -261,7 +261,7 @@ $lang->testcase->menu->bug = array('link' => 'Bug|bug|browse|productID=%s' $lang->testcase->menu->testcase = array('link' => '用例|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,batchedit,showimport,groupcase,importfromlib', 'subModule' => 'tree'); $lang->testcase->menu->testtask = array('link' => '版本|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases,start,close,batchrun,groupcase'); $lang->testcase->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s', 'alias' => 'view,create,edit,linkcase'); -$lang->testcase->menu->report = array('link' => '报告|testreport|browse|productID=%s', 'alias' => 'view,create'); +$lang->testcase->menu->report = array('link' => '报告|testreport|browse|productID=%s', 'alias' => 'view,create,edit'); $lang->testcase->menu->caselib = array('link' => '用例库|testsuite|library'); $lang->testcase->menu->index = array('link' => "测试主页|qa|index|locate=no&productID=%s", 'float' => 'right'); diff --git a/module/project/view/testtask.html.php b/module/project/view/testtask.html.php index 3ff139f96d..e24aec46b0 100644 --- a/module/project/view/testtask.html.php +++ b/module/project/view/testtask.html.php @@ -19,7 +19,7 @@
diff --git a/module/report/lang/en.php b/module/report/lang/en.php index d411035b56..833a52cdbd 100644 --- a/module/report/lang/en.php +++ b/module/report/lang/en.php @@ -65,7 +65,7 @@ $lang->report->to = 'to'; $lang->report->taskTotal = "Total Tasks"; $lang->report->manhourTotal = "Total Man-Hour"; $lang->report->validRate = "Efficiency"; -$lang->report->validRateTips = "Solution is fixed/postponed or status is resolved/closed."; +$lang->report->validRateTips = "Solution is fixed or postponed / status is resolved or closed."; $lang->report->unplanned = 'Unplanned'; $lang->report->workday = 'Man-Hour/Day'; $lang->report->diffDays = 'Work Days'; diff --git a/module/testreport/config.php b/module/testreport/config.php index a892439b63..1d68e71a97 100644 --- a/module/testreport/config.php +++ b/module/testreport/config.php @@ -2,5 +2,9 @@ $config->testreport->create = new stdclass(); $config->testreport->create->requiredFields = 'title,owner'; +$config->testreport->edit = new stdclass(); +$config->testreport->edit->requiredFields = 'title,owner'; + $config->testreport->editor = new stdclass(); $config->testreport->editor->create = array('id' => 'report', 'tools' => 'simpleTools'); +$config->testreport->editor->edit = array('id' => 'report', 'tools' => 'simpleTools'); diff --git a/module/testreport/control.php b/module/testreport/control.php index a31dde486a..05915ec1dc 100644 --- a/module/testreport/control.php +++ b/module/testreport/control.php @@ -63,13 +63,20 @@ class testreport extends control $pager = pager::init($recTotal, $recPerPage, $pageID); $reports = $this->testreport->getList($objectID, $objectType, $extra, $orderBy, $pager); + if(empty($reports) and common::hasPriv('testreport', 'create')) + { + $param = ''; + if($objectType == 'product' and $extra) $param = "objectID=$extra&objectType=testtask"; + if($objectType == 'project') $param = "objectID=$objectID&objectType=project"; + if($param) $this->locate($this->createLink('testreport', 'create', $param)); + } $projects = array(); $tasks = array(); foreach($reports as $report) { - if($report->objectType == 'project') $projects[$report->objectID] = $report->objectID; - if($report->objectType == 'testtask') $tasks[$report->objectID] = $report->objectID; + $projects[$report->project] = $report->project; + foreach(explode(',', $report->tasks) as $taskID) $tasks[$taskID] = $taskID; } if($projects) $projects = $this->dao->select('id,name')->from(TABLE_PROJECT)->where('id')->in($projects)->fetchPairs('id', 'name'); if($tasks) $tasks = $this->dao->select('id,name')->from(TABLE_TESTTASK)->where('id')->in($tasks)->fetchPairs('id', 'name'); @@ -104,6 +111,7 @@ class testreport extends control { $reportID = $this->testreport->create(); if(dao::isError()) die(js::error(dao::getError())); + $this->loadModel('action')->create('testreport', $reportID, 'Opened'); die(js::locate(inlink('view', "reportID=$reportID"), 'parent')); } @@ -125,7 +133,7 @@ class testreport extends control } else { - $build = $this->build->getById($task->build); + $build = $this->build->getById($task->build); $stories = $this->story->getByList($build->stories); $builds[$build->id] = $build; @@ -147,6 +155,7 @@ class testreport extends control $project = $this->project->getById($projectID); $tasks = $this->testtask->getProjectTasks($projectID); + $owners = array(); $productIdList = array(); foreach($tasks as $task) { @@ -201,6 +210,112 @@ class testreport extends control $this->display(); } + /** + * Edit report + * + * @param int $reportID + * @param string $from + * @access public + * @return void + */ + public function edit($reportID, $from = 'product') + { + if($_POST) + { + $changes = $this->testreport->update($reportID); + if(dao::isError()) die(js::error(dao::getError())); + + $files = $this->loadModel('file')->saveUpload('testreport', $reportID); + $fileAction = !empty($files) ? $this->lang->addFiles . join(',', $files) . "\n" : ''; + $actionID = $this->loadModel('action')->create('testreport', $reportID, 'Edited', $fileAction); + if(!empty($changes)) $this->action->logHistory($actionID, $changes); + + die(js::locate(inlink('view', "reportID=$reportID&from=$from"), 'parent')); + } + + $report = $this->testreport->getById($reportID); + $project = $this->project->getById($report->project); + if($from == 'product' and is_numeric($report->product)) + { + $product = $this->product->getById($report->product); + $productID = $this->commonAction($report->product, 'product'); + if($productID != $report->product) die('deny access'); + + $browseLink = inlink('browse', "objectID=$productID&objectType=product"); + $this->view->position[] = html::a($browseLink, $product->name); + $this->view->position[] = $this->lang->testreport->edit; + } + else + { + $projectID = $this->commonAction($report->project, 'project'); + if($projectID != $report->objectID) die('deny access'); + + $browseLink = inlink('browse', "objectID=$projectID&objectType=project"); + $this->view->position[] = html::a($browseLink, $project->name); + $this->view->position[] = $this->lang->testreport->edit; + } + + if($report->objectType == 'testtask') + { + $productIdList[$report->product] = $report->product; + + $task = $this->testtask->getById($report->objectID); + $builds = array(); + if($task->build == 'trunk') + { + $stories = $this->story->getProjectStories($project->id); + $bugs = $this->testreport->getBugs4Test('trunk', $report->product, $report->begin, $report->end); + } + else + { + $build = $this->build->getById($task->build); + $stories = $this->story->getByList($build->stories); + + $builds[$build->id] = $build; + $bugs = $this->testreport->getBugs4Test($builds, $report->product, $report->begin, $report->end); + } + $tasks = array($task->id => $task); + } + else + { + $tasks = $this->testtask->getProjectTasks($report->project); + $productIdList = array(); + foreach($tasks as $task) $productIdList[$task->product] = $task->product; + + $stories = $this->story->getProjectStories($project->id); + $builds = $this->build->getProjectBuilds($project->id); + $bugs = $this->testreport->getBugs4Test($builds, $productIdList, $report->begin, $report->end, 'project'); + } + + $cases = $this->testreport->getTaskCases($tasks); + $bugInfo = $this->testreport->getBugInfo($tasks, $productIdList, $report->begin, $report->end, $builds); + $modules = array(); + foreach($productIdList as $productID) $modules += $this->tree->getOptionMenu($productID, $viewType = 'bug'); + + $this->view->title = $report->title . $this->lang->testreport->edit; + + $this->view->report = $report; + $this->view->stories = $stories; + $this->view->bugs = $bugs; + $this->view->project = $project; + $this->view->productIdList = join(',', array_keys($productIdList)); + $this->view->tasks = join(',', array_keys($tasks)); + $this->view->storySummary = $this->product->summary($stories); + + $this->view->builds = $builds; + $this->view->users = $this->user->getPairs('noletter|nodeleted|noclosed'); + $this->view->modules = $modules; + + $this->view->cases = $cases; + $this->view->caseSummary = $this->testreport->getResultSummary($tasks, $cases); + + $this->view->legacyBugs = $bugInfo['legacyBugs']; + unset($bugInfo['legacyBugs']); + $this->view->bugInfo = $bugInfo; + + $this->display(); + } + /** * View report. * @@ -260,6 +375,7 @@ class testreport extends control $this->view->cases = $cases; $this->view->users = $this->user->getPairs('noletter|nodeleted|noclosed'); $this->view->modules = $modules; + $this->view->actions = $this->loadModel('action')->getList('testreport', $reportID); $this->view->storySummary = $this->product->summary($stories); $this->view->caseSummary = $this->testreport->getResultSummary($tasks, $cases); @@ -291,33 +407,6 @@ class testreport extends control } } - /** - * Export report. - * - * @param int $reportID - * @access public - * @return void - */ - public function export($reportID) - { - if($_POST) - { - $report = $this->testreport->getById($reportID); - $data = fixer::input('post')->get(); - - $this->session->set('notHead', true); - $output = $this->fetch('testreport', 'view', array('reportID' =>$reportID)); - $this->session->set('notHead', false); - $css = ''; - $js = ''; - $exportNotice = "

" . $this->lang->testreport->exportNotice . '

'; - $content = "\n\n\n\n{$report->title}\n$css\n$js\n\n\n

{$report->title}

\n$output\n$exportNotice"; - $this->fetch('file', 'sendDownHeader', array('fileName' => $data->fileName, 'fileType' => $data->fileType, 'content' =>$content)); - } - $this->view->customExport = false; - $this->display(); - } - /** * Common action. * diff --git a/module/testreport/css/export.css b/module/testreport/css/export.css deleted file mode 100644 index 47a973d389..0000000000 --- a/module/testreport/css/export.css +++ /dev/null @@ -1,13 +0,0 @@ -body{font-size:14px}h1{font-size:16px;text-align:center} -.w-100px{width:100px}.w-p50{width:50%}.w-p70{width:70%}.w-id{width:70px}.w-pri{width:40px}.w-user{width:80px}.w-80px{width:80px}.w-70px{width:70px}.w-hour[width:57px].w-status{width:60px}.w-130px{width:130px;}.w-type{width:80px}.w-150px{width:150px;} -.text-center{text-align:center}.text-top{vertical-align:top;}.text-left{text-align:left}.text-right{text-align:right;} -.table{width:100%;margin-bottom:5px;border:1px solid #ddd;border-collapse:collapse;border-spacing:0;} -.table caption{padding:8px 20px;border:1px solid #DDD;border-bottom:0;background:#fafafa;text-align:left}.table td, .table th{border-bottom:1px solid #ddd;padding:5px;} -.table>thead>tr>th{text-align:center;vertical-align:middle;background-color:#f1f1f1;border-bottom:1px solid #ddd;} -.main .nav-tabs{padding-left: 20px;padding-top:10px;margin-bottom:0;list-style:none;} -.main .nav-tabs:after{clear:both;display:table;content:" ";} -.nav-tabs > li{float:left;margin-bottom:-1px;position:relative;display:block;} -.nav-tabs > li > a{padding:5px 10px;color:#333;line-height:20px;max-height:32px;margin-right:2px;border:1px solid transparent;border-radius:0;position:relative;display:block;text-decoration:none;outline:none;} -.nav-tabs > li.active > a,.nav-tabs > li.active > a:hover,.nav-tabs > li.active > a:focus{color:#333;font-weight:bold;line-height: 20px;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;} -.tab-pane{display:none} -.tab-pane.active{display:block} diff --git a/module/testreport/js/create.js b/module/testreport/js/common.js similarity index 79% rename from module/testreport/js/create.js rename to module/testreport/js/common.js index 4c34ff1682..c246dde57c 100644 --- a/module/testreport/js/create.js +++ b/module/testreport/js/common.js @@ -10,7 +10,4 @@ $(function() }; resizeChartTable(); fixedTableHead('.table-wrapper'); - - $('.tab-pane').removeClass('active'); - $('.tab-pane:first').addClass('active'); }); diff --git a/module/testreport/js/export.js b/module/testreport/js/export.js deleted file mode 100644 index 559f3952cf..0000000000 --- a/module/testreport/js/export.js +++ /dev/null @@ -1,33 +0,0 @@ -function tab() -{ - tabContent = new Array(); - var divTags=document.getElementsByTagName("div"); - for(var divKey in divTags) - { - if(typeof(divTags[divKey]) == 'object' && divTags[divKey].getAttribute('class').indexOf('tab-pane') >= 0) - { - tabContent.push(divTags[divKey]); - divTags[divKey].setAttribute('class', 'tab-pane'); - } - } - tabContent[0].setAttribute('class', 'tab-pane active'); - - var aTags=document.getElementsByTagName("a"); - for(var i = 0;itestreport->bugResolvedByGroups = 'Bug ResolvedBy Distribution'; $lang->testreport->bugResolutionGroups = 'Bug Resolution Distribution'; $lang->testreport->bugModuleGroups = 'Bug Module Distribution'; $lang->testreport->legacyBugs = 'Legacy Bugs'; -$lang->testreport->bugConfirmedRate = 'Confirmed Bug Rate (Confirmed Bugs / Bugs created in tests)'; +$lang->testreport->bugConfirmedRate = 'Confirmed Bug Rate (Solution is fixed or postponed / status is resolved or closed)'; $lang->testreport->bugCreateByCaseRate = 'Bug Created in Case Rate (Bugs created in cases / Newly added bugs)'; $lang->testreport->caseSummary = ' %s cases in total, %s cases performed, %s results generated, %s cases failed.'; diff --git a/module/testreport/lang/zh-cn.php b/module/testreport/lang/zh-cn.php index 691f9f3e5a..7597ddd23d 100644 --- a/module/testreport/lang/zh-cn.php +++ b/module/testreport/lang/zh-cn.php @@ -2,12 +2,15 @@ $lang->testreport->common = '测试报告'; $lang->testreport->browse = '报告列表'; $lang->testreport->create = '创建报告'; +$lang->testreport->edit = '编辑报告'; $lang->testreport->delete = '删除报告'; $lang->testreport->export = '导出报告'; $lang->testreport->view = '报告详情'; $lang->testreport->recreate = '重新生成报告'; $lang->testreport->title = '标题'; +$lang->testreport->project = '所属项目'; +$lang->testreport->testtask = '测试版本'; $lang->testreport->startEnd = '起止时间'; $lang->testreport->owner = '负责人'; $lang->testreport->member = '参与人员'; @@ -42,11 +45,13 @@ $lang->testreport->bugResolvedByGroups = 'Bug解决者分布'; $lang->testreport->bugResolutionGroups = 'Bug解决方案分布'; $lang->testreport->bugModuleGroups = 'Bug模块分布'; $lang->testreport->legacyBugs = '遗留的Bug'; -$lang->testreport->bugConfirmedRate = '有效Bug率 (确认的Bug / 测试创建的Bug)'; +$lang->testreport->bugConfirmedRate = '有效Bug率 (方案为已解决或延期 / 状态为已解决或已关闭)'; $lang->testreport->bugCreateByCaseRate = '用例发现Bug率 (用例创建的Bug / 时间区间中新增的Bug)'; $lang->testreport->caseSummary = '共有%s个用例,共执行%s个用例,产生了%s个结果,失败的用例有%s个。'; $lang->testreport->buildSummary = '共测试了%s个版本。'; -$lang->testreport->bugSummary = '共产生%s个Bug,遗留%s个Bug。有效Bug率(确认的Bug / 产生的Bug):%s,用例发现Bug率(用例创建的Bug / 时间区间中新增的Bug):%s'; +$lang->testreport->bugSummary = '共产生%s个Bug,遗留%s个Bug。有效Bug率(方案为已解决或延期 / 状态为已解决或已关闭):%s,用例发现Bug率(用例创建的Bug / 时间区间中新增的Bug):%s'; $lang->testreport->confirmDelete = '是否删除该报告?'; +$lang->testreport->moreNotice = '更多功能可以参考禅道扩展机制进行扩展,也可以联系我们进行定制。'; $lang->testreport->exportNotice = "由禅道项目管理软件导出"; +$lang->testreport->noReport = "报表还没有生成,请稍候查看。"; diff --git a/module/testreport/model.php b/module/testreport/model.php index 982d9317e6..5161e6b422 100644 --- a/module/testreport/model.php +++ b/module/testreport/model.php @@ -62,6 +62,37 @@ class testreportModel extends model return $reportID; } + /** + * Update report. + * + * @param int $reportID + * @access public + * @return array + */ + public function update($reportID) + { + $report = $this->getById($reportID); + $data = fixer::input('post') + ->stripTags($this->config->testreport->editor->edit['id'], $this->config->allowedTags) + ->join('stories', ',') + ->join('builds', ',') + ->join('bugs', ',') + ->join('cases', ',') + ->join('members', ',') + ->remove('files,labels,uid') + ->get(); + $this->dao->update(TABLE_TESTREPORT)->data($data)->autocheck() + ->batchCheck($this->config->testreport->edit->requiredFields, 'notempty') + ->batchCheck('start,end', 'notempty') + ->check('end', 'ge', $data->start) + ->where('id')->eq($reportID) + ->exec(); + if(dao::isError()) return false; + + $this->loadModel('file')->updateObjectID($this->post->uid, $reportID, 'testreport'); + return common::createChanges($report, $data); + } + /** * Get report by id. * @@ -112,9 +143,9 @@ class testreportModel extends model */ public function getBugInfo($tasks, $productIdList, $begin, $end, $builds) { - $bugsByTask = $this->dao->select('*')->from(TABLE_BUG)->where('testtask')->in(array_keys($tasks))->andWhere('deleted')->eq(0)->fetchAll(); + $bugsByTask = $this->dao->select('*')->from(TABLE_BUG)->where('testtask')->in(array_keys($tasks))->andWhere('testtask')->ne(0)->andWhere('deleted')->eq(0)->fetchAll('id'); $severityGroups = $statusGroups = $openedByGroups = $resolvedByGroups = $resolutionGroups = $moduleGroups = array(); - $confirmedNum = 0; + $resolvedBugs = 0; foreach($bugsByTask as $bug) { $severityGroups[$bug->severity] = isset($severityGroups[$bug->severity]) ? $severityGroups[$bug->severity] + 1 : 1; @@ -123,7 +154,7 @@ class testreportModel extends model $moduleGroups[$bug->module] = isset($moduleGroups[$bug->module]) ? $moduleGroups[$bug->module] + 1 : 1; if($bug->resolvedBy)$resolvedByGroups[$bug->resolvedBy] = isset($resolvedByGroups[$bug->resolvedBy]) ? $resolvedByGroups[$bug->resolvedBy] + 1 : 1; if($bug->resolution)$resolutionGroups[$bug->resolution] = isset($resolutionGroups[$bug->resolution]) ? $resolutionGroups[$bug->resolution] + 1 : 1; - if($bug->confirmed) $confirmedNum ++; + if($bug->status == 'resolved' or $bug->status == 'closed') $resolvedBugs ++; } $newBugs = $this->dao->select('*')->from(TABLE_BUG)->where('product')->in($productIdList)->andWhere('openedDate')->ge($begin)->andWhere('openedDate')->le("$end 23:59:59")->andWhere('deleted')->eq(0)->fetchAll(); @@ -143,7 +174,7 @@ class testreportModel extends model $bugInfo['bugOpenedByGroups'] = $openedByGroups; $bugInfo['bugModuleGroups'] = $moduleGroups; $bugInfo['bugResolvedByGroups'] = $resolvedByGroups; - $bugInfo['bugConfirmedRate'] = round($confirmedNum / count($bugsByTask) * 100, 2); + $bugInfo['bugConfirmedRate'] = empty($resolvedBugs) ? 0 : round((count(zget($resolutionGroups, 'fixed', array())) + count(zget($resolutionGroups, 'postponed', array()))) / $resolvedBugs * 100, 2); $bugInfo['bugCreateByCaseRate'] = empty($byCaseNum) ? 0 : round($byCaseNum / count($newBugs) * 100, 2); return $bugInfo; } diff --git a/module/testreport/view/blockbugreport.html.php b/module/testreport/view/blockbugreport.html.php index ebaa0219ec..4b13419b78 100644 --- a/module/testreport/view/blockbugreport.html.php +++ b/module/testreport/view/blockbugreport.html.php @@ -55,7 +55,7 @@ - + diff --git a/module/testreport/view/browse.html.php b/module/testreport/view/browse.html.php index 83cc25c448..22cb8f87a4 100644 --- a/module/testreport/view/browse.html.php +++ b/module/testreport/view/browse.html.php @@ -25,7 +25,8 @@ testreport->title);?> openedByAB);?> testreport->createdDate);?> - testreport->objectID);?> + testreport->project);?> + testreport->testtask;?> actions;?> @@ -37,18 +38,26 @@ id&from=$objectType"), $report->title)?> createdBy);?> createdDate, 2);?> + project . $projects[$report->project];?> + objectType == 'testtask' and isset($tasks[$report->objectID])) $objectName = 'TESTTAST #' . $report->objectID . $tasks[$report->objectID]; - if($report->objectType == 'project' and isset($projects[$report->objectID])) $objectName = 'PROJECT #' . $report->objectID . $projects[$report->objectID]; + $taskName = ''; + foreach(explode(',', $report->tasks) as $taskID) $taskName .= '#' . $taskID . $tasks[$taskID] . ' '; ?> - - id", '', 'list', 'remove', 'hiddenwin');?> + + + id", '', 'list'); + common::printIcon('testreport', 'delete', "id=$report->id", '', 'list', 'remove', 'hiddenwin'); + ?> + + show();?> + + testreport->noReport;?> - show();?> diff --git a/module/testreport/view/create.html.php b/module/testreport/view/create.html.php index 08e43cd281..475241e1e8 100644 --- a/module/testreport/view/create.html.php +++ b/module/testreport/view/create.html.php @@ -59,7 +59,7 @@ testreport->member?> - + testreport->title?> diff --git a/module/testreport/view/edit.html.php b/module/testreport/view/edit.html.php new file mode 100644 index 0000000000..6a67171e10 --- /dev/null +++ b/module/testreport/view/edit.html.php @@ -0,0 +1,106 @@ + + * @package testreport + * @version $Id$ + * @link http://www.zentao.net + */ +?> + + + + +
+
+
+ icons['edit']);?> testreport->edit;?> +
+
+
+
+
+
+ testreport->legendBasic?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
testreport->startEnd?> +
+ begin, "class='form-control form-date'")?> + ~ + end, "class='form-control form-date'")?> + project) . html::hidden('tasks', $tasks); + ?> +
+
+
+ testreport->owner?> + owner, "class='form-control chosen'")?> +
+
testreport->member?>members, "class='form-control chosen' multiple")?>
testreport->title?>title, "class='form-control'")?>
testreport->goal?>desc?>
testreport->profile?> + ' . $storySummary . '

'; + echo '

' . sprintf($lang->testreport->buildSummary, empty($builds) ? 1 : count($builds)) . $caseSummary . '

'; + echo '

' . sprintf($lang->testreport->bugSummary, $bugInfo['countBugByTask'], count($legacyBugs), $bugInfo['bugConfirmedRate'] . '%', $bugInfo['bugCreateByCaseRate'] . '%') . '

'; + unset($bugInfo['countBugByTask']); unset($bugInfo['bugConfirmedRate']); unset($bugInfo['bugCreateByCaseRate']); + ?> +
testreport->report?>report, "class='form-control'")?>
files?>fetch('file', 'buildform');?>
+
+
+ testreport->legendStoryAndBug?> + + +
+
+ testreport->legendBuild?> + +
+
+ testreport->legendCase?> + +
+
+ testreport->legendLegacyBugs?> + +
+
+ testreport->legendReport?> + +
+
+
+
+
+ diff --git a/module/testreport/view/export.html.php b/module/testreport/view/export.html.php deleted file mode 100644 index 807f6be5cd..0000000000 --- a/module/testreport/view/export.html.php +++ /dev/null @@ -1,74 +0,0 @@ - - * @package testreport - * @version $Id$ - * @link http://www.zentao.net - */ -?> - -exportFileTypeList); -$lang->exportFileTypeList['html'] = 'html'; -?> - -
-
- icons['export']);?> - export;?> -
-
-
- - - - - - -
-
- setFileName;?> - -
-
- exportFileTypeList, '', 'onchange=switchEncode(this.value) class="form-control"');?> - -
- export, "onclick='setDownloading();' ");?> -
-
-
- diff --git a/module/testreport/view/view.html.php b/module/testreport/view/view.html.php index 66963d3a84..399f42c535 100644 --- a/module/testreport/view/view.html.php +++ b/module/testreport/view/view.html.php @@ -25,12 +25,9 @@ $actionLinks = ''; ob_start(); - echo "
"; - common::printIcon('testreport', 'export', "reportID=$report->id", '', 'button', 'download-alt', '', 'iframe'); - echo '
'; - echo "
"; if(common::hasPriv('testreport', 'create')) echo html::a(inLink('create', "objectID=$report->objectID&objectType=$report->objectType"), "", '', "class='btn' title='{$lang->testreport->recreate}'"); + common::printIcon('testreport', 'edit', "reportID=$report->id", '', 'button'); common::printIcon('testreport', 'delete', "reportID=$report->id", '', 'button', '', 'hiddenwin'); echo '
'; @@ -54,6 +51,12 @@
  • testreport->legendLegacyBugs, '', "data-toggle='tab' data-target='#tabLegacyBugs'")?>
  • testreport->legendReport, '', "data-toggle='tab' data-target='#tabReport'")?>
  • testreport->legendComment, '', "data-toggle='tab' data-target='#tabComment'")?>
  • + session->notHead):?> +
  • history, '', "data-toggle='tab' data-target='#tabHistory'")?>
  • + app->user->admin):?> +
  • testreport->legendMore, '', "data-toggle='tab' data-target='#tabMore'")?>
  • + +
    @@ -103,6 +106,12 @@
    report) ? $lang->testreport->none : $report->report;?>
    + session->notHead):?> +
    + app->user->admin):?> +
    testreport->moreNotice;?>
    + +
    session->notHead):?> diff --git a/module/testtask/model.php b/module/testtask/model.php index 84f6db166f..633c6e4b36 100644 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -82,7 +82,7 @@ class testtaskModel extends model ->beginIF($branch)->andWhere("if(t4.branch, t4.branch, t5.branch) = '$branch'")->fi() ->orderBy($orderBy) ->page($pager) - ->fetchAll(); + ->fetchAll('id'); } /** @@ -103,7 +103,7 @@ class testtaskModel extends model ->andWhere('t1.deleted')->eq(0) ->orderBy($orderBy) ->page($pager) - ->fetchAll(); + ->fetchAll('id'); } /** diff --git a/module/testtask/view/browse.html.php b/module/testtask/view/browse.html.php index 1fcc72fa00..84e81f3dae 100644 --- a/module/testtask/view/browse.html.php +++ b/module/testtask/view/browse.html.php @@ -56,7 +56,7 @@ common::printIcon('testtask', 'view', "taskID=$task->id", '', 'list', 'file','','iframe',true); common::printIcon('testtask', 'linkCase', "taskID=$task->id", '', 'list', 'link'); common::printIcon('testtask', 'edit', "taskID=$task->id", '', 'list','','','iframe',true); - common::printIcon('testreport', 'create', "objectID=$task->id&objectType=testtask", '', 'list','flag'); + common::printIcon('testreport', 'browse', "objectID=$task->product&objectType=product&extra=$task->id", '', 'list','flag'); if(common::hasPriv('testtask', 'delete')) { diff --git a/module/testtask/view/caseheader.html.php b/module/testtask/view/caseheader.html.php index 417c0a54cd..82f09717d2 100644 --- a/module/testtask/view/caseheader.html.php +++ b/module/testtask/view/caseheader.html.php @@ -43,6 +43,7 @@ if($this->methodName == 'cases') echo "
  •  {$lang->testcase->bySearch}
  • "; if(common::hasPriv('testtask', 'view')) echo '
  • ' . html::a(inlink('view', "taskID=$taskID"), $lang->testtask->view) . '
  • '; + if(common::hasPriv('testreport', 'browse')) echo '
  • ' . html::a($this->createLink('testreport', 'browse', "objectID=$productID&objectType=product&extra=$taskID"), $lang->testtask->report) . '
  • '; ?>