* @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 buld. * * @param int $projectID * @access public * @return void */ public function create($projectID) { if(!empty($_POST)) { $buildID = $this->build->create($projectID); if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError())); $this->loadModel('action')->create('build', $buildID, 'opened'); $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'); if($this->config->global->flow == 'onlyTest') { $product = $this->loadModel('product')->getByID($projectID); $products = $this->product->getPairs(); $this->product->setMenu($products, $projectID); $this->lang->build->menu = $this->lang->product->menu; $productGroups = array(); $product->branch = 0; foreach($products as $productID => $name) $productGroups[$productID]['branch'] = 0; $this->view->title = $this->lang->build->create; $this->view->product = $product; $this->view->branches = ($product and $product->type == 'normal') ? array() : $this->loadModel('branch')->getPairs($projectID); } else { /* Set menu. */ $this->project->setMenu($this->project->getPairs(), $projectID); /* Get stories and bugs. */ $orderBy = 'status_asc, stage_asc, id_desc'; /* Assign. */ $project = $this->loadModel('project')->getById($projectID); $productGroups = $this->project->getProducts($projectID); $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=$projectID"), $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->projectID = $projectID; $this->view->orderBy = $orderBy; } $this->view->products = $products; $this->view->lastBuild = $this->build->getLast($projectID); $this->view->productGroups = $productGroups; $this->view->users = $this->user->getPairs('nodeleted'); $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->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('view', "buildID=$buildID"))); } $build = $this->build->getById((int)$buildID); if($this->config->global->flow == 'onlyTest') { $product = $this->loadModel('product')->getById($build->product); $products = $this->product->getPairs(); $this->product->setMenu($products, $build->product); $this->lang->build->menu = $this->lang->product->menu; $productGroups = array(); $product->branch = 0; foreach($products as $productID => $name) $productGroups[$productID]['branch'] = 0; $this->view->title = $this->lang->build->edit; $this->view->position[] = $this->lang->build->edit; $this->view->product = $product; $this->view->branches = ($product and $product->type == 'normal') ? array() : $this->loadModel('branch')->getPairs($build->product); } else { $this->loadModel('project'); /* Set menu. */ $this->project->setMenu($this->project->getPairs(), $build->project); /* Get stories and bugs. */ $orderBy = 'status_asc, stage_asc, id_desc'; /* Assign. */ $project = $this->loadModel('project')->getById($build->project); if(empty($project)) { $project = new stdclass(); $project->name = ''; } $productGroups = $this->project->getProducts($build->project); $products = array(); foreach($productGroups as $product) $products[$product->id] = $product->name; if(empty($productGroups) and $build->product) { $product = $this->loadModel('product')->getById($build->product); $products[$product->id] = $product->name; } $this->view->title = $project->name . $this->lang->colon . $this->lang->build->edit; $this->view->position[] = html::a($this->createLink('project', 'task', "projectID=$build->project"), $project->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->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 * @access public * @return void */ public function view($buildID, $type = 'story', $link = 'false', $param = '', $orderBy = 'id_desc') { 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'); /* 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]); $bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($build->bugs)->andWhere('deleted')->eq(0) ->beginIF($type == 'bug')->orderBy($orderBy)->fi() ->fetchAll(); if($this->config->global->flow == 'onlyTest') { $products = $this->loadModel('product')->getPairs(); $this->product->setMenu($products, $build->product, $buildID); $this->lang->build->menu = $this->lang->product->menu; $this->view->title = "BUILD #$build->id $build->name - " . $build->productName; $this->view->position[] = html::a($this->createLink('product', 'build', "productID=$build->product"), $build->productName); $this->view->position[] = $this->lang->build->view; } else { $stories = $this->dao->select('*')->from(TABLE_STORY)->where('id')->in($build->stories)->andWhere('deleted')->eq(0) ->beginIF($type == 'story')->orderBy($orderBy)->fi() ->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->getPairs(), $build->project, $buildID); $projects = $this->project->getPairs('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->generatedBugs = $this->bug->getProjectBugs($build->project, $build->id, '', 0, $type == 'newbug' ? $orderBy : 'status_desc,id_desc', null); $this->view->bugs = $bugs; $this->view->type = $type; } /* Assign. */ $this->view->users = $this->loadModel('user')->getPairs('noletter'); $this->view->build = $build; $this->view->actions = $this->loadModel('action')->getList('build', $buildID); $this->view->link = $link; $this->view->param = $param; $this->view->orderBy = $orderBy; $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); /* 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); } if($this->config->global->flow == 'onlyTest') die(js::locate($this->createLink('project', 'build', "productID=$build->product"), 'parent')); 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); 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->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); 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 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 = "