diff --git a/module/testcase/control.php b/module/testcase/control.php index 9e539bcbbd..0d63dff01d 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -2703,29 +2703,8 @@ class testcase extends control { if($this->post->caseIDList) { - $caseIDList = $this->post->caseIDList; - $caseIDList = array_unique($caseIDList); - unset($_POST['caseIDList']); - $allChanges = $this->testcase->batchChangeScene($caseIDList, $sceneID); + $this->testcase->batchChangeScene($this->post->caseIDList, $sceneID); if(dao::isError()) return print(js::error(dao::getError())); - - if(!empty($allChanges[1])) - { - foreach($allChanges[1] as $caseID => $changes) - { - $this->loadModel('action'); - $actionID = $this->action->create('case', $caseID, 'Edited'); - } - } - - if(!empty($allChanges[0])) - { - foreach($allChanges[0] as $sceneID => $changes) - { - $this->loadModel('action'); - $actionID = $this->action->create('scene', $sceneID - CHANGEVALUE, 'Edited'); - } - } } echo js::locate($this->session->caseList, 'parent'); diff --git a/module/testcase/model.php b/module/testcase/model.php index 67a95457ef..e6073827d1 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -2904,261 +2904,31 @@ class testcaseModel extends model * Batch change scene. * * @param array $caseIDList - * @param int $sceneId + * @param int $sceneID * @access public * @return array */ public function batchChangeScene($caseIDList, $sceneID) { - $now = helper::now(); - $allChanges = array(); + $this->loadModel('action'); - $ioldCases = $this->dao->select('*')->from(VIEW_SCENECASE) - ->where('deleted')->eq(0) - ->beginIF($caseIDList)->andWhere('id')->in($caseIDList)->fi() - ->fetchAll('id'); + $caseIDList = array_filter(array_map(function($caseID){return strpos($caseID, 'case_') !== false ? str_replace('case_', '', $caseID) : '';}, $caseIDList)); + if(!$caseIDList) return true; - /* If the target node is root. */ - if(!$sceneID) + $oldCases = $this->dao->select('id, scene')->from(TABLE_CASE)->where('id')->in($caseIDList)->andWhere('scene')->ne($sceneID)->fetchAll(); + $this->dao->update(TABLE_CASE)->set('scene')->eq($sceneID)->where('id')->in($caseIDList)->andWhere('scene')->ne($sceneID)->exec(); + + foreach($oldCases as $oldCase) { - $oldCases = $ioldCases; + $newCase = clone $oldCase; + $newCase->scene = $sceneID; - /* Split selected nodes into 2 arrays. */ - $finalOldCases1 = array(); /* Parent Scenes. */ - $finalOldCases2 = array(); /* Cases and leaf Scenes. */ - if(!empty($oldCases)) - { - foreach($oldCases as $k => $v) - { - $flag = 0; - foreach($oldCases as $k2 => $v2) - { - $resFlag = strpos($v->path,$v2->path); - - /* $v2 is the ancestor of $v. */ - if(($resFlag || $resFlag === 0) && $v->grade > $v2->grade ) $flag = 1; - } - - if($flag == 0) - { - /* None selected node is its ancestor, then assign to this array. */ - $finalOldCases1[$k] = $v; - } - else - { - /* As one selected node is ancestor, then assign to this array. */ - $finalOldCases2[$k] = $v; - } - } - } - - /* Process all top level nodes (all parent scenes) of selected nodes. */ - foreach($caseIDList as $caseID) - { - if(!isset($finalOldCases1[$caseID])) continue; - - $oldCase = $finalOldCases1[$caseID]; - if($sceneID == $oldCase->parent) continue; - if($sceneID == $oldCase->id) continue; - - $case = new stdclass(); - $case->lastEditedBy = $this->app->user->account; - $case->lastEditedDate = $now; - - if($oldCase->isCase == 2) - { - $case->parent = 0; - $case->path = ",$caseID,"; - $case->grade = 1; - - $this->dao->update(TABLE_SCENE)->data($case) - ->autoCheck() - ->where('id')->eq((int)$caseID - CHANGEVALUE) - ->exec(); - if(!dao::isError()) $allChanges[0][$caseID] = common::createChanges($oldCase, $case); - } - else - { - $case->scene = 0; - - $this->dao->update(TABLE_CASE)->data($case) - ->autoCheck() - ->where('id')->eq((int)$caseID) - ->exec(); - if(!dao::isError()) $allChanges[1][$caseID] = common::createChanges($oldCase, $case); - } - } - - /* Process all non-top level nodes of selected nodes. */ - foreach($caseIDList as $caseID) - { - if (!isset($finalOldCases2[$caseID])) continue; - - $oldCase = $finalOldCases2[$caseID]; - if($sceneID == $oldCase->parent) continue; - if($sceneID == $oldCase->id) continue; - - $case = new stdclass(); - $case->lastEditedBy = $this->app->user->account; - $case->lastEditedDate = $now; - - if($oldCase->isCase == 2) - { - $case->parent = $sceneID; - $resultScene = $this->dao->findById((int)$oldCase->parent - CHANGEVALUE)->from(TABLE_SCENE)->fetch(); - $case->path = $resultScene->path . "$caseID,"; - $case->grade = $resultScene->grade + 1; - - $this->dao->update(TABLE_SCENE)->data($case) - ->autoCheck() - ->where('id')->eq((int)$caseID - CHANGEVALUE) - ->exec(); - if(!dao::isError()) $allChanges[0][$caseID] = common::createChanges($oldCase, $case); - } - else - { - $case->scene = $sceneID; - $this->dao->update(TABLE_CASE)->data($case) - ->autoCheck() - ->where('id')->eq((int)$caseID) - ->exec(); - if(!dao::isError()) $allChanges[1][$caseID] = common::createChanges($oldCase, $case); - } - } - } - else - { - $sceneRow = $this->dao->findById((int)$sceneID)->from(VIEW_SCENECASE)->fetch(); - - /* Remove ancestors of target node. Won't change ancestors' scene to be target scene. */ - $oldCases = array(); - if(!empty($ioldCases)) - { - foreach($ioldCases as $k => $v) - { - $resFlag = strpos($sceneRow->path,$v->path); - if(($resFlag || $resFlag === 0) && $sceneRow->grade > $v->grade ) - { - /* The ancestors of the target node. */ - } - else - { - $oldCases[$k] = $v; - } - } - } - - /* These selected nodes removed ancestors are split into 2 arrays. */ - $finalOldCases1 = array(); - $finalOldCases2 = array(); - if (!empty($oldCases)) - { - foreach($oldCases as $k => $v) - { - $flag = 0; - foreach($oldCases as $k2 => $v2) - { - $resFlag = strpos($v->path,$v2->path); - - /* v2 is ancestor. */ - if (($resFlag || $resFlag === 0) && $v->grade > $v2->grade ) $flag = 1; - } - - if($flag == 0) - { - /* None selected node is its ancestor, then assign it to this array. */ - $finalOldCases1[$k] = $v; - } - else - { - /* As one selected node is its ancestor, then assign it to this array. */ - $finalOldCases2[$k] = $v; - } - } - } - - /* Process all top level of selected nodes. */ - foreach($caseIDList as $caseID) - { - if(isset($finalOldCases1[$caseID])) - { - $oldCase = $finalOldCases1[$caseID]; - if($sceneID == $oldCase->parent) continue; - if($sceneID == $oldCase->id) continue; - - $resFlag = strpos($sceneRow->path,$oldCase->path); - /* Target node is child. */ - if(($resFlag || $resFlag === 0) && $sceneRow->grade > $oldCase->grade ) continue; - - $case = new stdclass(); - $case->lastEditedBy = $this->app->user->account; - $case->lastEditedDate = $now; - $case->product = $sceneRow->product; - $case->module = $sceneRow->module; - - if($oldCase->isCase == 2) - { - $case->parent = $sceneID; - $case->path = $sceneRow->path . "$caseID,"; - $case->grade = $sceneRow->grade + 1; - - $this->dao->update(TABLE_SCENE)->data($case)->autoCheck()->where('id')->eq((int)$caseID-CHANGEVALUE)->exec(); - if(!dao::isError()) $allChanges[0][$caseID] = common::createChanges($oldCase, $case); - - } - else - { - $case->scene = $sceneID; - - $this->dao->update(TABLE_CASE)->data($case)->autoCheck()->where('id')->eq((int)$caseID)->exec(); - if(!dao::isError()) $allChanges[1][$caseID] = common::createChanges($oldCase, $case); - } - } - } - - /* Process all non-top level nodes of selected nodes. */ - foreach($caseIDList as $caseID) - { - if(!isset($finalOldCases2[$caseID])) continue; - - $oldCase = $finalOldCases2[$caseID]; - if($sceneID == $oldCase->parent) continue; - if($sceneID == $oldCase->id) continue; - - $resFlag = strpos($sceneRow->path,$oldCase->path); - /* Target node is child. */ - if(($resFlag || $resFlag === 0) && $sceneRow->grade > $oldCase->grade) continue; - - $case = new stdclass(); - $case->lastEditedBy = $this->app->user->account; - $case->lastEditedDate = $now; - $case->product = $sceneRow->product; - $case->module = $sceneRow->module; - - if($oldCase->isCase == 2) - { - $resultScene = $this->dao->findById((int)$oldCase->parent - CHANGEVALUE)->from(TABLE_SCENE)->fetch(); - $case->path = $resultScene->path . "$caseID,"; - $case->grade = $resultScene->grade + 1; - - $this->dao->update(TABLE_SCENE)->data($case) - ->autoCheck() - ->where('id')->eq((int)$caseID - CHANGEVALUE) - ->exec(); - if(!dao::isError()) $allChanges[0][$caseID] = common::createChanges($oldCase, $case); - } - else - { - $this->dao->update(TABLE_CASE)->data($case) - ->autoCheck() - ->where('id')->eq((int)$caseID) - ->exec(); - if(!dao::isError()) $allChanges[1][$caseID] = common::createChanges($oldCase, $case); - } - } + $changes = common::createChanges($oldCase, $newCase); + $actionID = $this->action->create('case', $oldCase->id, 'edited'); + $this->action->logHistory($actionID, $changes); } - return $allChanges; + return !dao::isError(); } /**