diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index e7fd2ab128..bd14be2db6 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -971,6 +971,7 @@ $lang->resource->testcase->createBug = 'createBug'; $lang->resource->testcase->view = 'view'; $lang->resource->testcase->edit = 'edit'; $lang->resource->testcase->linkCases = 'linkCases'; +$lang->resource->testcase->linkBugs = 'linkBugs'; $lang->resource->testcase->batchEdit = 'batchEdit'; $lang->resource->testcase->delete = 'deleteAction'; $lang->resource->testcase->batchDelete = 'batchDelete'; @@ -1008,6 +1009,7 @@ $lang->testcase->methodOrder[65] = 'batchDelete'; $lang->testcase->methodOrder[70] = 'batchChangeModule'; $lang->testcase->methodOrder[75] = 'batchChangeBranch'; $lang->testcase->methodOrder[80] = 'linkCases'; +$lang->testcase->methodOrder[82] = 'linkBugs'; $lang->testcase->methodOrder[90] = 'bugs'; $lang->testcase->methodOrder[95] = 'review'; $lang->testcase->methodOrder[100] = 'batchReview'; diff --git a/module/testcase/control.php b/module/testcase/control.php index 8fcdb966bb..731c32004a 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -1334,6 +1334,42 @@ class testcase extends control $this->display(); } + /** + * Link related bugs. + * + * @param int $caseID + * @param string $browseType + * @param int $param + * @access public + * @return void + */ + public function linkBugs($caseID, $browseType = '', $param = 0) + { + $this->loadModel('bug'); + + /* Get case and queryID. */ + $case = $this->testcase->getById($caseID); + $queryID = ($browseType == 'bySearch') ? (int)$param : 0; + + /* Build the search form. */ + $actionURL = $this->createLink('testcase', 'linkBugs', "caseID=$caseID&browseType=bySearch&queryID=myQueryID", '', true); + $objectID = 0; + if($this->app->tab == 'project') $objectID = $case->project; + if($this->app->tab == 'execution') $objectID = $case->execution; + $this->bug->buildSearchForm($case->product, $this->products, $queryID, $actionURL, $objectID); + + /* Get cases to link. */ + $bugs2Link = $this->testcase->getBugs2Link($caseID, $browseType, $queryID); + + /* Assign. */ + $this->view->position[] = $this->lang->testcase->linkBugs; + $this->view->case = $case; + $this->view->bugs2Link = $bugs2Link; + $this->view->users = $this->loadModel('user')->getPairs('noletter'); + + $this->display(); + } + /** * Confirm testcase changed. * diff --git a/module/testcase/lang/zh-cn.php b/module/testcase/lang/zh-cn.php index 2f7d5e8c57..212da74ecb 100644 --- a/module/testcase/lang/zh-cn.php +++ b/module/testcase/lang/zh-cn.php @@ -43,6 +43,9 @@ $lang->testcase->files = '附件'; $lang->testcase->linkCase = '相关用例'; $lang->testcase->linkCases = '关联相关用例'; $lang->testcase->unlinkCase = '移除相关用例'; +$lang->testcase->linkBug = '相关Bug'; +$lang->testcase->linkBugs = '关联相关Bug'; +$lang->testcase->unlinkBug = '移除相关Bug'; $lang->testcase->stage = '适用阶段'; $lang->testcase->scriptedBy = '脚本由谁创建'; $lang->testcase->scriptedDate = '脚本创建日期'; diff --git a/module/testcase/model.php b/module/testcase/model.php index bf16af9520..d823654902 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -771,7 +771,7 @@ class testcaseModel extends model ->setForce('status', $status) ->cleanInt('story,product,branch,module') ->stripTags($this->config->testcase->editor->edit['id'], $this->config->allowedTags) - ->remove('comment,steps,expects,files,labels,stepType') + ->remove('comment,steps,expects,files,labels,linkBug,stepType') ->get(); $requiredFields = $this->config->testcase->edit->requiredFields; @@ -835,6 +835,24 @@ class testcaseModel extends model } } + /* Link bugs to case. */ + if($this->post->linkBug) + { + $linkedBugs = array_keys($oldCase->toBugs); + $linkBugs = $this->post->linkBug; + $newBugs = array_diff($linkBugs, $linkedBugs); + $removeBugs = array_diff($linkedBugs, $linkBugs); + + if($newBugs) + { + foreach($newBugs as $bugID) $this->dao->update(TABLE_BUG)->set('`case`')->eq($caseID)->set('caseVersion')->eq($case->version)->where('id')->eq($bugID)->exec(); + } + + if($removeBugs) + { + foreach($removeBugs as $bugID) $this->dao->update(TABLE_BUG)->set('`case`')->eq(0)->set('caseVersion')->eq(0)->where('id')->eq($bugID)->exec(); + } + } /* Join the steps to diff. */ if($stepChanged and $this->post->steps) @@ -960,6 +978,34 @@ class testcaseModel extends model } } + /** + * Get bugs to link. + * + * @param int $caseID + * @param string $browseType + * @param int $queryID + * @access public + * @return array + */ + public function getBugs2Link($caseID, $browseType = 'bySearch', $queryID = 0) + { + $this->loadModel('bug'); + if($browseType == 'bySearch') + { + $case = $this->getById($caseID); + $bugs2Link = $this->bug->getBySearch($case->product, $case->branch, $queryID, 'id'); + foreach($bugs2Link as $key => $bug2Link) + { + if($bug2Link->case != 0) unset($bugs2Link[$key]); + } + return $bugs2Link; + } + else + { + return array(); + } + } + /** * Batch update testcases. * diff --git a/module/testcase/view/edit.html.php b/module/testcase/view/edit.html.php index ac4c3c13e6..5e6987c276 100644 --- a/module/testcase/view/edit.html.php +++ b/module/testcase/view/edit.html.php @@ -233,12 +233,13 @@