+ finish the task #536.

This commit is contained in:
shiyangyangwork@yahoo.cn
2011-10-27 08:54:27 +00:00
parent 8227b6220e
commit 5082ddefd7
13 changed files with 419 additions and 35 deletions
+11
View File
@@ -115,6 +115,17 @@ class bugModel extends model
return $bug;
}
/**
* Get active Bugs.
*
* @access public
* @return void
*/
public function getActiveBugs($pager)
{
return $this->dao->select('*')->from(TABLE_BUG)->where('status')->eq('active')->andWhere('toTask')->eq(0)->page($pager)->fetchAll();
}
/**
* Update a bug.
*
+1 -1
View File
@@ -170,7 +170,7 @@ $lang->bug->menu->testtask = array('link' => 'Test Task|testtask|browse|productI
$lang->testcase->menu->product = '%s';
$lang->testcase->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
$lang->testcase->menu->testcase = array('link' => 'Test Case|testcase|browse|productID=%s', 'alias' => 'view,create,edit', 'subModule' => 'tree');
$lang->testcase->menu->testcase = array('link' => 'Test Case|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit', 'subModule' => 'tree');
$lang->testcase->menu->testtask = array('link' => 'Test Task|testtask|browse|productID=%s');
$lang->testtask->menu->product = '%s';
+1 -1
View File
@@ -170,7 +170,7 @@ $lang->bug->menu->testtask = array('link' => '测试任务|testtask|browse|produ
$lang->testcase->menu->product = '%s';
$lang->testcase->menu->bug = array('link' => '缺陷管理|bug|browse|productID=%s');
$lang->testcase->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s', 'alias' => 'view,create,edit', 'subModule' => 'tree');
$lang->testcase->menu->testcase = array('link' => '用例管理|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit', 'subModule' => 'tree');
$lang->testcase->menu->testtask = array('link' => '测试任务|testtask|browse|productID=%s');
$lang->testtask->menu->product = '%s';
+2
View File
@@ -0,0 +1,2 @@
.bug {color:gray; font-size:9px}
.task {color:green; font-size:9px}
+7 -1
View File
@@ -62,7 +62,13 @@ var browseType = '<?php echo $browseType;?>';
<tr class='a-center'>
<td><?php if(!common::printLink('task', 'view', "task=$task->id", sprintf('%03d', $task->id))) printf('%03d', $task->id);?></td>
<td><?php echo $lang->task->priList[$task->pri];?></td>
<td class='a-left nobr'><?php if(!common::printLink('task', 'view', "task=$task->id", $task->name)) echo $task->name;?></td>
<td class='a-left nobr'>
<?php
if($task->fromBug != 0) echo "<span class='bug'>[BUG] </span>";
else echo "<span class='task'>[TASK] </span>";
if(!common::printLink('task', 'view', "task=$task->id", $task->name)) echo $task->name;
?>
</td>
<td class=<?php echo $task->status;?> >
<?php
$storyChanged = ($task->storyStatus == 'active' and $task->latestStoryVersion > $task->storyVersion);
+1
View File
@@ -21,6 +21,7 @@
<?php
if($browseType != 'needconfirm') common::printLink('task', 'export', "projectID=$projectID&orderBy=$orderBy", $lang->export, '', 'class="export"');
common::printLink('project', 'importTask', "project=$project->id", $lang->project->importTask);
common::printLink('task', 'importFromBug', "projectID=$project->id", $lang->task->importFromBug);
common::printLink('task', 'report', "project=$project->id&browseType=$browseType", $lang->task->report->common);
common::printLink('task', 'batchCreate', "projectID=$project->id", $lang->task->batchCreate);
common::printLink('task', 'create', "project=$project->id", $lang->task->create);
+200
View File
@@ -664,4 +664,204 @@ class task extends control
$this->display();
}
/**
* Import from Bug.
*
* @param int $projectID
* @param string $orderBy
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @access public
* @return void
*/
public function importFromBug($projectID = 0, $pager = '', $recTotal = 0, $recPerPage = 30, $pageID = 1)
{
if(!empty($_POST))
{
$mails = $this->task->importFromBug($projectID);
if(dao::isError()) die(js::error(dao::getError()));
foreach($mails as $mail)
{
$this->sendmail($mail->taskID, $mail->actionID);
}
/* Locate the browser. */
die(js::locate($this->createLink('project', 'task', "projectID=$projectID"), 'parent'));
}
$this->loadModel('bug');
$projects = $this->project->getPairs();
$users = $this->project->getTeamMemberPairs($projectID, 'nodeleted');
/* Load pager and get tasks. */
$this->app->loadClass('pager', $static = true);
$pager = new pager($recTotal, $recPerPage, $pageID);
$this->project->setMenu($projects, $projectID);
$header['title'] = $projects[$projectID] . $this->lang->colon . $this->lang->task->importFromBug;
$position[] = html::a($this->createLink('project', 'task', "projectID=$projectID"), $projects[$projectID]);
$position[] = $this->lang->task->importFromBug;
$bugs = $this->bug->getActiveBugs($pager);
$this->view->header = $header;
$this->view->pager = $pager;
$this->view->bugs = $bugs;
$this->view->users = $users;
$this->view->projectID = $projectID;
$this->display();
}
/* task#536.
public function importFromBug($projectID = 0, $browseType = 'noclosed', $param = 0, $orderBy = '', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
$this->products = $this->loadModel('product')->getPairs();
if(empty($this->products))
{
//echo js::alert($this->lang->product->errorNoProduct);
//die(js::locate($this->createLink('product', 'create')));
}
$this->view->products = $this->products;
$projects = $this->project->getPairs('all');
/* Set browseType and queryID. /
$browseType = strtolower($browseType);
$queryID = ($browseType == 'bysearch') ? (int)$param : 0;
/* Set menu and save session. /
$this->project->setMenu($this->project->getPairs(), $projectID);
$this->session->set('bugList', $this->app->getURI(true));
/* Process the order by field. /
if(!$orderBy) $orderBy = $this->cookie->qaBugOrder ? $this->cookie->qaBugOrder : 'id_desc';
setcookie('qaBugOrder', $orderBy, $this->config->cookieLife, $this->config->webRoot);
/* Load pager. /
$this->app->loadClass('pager', $static = true);
$pager = pager::init($recTotal, $recPerPage, $pageID);
$bugs = array();
if($browseType == 'all')
{
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where('product')->eq($productID)
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
}
elseif($browseType == 'assigntome')
{
$bugs = $this->dao->findByAssignedTo($this->app->user->account)->from(TABLE_BUG)->andWhere('product')->eq($productID)
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
}
elseif($browseType == 'openedbyme')
{
$bugs = $this->dao->findByOpenedBy($this->app->user->account)->from(TABLE_BUG)->andWhere('product')->eq($productID)
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
}
elseif($browseType == 'resolvedbyme')
{
$bugs = $this->dao->findByResolvedBy($this->app->user->account)->from(TABLE_BUG)->andWhere('product')->eq($productID)
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
}
elseif($browseType == 'assigntonull')
{
$bugs = $this->dao->findByAssignedTo('')->from(TABLE_BUG)->andWhere('product')->eq($productID)
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
}
elseif($browseType == 'unresolved')
{
$bugs = $this->dao->findByStatus('active')->from(TABLE_BUG)->andWhere('product')->eq($productID)
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
}
elseif($browseType == 'longlifebugs')
{
$bugs = $this->dao->findByLastEditedDate("<", date(DT_DATE1, strtotime('-7 days')))->from(TABLE_BUG)->andWhere('product')->eq($productID)
->andWhere('openedDate')->lt(date(DT_DATE1,strtotime('-7 days')))
->andWhere('deleted')->eq(0)
->andWhere('status')->ne('closed')->orderBy($orderBy)->page($pager)->fetchAll();
}
elseif($browseType == 'postponedbugs')
{
$bugs = $this->dao->findByResolution('postponed')->from(TABLE_BUG)->andWhere('product')->eq($productID)
->orderBy($orderBy)->page($pager)->fetchAll();
}
elseif($browseType == 'needconfirm')
{
$bugs = $this->dao->select('t1.*, t2.title AS storyTitle')->from(TABLE_BUG)->alias('t1')->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id')
->where("t2.status = 'active'")
->andWhere('t1.deleted')->eq(0)
->andWhere('t2.version > t1.storyVersion')
->orderBy($orderBy)
->fetchAll();
}
elseif($browseType == 'bysearch')
{
if($queryID)
{
$query = $this->loadModel('search')->getQuery($queryID);
if($query)
{
$this->session->set('bugQuery', $query->sql);
$this->session->set('bugForm', $query->form);
}
else
{
$this->session->set('bugQuery', ' 1 = 1');
}
}
else
{
if($this->session->bugQuery == false) $this->session->set('bugQuery', ' 1 = 1');
}
$bugQuery = str_replace("`product` = 'all'", '1', $this->session->bugQuery); // Search all product.
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where($bugQuery)
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
}
/ Process the sql, get the conditon partion, save it to session. Thus the report page can use the same condition. /
if($browseType != 'needconfirm')
{
$sql = explode('WHERE', $this->dao->get());
$sql = explode('ORDER', $sql[1]);
$this->session->set('bugReportCondition', $sql[0]);
}
/ Build the search form. /
$this->config->bug->search['actionURL'] = $this->createLink('bug', 'browse', "productID=$productID&browseType=bySearch&queryID=myQueryID");
$this->config->bug->search['queryID'] = $queryID;
$this->config->bug->search['params']['product']['values'] = array($productID => $this->products[$productID], 'all' => $this->lang->bug->allProduct);
$this->config->bug->search['params']['module']['values'] = $this->tree->getOptionMenu($productID, $viewType = 'bug', $startModuleID = 0);
$this->config->bug->search['params']['project']['values'] = $this->product->getProjectPairs($productID);
$this->config->bug->search['params']['openedBuild']['values'] = $this->loadModel('build')->getProductBuildPairs($productID);
$this->config->bug->search['params']['resolvedBuild']['values'] = $this->build->getProductBuildPairs($productID);
$this->view->searchForm = $this->fetch('search', 'buildForm', $this->config->bug->search);
$users = $this->loadModel('user')->getPairs('noletter');
$header['title'] = $projects[$projectID] . $this->lang->colon . $this->lang->task->common;
$position[] = html::a($this->createLink('project', 'task', "projectID=$projectID"), $projects[$projectID]);
$position[] = $this->lang->task->common;
$this->view->header = $header;
$this->view->position = $position;
$this->view->projectID = $projectID;
$this->view->projectName = $projects[$projectID];
$this->view->browseType = $browseType;
$this->view->bugs = $bugs;
$this->view->users = $users;
$this->view->pager = $pager;
$this->view->param = $param;
$this->view->orderBy = $orderBy;
$this->display();
}
*/
}
+6
View File
@@ -0,0 +1,6 @@
.active1 {background:#E70014;}
.active2 {background:#EA5407;}
.active3 {background:#F39801;}
.active4 {background:#FFF100;}
.active1 a, .active2 a, .active3 a{color:white; text-decoration:none}
.active4 a {color:blue; text-decoration:none}
+32 -16
View File
@@ -9,22 +9,25 @@
* @version $Id$
* @link http://www.zentao.net
*/
$lang->task->index = "Index";
$lang->task->create = "Create";
$lang->task->batchCreate = "Batch create";
$lang->task->import = "Import undone";
$lang->task->edit = "Update";
$lang->task->delete = "Delete";
$lang->task->view = "Info";
$lang->task->logEfforts = "Efforts";
$lang->task->start = "Start";
$lang->task->finish = "Finish";
$lang->task->close = "Close";
$lang->task->batchClose = "Batch close";
$lang->task->cancel = "Cancel";
$lang->task->activate = "Activate";
$lang->task->export = "Export";
$lang->task->reportChart = "Report chart";
$lang->task->index = "Index";
$lang->task->create = "Create";
$lang->task->batchCreate = "Batch create";
$lang->task->import = "Import undone";
$lang->task->edit = "Update";
$lang->task->delete = "Delete";
$lang->task->view = "Info";
$lang->task->logEfforts = "Efforts";
$lang->task->start = "Start";
$lang->task->finish = "Finish";
$lang->task->close = "Close";
$lang->task->batchClose = "Batch close";
$lang->task->cancel = "Cancel";
$lang->task->activate = "Activate";
$lang->task->export = "Export";
$lang->task->reportChart = "Report chart";
$lang->task->fromBug = 'From Bug';
$lang->task->importBug = 'Import';
$lang->task->importFromBug = 'Import tasks from Bug';
$lang->task->confirmStoryChange = "Confirm story change";
$lang->task->common = 'Task';
@@ -68,8 +71,21 @@ $lang->task->lastEditedBy = 'Last Edited By';
$lang->task->lastEditedDate = 'Last Edited Date';
$lang->task->lastEdited = 'Last Edited';
$lang->task->bug->assignToMe = 'MyBugs';
$lang->task->bug->openedByMe = 'MyOpen';
$lang->task->bug->resolvedByMe = 'MyResolve';
$lang->task->bug->closedByMe = 'MyClose';
$lang->task->bug->assignToNull = 'Unassigned';
$lang->task->bug->unResolved = 'Unresolved';
$lang->task->bug->longLifeBugs = 'Longlife';
$lang->task->bug->postponedBugs = 'Postponed';
$lang->task->bug->moduleBugs = 'ByModule';
$lang->task->bug->byQuery = 'Search';
$lang->task->bug->needConfirm = 'StoryChanged';
$lang->task->same = 'The same as above';
$lang->task->notes = '(Notes: the name, type, pri and estimate must be written, otherwise it is no use)';
$lang->task->descFromBug = 'ResolveBug:';
$lang->task->statusList[''] = '';
$lang->task->statusList['wait'] = 'Waiting';
+32 -16
View File
@@ -9,22 +9,25 @@
* @version $Id$
* @link http://www.zentao.net
*/
$lang->task->index = "任务一览";
$lang->task->create = "新增任务";
$lang->task->batchCreate = "批量添加任务";
$lang->task->import = "导入之前未完任务";
$lang->task->edit = "更新任务";
$lang->task->delete = "删除任务";
$lang->task->view = "查看任务";
$lang->task->logEfforts = "记录工时";
$lang->task->start = "开始任务";
$lang->task->finish = "完成任务";
$lang->task->close = "关闭任务";
$lang->task->batchClose = "批量关闭";
$lang->task->cancel = "取消任务";
$lang->task->activate = "激活任务";
$lang->task->export = "导出数据";
$lang->task->reportChart = "报表统计";
$lang->task->index = "任务一览";
$lang->task->create = "新增任务";
$lang->task->batchCreate = "批量添加任务";
$lang->task->import = "导入之前未完任务";
$lang->task->edit = "更新任务";
$lang->task->delete = "删除任务";
$lang->task->view = "查看任务";
$lang->task->logEfforts = "记录工时";
$lang->task->start = "开始任务";
$lang->task->finish = "完成任务";
$lang->task->close = "关闭任务";
$lang->task->batchClose = "批量关闭";
$lang->task->cancel = "取消任务";
$lang->task->activate = "激活任务";
$lang->task->export = "导出数据";
$lang->task->reportChart = "报表统计";
$lang->task->fromBug = '来源Bug';
$lang->task->importBug = '导入';
$lang->task->importFromBug = '导入Bug';
$lang->task->confirmStoryChange = "确认需求变动";
$lang->task->common = '任务';
@@ -68,8 +71,21 @@ $lang->task->lastEditedBy = '最后修改';
$lang->task->lastEditedDate = '最后修改日期';
$lang->task->lastEdited = '最后编辑';
$lang->task->bug->assignToMe = '指派给我';
$lang->task->bug->openedByMe = '由我创建';
$lang->task->bug->resolvedByMe = '由我解决';
$lang->task->bug->closedByMe = '由我关闭';
$lang->task->bug->assignToNull = '未指派';
$lang->task->bug->unResolved = '未解决';
$lang->task->bug->longLifeBugs = '久未处理';
$lang->task->bug->postponedBugs = '被延期';
$lang->task->bug->allBugs = '所有Bug';
$lang->task->bug->byQuery = '搜索';
$lang->task->bug->needConfirm = '需求变动';
$lang->task->same = '同上';
$lang->task->notes = '(注:“任务类型”、“任务名称”、“优先级”和“预计工时”必需填写,否则此行无效)';
$lang->task->descFromBug = '解决Bug:';
$lang->task->statusList[''] = '';
$lang->task->statusList['wait'] = '未开始';
+57
View File
@@ -141,6 +141,63 @@ class taskModel extends model
return $mails;
}
/**
* Import task from Bug.
*
* @param int $projectID
* @access public
* @return void
*/
public function importFromBug($projectID)
{
$this->loadModel('bug');
$this->loadModel('task');
$now = helper::now();
$BugToTasks = fixer::input('post')->get();
foreach($BugToTasks->import as $key => $value)
{
$bug = $this->bug->getById($key);
$task->project = $projectID;
$task->story = $bug->story;
$task->storyVersion = $bug->story;
$task->fromBug = $key;
$task->name = $bug->title;
$task->type = 'devel';
$task->pri = $BugToTasks->pri[$key];
$task->consumed = 0;
$task->status = 'wait';
$task->statusCustom = 1;
$task->desc = $this->lang->task->descFromBug . sprintf('%03d', $key);
$task->openedDate = $now;
$task->openedBy = $this->app->user->account;
if(!empty($BugToTasks->estimate[$key]))
{
$task->estimate = $BugToTasks->estimate[$key];
$task->left = $task->estimate;
}
if(!empty($BugToTasks->assignedTo[$key]))
{
$task->assignedTo = $BugToTasks->assignedTo[$key];
$task->assignedDate = $now;
}
$this->dao->insert(TABLE_TASK)->data($task)->checkIF($task->estimate != '', 'estimate', 'float')->exec();
if(dao::isError())
{
echo js::error(dao::getError());
die(js::reload('parent'));
}
$taskID = $this->dao->lastInsertID();
if($task->story != false) $this->story->setStage($tasks->story[$i]);
$actionID = $this->loadModel('action')->create('task', $taskID, 'Opened', '');
$this->dao->update(TABLE_BUG)->set('toTask')->eq($taskID)->where('id')->eq($key)->exec();
$mails[$key]->taskID = $taskID;
$mails[$key]->actionID = $actionID;
}
return $mails;
}
/**
* Update a task.
*
+65
View File
@@ -0,0 +1,65 @@
<?php
/**
* The import view file of task module of ZenTaoPMS.
*
* @copyright Copyright 2009-2011 青岛易软天创网络科技有限公司 (QingDao Nature Easy Soft Network Technology Co,LTD www.cnezsoft.com)
* @license LGPL (http://www.gnu.org/licenses/lgpl.html)
* @author Yangyang Shi <shiyangyang@cnezsoft.com>
* @package task
* @version $Id$
* @link http://www.zentao.net
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/colorize.html.php';?>
<form method='post' enctype='multipart/form-data' target='hiddenwin'>
<table class='table-1 colored'>
<tr class='colhead'>
<th class='w-id'> <?php echo $lang->task->importBug;?></th>
<th class='w-id'> <?php echo $lang->idAB;?></th>
<th class='hidden'></th>
<th class='w-severity'> <?php echo $lang->bug->severityAB;?></th>
<th class='w-pri'> <?php echo $lang->priAB;?></th>
<th><?php echo $lang->bug->title;?></th>
<th class='w-80px'><?php echo $lang->bug->statusAB;?></th>
<th class='w-80px'><?php echo $lang->task->pri;?></th>
<th class='w-150px'><?php echo $lang->task->assignedTo;?></th>
<th class='w-50px'><?php echo $lang->task->estimateBatch;?></th>
</tr>
<?php foreach($bugs as $bug):?>
<tr class='a-center'>
<td><?php echo html::checkbox("import[$bug->id]", '');?> </td>
<?php $class = ($bug->status == 'active' or $bug->status == 'reactivated') ? 'active' . $bug->severity : $bug->status;?>
<td class='linkbox <?php echo $class;?>'><?php echo sprintf('%03d', $bug->id);?></td>
<td class='hidden'><?php echo html::input("id[$bug->id]", $bug->id);?></td>
<td><?php echo $lang->bug->severityList[$bug->severity]?></td>
<td><?php echo $lang->bug->priList[$bug->pri]?></td>
<td class='a-left nobr'><?php echo $bug->title;?></td>
<td><?php echo $lang->bug->statusList[$bug->status];?></td>
<td><?php echo html::select("pri[$bug->id]", $lang->task->priList, 3);?></td>
<td><?php echo html::select("assignedTo[$bug->id]", $users, '');?></td>
<td><?php echo html::input("estimate[$bug->id]", '', 'size=4');?></td>
</tr>
<?php endforeach;?>
<tr>
<td colspan='9'>
<div class='f-left'>
<?php
foreach($lang->bug->statusList as $status => $label)
{
if($status != 'active') continue;
rsort($this->lang->bug->severityList);
foreach($this->lang->bug->severityList as $severity)
{
echo "<span class='$status$severity'> {$lang->bug->severity}:$severity </span> ";
}
}
?>
</div>
<div class='f-right'><?php $pager->show();?></div>
</td>
</tr>
<tr><td colspan='9' class='a-center'><?php echo html::submitButton($lang->task->importBug) . html::resetButton();?></td></tr>
</table>
</form>
<?php include '../../common/view/footer.html.php';?>
+4
View File
@@ -12,7 +12,11 @@
?>
<?php include '../../common/view/header.html.php';?>
<div id='titlebar'>
<?php if($task->fromBug == 0):?>
<div id='main' class='<?php if($task->deleted) echo 'deleted';?>'>TASK #<?php echo $task->id . $lang->colon . $task->name;?></div>
<?php else:?>
<div id='main' class='<?php if($task->deleted) echo 'deleted';?>'>TASK #<?php echo $task->id . $lang->colon . $task->name . '('. $lang->task->fromBug . $lang->colon . $task->fromBug . ')';?></div>
<?php endif;?>
<div>
<?php
$browseLink = $app->session->taskList != false ? $app->session->taskList : $this->createLink('project', 'browse', "projectID=$task->project");