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;?>
+
+
+
+
+
+
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;?>
-
-
-
-
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 @@
+ 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) . '';
?>