* @package build * @version $Id: control.php 4992 2013-07-03 07:21:59Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ class build extends control { /** * Create a build. * * @param int $executionID * @param int $productID * @access public * @return void */ public function create($executionID, $productID = 0) { if(!empty($_POST)) { $buildID = $this->build->create($executionID); if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError())); $this->loadModel('action')->create('build', $buildID, 'opened'); $this->executeHooks($buildID); if(isonlybody()) $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => "parent.loadProjectBuilds($executionID)"));//Code for task #5126. $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('build', 'view', "buildID=$buildID"))); } $this->session->set('buildCreate', $this->app->getURI(true)); /* Load these models. */ $this->loadModel('project'); $this->loadModel('user'); /* Set menu. */ $executions = $this->project->getExecutionPairs($this->session->PRJ); $this->project->setMenu($executions, $executionID); /* Get stories and bugs. */ $orderBy = 'status_asc, stage_asc, id_desc'; /* Assign. */ $project = $this->loadModel('project')->getExecutionById($executionID); $productGroups = $this->project->getProducts($executionID); $productID = $productID ? $productID : key($productGroups); $products = array(); foreach($productGroups as $product) $products[$product->id] = $product->name; $this->view->title = $project->name . $this->lang->colon . $this->lang->build->create; $this->view->position[] = html::a($this->createLink('project', 'task', "projectID=$executionID"), $project->name); $this->view->position[] = $this->lang->build->create; $this->view->product = isset($productGroups[$productID]) ? $productGroups[$productID] : ''; $this->view->branches = (isset($productGroups[$productID]) and $productGroups[$productID]->type == 'normal') ? array() : $this->loadModel('branch')->getPairs($productID); $this->view->executionID = $executionID; $this->view->orderBy = $orderBy; $this->view->products = $products; $this->view->lastBuild = $this->build->getLast($executionID); $this->view->productGroups = $productGroups; $this->view->users = $this->user->getPairs('nodeleted|noclosed'); $this->display(); } /** * Edit a build. * * @param int $buildID * @access public * @return void */ public function edit($buildID) { if(!empty($_POST)) { $changes = $this->build->update($buildID); if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError())); $files = $this->loadModel('file')->saveUpload('build', $buildID); if($changes or $files) { $fileAction = ''; if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ; $actionID = $this->loadModel('action')->create('build', $buildID, 'Edited', $fileAction); if(!empty($changes)) $this->action->logHistory($actionID, $changes); } $this->executeHooks($buildID); $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('view', "buildID=$buildID"))); } $build = $this->build->getById((int)$buildID); $this->loadModel('project'); /* Set menu. */ $this->project->setMenu($this->project->getExecutionPairs($this->session->PRJ), $build->project); /* Get stories and bugs. */ $orderBy = 'status_asc, stage_asc, id_desc'; /* Assign. */ $execution = $this->loadModel('project')->getExecutionById($build->project); if(empty($execution)) { $execution = new stdclass(); $execution->name = ''; } $executions = $this->loadModel('product')->getExecutionPairsByProduct($build->product, $build->branch); if(!isset($executions[$build->project])) $executions[$build->project] = $execution->name; $productGroups = $this->project->getProducts($build->project); $this->loadModel('product'); if(!isset($productGroups[$build->product])) { $product = $this->product->getById($build->product); $product->branch = $build->branch; $productGroups[$build->product] = $product; } $products = array(); foreach($productGroups as $product) $products[$product->id] = $product->name; $this->view->title = $execution->name . $this->lang->colon . $this->lang->build->edit; $this->view->position[] = html::a($this->createLink('project', 'task', "projectID=$build->project"), $execution->name); $this->view->position[] = $this->lang->build->edit; $this->view->product = isset($productGroups[$build->product]) ? $productGroups[$build->product] : ''; $this->view->branches = (isset($productGroups[$build->product]) and $productGroups[$build->product]->type == 'normal') ? array() : $this->loadModel('branch')->getPairs($build->product); $this->view->executions = $executions; $this->view->orderBy = $orderBy; $this->view->productGroups = $productGroups; $this->view->products = $products; $this->view->users = $this->loadModel('user')->getPairs('noletter', $build->builder); $this->view->build = $build; $this->display(); } /** * View a build. * * @param int $buildID * @param string $type * @param string $link * @param string $param * @param string $orderBy * @param int $recTotal * @param int $recPerPage * @param int $pageID * @access public * @return void */ public function view($buildID, $type = 'story', $link = 'false', $param = '', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 100, $pageID = 1) { if($type == 'story')$this->session->set('storyList', $this->app->getURI(true)); if($type == 'bug') $this->session->set('bugList', $this->app->getURI(true)); $this->loadModel('story'); $this->loadModel('bug'); /* Load pager. */ $this->app->loadClass('pager', $static = true); if($this->app->getViewType() == 'mhtml') $recPerPage = 10; /* Set menu. */ $build = $this->build->getById((int)$buildID, true); if(!$build) die(js::error($this->lang->notFound) . js::locate('back')); $product = $this->loadModel('product')->getById($build->product); if($product->type != 'normal') $this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$product->type]); $bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1); $bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($build->bugs)->andWhere('deleted')->eq(0) ->beginIF($type == 'bug')->orderBy($orderBy)->fi() ->page($bugPager) ->fetchAll(); $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); $stories = $this->dao->select('*')->from(TABLE_STORY)->where('id')->in($build->stories)->andWhere('deleted')->eq(0) ->beginIF($type == 'story')->orderBy($orderBy)->fi() ->page($storyPager) ->fetchAll('id'); $stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->in($build->stories)->andWhere('branch')->eq($build->branch)->fetchPairs('story', 'stage'); foreach($stages as $storyID => $stage)$stories[$storyID]->stage = $stage; $this->loadModel('project')->setMenu($this->project->getExecutionPairs($this->session->PRJ), $build->project, $buildID); $projects = $this->project->getExecutionPairs($this->session->PRJ, 'all', 'empty'); $this->view->title = "BUILD #$build->id $build->name - " . $projects[$build->project]; $this->view->position[] = html::a($this->createLink('project', 'task', "projectID=$build->project"), $projects[$build->project]); $this->view->position[] = $this->lang->build->view; $this->view->stories = $stories; $this->view->storyPager = $storyPager; $generatedBugPager = new pager($type == 'generatedBug' ? $recTotal : 0, $recPerPage, $type == 'generatedBug' ? $pageID : 1); $this->view->generatedBugs = $this->bug->getProjectBugs($build->project, $build->id, '', 0, $type == 'generatedBug' ? $orderBy : 'status_desc,id_desc', '', $generatedBugPager); $this->view->generatedBugPager = $generatedBugPager; $this->executeHooks($buildID); /* Assign. */ $this->view->canBeChanged = common::canBeChanged('build', $build); // Determines whether an object is editable. $this->view->users = $this->loadModel('user')->getPairs('noletter'); $this->view->build = $build; $this->view->buildPairs = $this->build->getProjectBuildPairs($build->project, 0, 0, 'noempty,notrunk'); $this->view->actions = $this->loadModel('action')->getList('build', $buildID); $this->view->link = $link; $this->view->param = $param; $this->view->orderBy = $orderBy; $this->view->bugs = $bugs; $this->view->type = $type; $this->view->bugPager = $bugPager; $this->view->branchName = $build->productType == 'normal' ? '' : $this->loadModel('branch')->getById($build->branch); $this->display(); } /** * Delete a build. * * @param int $buildID * @param string $confirm yes|noe * @access public * @return void */ public function delete($buildID, $confirm = 'no') { if($confirm == 'no') { die(js::confirm($this->lang->build->confirmDelete, $this->createLink('build', 'delete', "buildID=$buildID&confirm=yes"))); } else { $build = $this->build->getById($buildID); $this->build->delete(TABLE_BUILD, $buildID); $this->executeHooks($buildID); /* if ajax request, send result. */ if($this->server->ajax) { if(dao::isError()) { $response['result'] = 'fail'; $response['message'] = dao::getError(); } else { $response['result'] = 'success'; $response['message'] = ''; } $this->send($response); } die(js::locate($this->createLink('project', 'build', "projectID=$build->project"), 'parent')); } } /** * AJAX: get builds of a product in html select. * * @param int $productID * @param string $varName the name of the select object to create * @param string $build build to selected * @param int $branch * @param int $index the index of batch create bug. * @param string $type get all builds or some builds belong to normal releases and projects are not done. * @access public * @return string */ public function ajaxGetProductBuilds($productID, $varName, $build = '', $branch = 0, $index = 0, $type = 'normal') { $branch = $branch ? "0,$branch" : $branch; $isJsonView = $this->app->getViewType() == 'json'; if($varName == 'openedBuild' ) { $params = ($type == 'all') ? 'noempty' : 'noempty, noterminate, nodone'; $builds = $this->build->getProductBuildPairs($productID, $branch, $params); if($isJsonView) die(json_encode($builds)); else die(html::select($varName . '[]', $builds, $build, 'size=4 class=form-control multiple')); } if($varName == 'openedBuilds' ) { $builds = $this->build->getProductBuildPairs($productID, $branch, 'noempty'); if($isJsonView) die(json_encode($builds)); else die(html::select($varName . "[$index][]", $builds, $build, 'size=4 class=form-control multiple')); } if($varName == 'resolvedBuild') { $params = ($type == 'all') ? '' : 'noterminate, nodone'; $builds = $this->build->getProductBuildPairs($productID, $branch, $params); if($isJsonView) die(json_encode($builds)); else die(html::select($varName, $builds, $build, "class='form-control'")); } } /** * AJAX: get builds of a project in html select. * * @param int $projectID * @param string $varName the name of the select object to create * @param string $build build to selected * @param int $branch * @param int $index the index of batch create bug. * @param bool $needCreate if need to append the link of create build * @param string $type get all builds or some builds belong to normal releases and projects are not done. * @access public * @return string */ public function ajaxGetProjectBuilds($projectID, $productID, $varName, $build = '', $branch = 0, $index = 0, $needCreate = false, $type = 'normal') { $branch = $branch ? "0,$branch" : $branch; $isJsonView = $this->app->getViewType() == 'json'; if($varName == 'openedBuild') { $params = ($type == 'all') ? 'noempty' : 'noempty, noterminate, nodone'; $builds = $this->build->getProjectBuildPairs($projectID, $productID, $branch, $params, $build); if($isJsonView) die(json_encode($builds)); else die(html::select($varName . '[]', $builds , '', 'size=4 class=form-control multiple')); } if($varName == 'openedBuilds') { $builds = $this->build->getProjectBuildPairs($projectID, $productID, $branch, 'noempty'); if($isJsonView) die(json_encode($builds)); else die(html::select($varName . "[$index][]", $builds , $build, 'size=4 class=form-control multiple')); } if($varName == 'resolvedBuild') { $params = ($type == 'all') ? '' : 'noterminate, nodone'; $builds = $this->build->getProjectBuildPairs($projectID, $productID, $branch, $params, $build); if($isJsonView) die(json_encode($builds)); else die(html::select($varName, $builds, $build, "class='form-control'")); } if($varName == 'testTaskBuild') { $builds = $this->build->getProjectBuildPairs($projectID, $productID, $branch, 'noempty,notrunk'); if($isJsonView) die(json_encode($builds)); else { if(empty($builds)) { echo html::a($this->createLink('build', 'create', "projectID=$projectID&productID=$productID", '', $onlybody = true), $this->lang->build->create, '', "data-toggle='modal' data-type='iframe'"); echo ' '; die(html::a("javascript:loadProjectBuilds($projectID)", $this->lang->refresh)); } die(html::select('build', $builds, $build, "class='form-control'")); } } if($varName == 'dropdownList') { $builds = $this->build->getProjectBuildPairs($projectID, $productID, $branch, 'noempty,notrunk'); if($isJsonView) die(json_encode($builds)); $list = "