From 1fd3942fcc4d6b5f3ace351fd5540c863fe692e6 Mon Sep 17 00:00:00 2001 From: wangchunsheng Date: Sun, 28 Mar 2010 14:33:08 +0000 Subject: [PATCH] + add the feature of import task to a project. --- trunk/module/action/lang/zh-cn.php | 2 + trunk/module/group/lang/zh-cn.php | 1 + trunk/module/project/control.php | 28 +++++-- trunk/module/project/lang/zh-cn.php | 2 + trunk/module/project/model.php | 64 +++++++++++++++- trunk/module/project/view/importtask.html.php | 75 +++++++++++++++++++ trunk/module/project/view/task.html.php | 4 +- trunk/module/project/view/taskheader.html.php | 9 ++- 8 files changed, 173 insertions(+), 12 deletions(-) create mode 100644 trunk/module/project/view/importtask.html.php diff --git a/trunk/module/action/lang/zh-cn.php b/trunk/module/action/lang/zh-cn.php index c1583b4a20..25bb89d4d6 100644 --- a/trunk/module/action/lang/zh-cn.php +++ b/trunk/module/action/lang/zh-cn.php @@ -29,6 +29,7 @@ $lang->action->desc->edited = '$date, 由 $actor 编辑。'; $lang->action->desc->closed = '$date, 由 $actor 关闭。'; $lang->action->desc->commented = '$date, 由 $actor 发表评论。'; $lang->action->desc->activated = '$date, 由 $actor 激活。'; +$lang->action->desc->moved = '$date, 由 $actor 移动,之前为 "$extra"'; $lang->action->desc->diff1 = '修改了 %s,旧值为 "%s",新值为 "%s"。
'; $lang->action->desc->diff2 = '修改了 %s,区别为:
%s
'; @@ -40,6 +41,7 @@ $lang->action->label->commented = '评论了'; $lang->action->label->activated = '激活了'; $lang->action->label->resolved = '解决了'; $lang->action->label->reviewed = '评审了'; +$lang->action->label->moved = '移动了'; $lang->action->label->story = '需求|story|view|storyID=%s'; $lang->action->label->task = '任务|task|view|taskID=%s'; $lang->action->label->bug = 'Bug|bug|view|bugID=%s'; diff --git a/trunk/module/group/lang/zh-cn.php b/trunk/module/group/lang/zh-cn.php index 207fe41313..95be6347d8 100644 --- a/trunk/module/group/lang/zh-cn.php +++ b/trunk/module/group/lang/zh-cn.php @@ -109,6 +109,7 @@ $lang->resource->project->edit = 'edit'; $lang->resource->project->delete = 'delete'; $lang->resource->project->task = 'task'; $lang->resource->project->grouptask = 'groupTask'; +$lang->resource->project->importtask = 'importTask'; $lang->resource->project->story = 'story'; $lang->resource->project->build = 'build'; $lang->resource->project->bug = 'bug'; diff --git a/trunk/module/project/control.php b/trunk/module/project/control.php index 7c44f3b425..6872b7f5de 100644 --- a/trunk/module/project/control.php +++ b/trunk/module/project/control.php @@ -73,7 +73,7 @@ class project extends control } /* 浏览某一个项目下面的任务。*/ - public function task($projectID = 0, $orderBy = 'statusasc,iddesc', $recTotal = 0, $recPerPage = 20, $pageID = 1) + public function task($projectID = 0, $status = 'all', $orderBy = 'status_asc,id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { /* 公共的操作。*/ $project = $this->commonAction($projectID); @@ -91,7 +91,7 @@ class project extends control /* 分页操作。*/ $this->app->loadClass('pager', $static = true); $pager = new pager($recTotal, $recPerPage, $pageID); - $tasks = $this->loadModel('task')->getProjectTasks($projectID, $orderBy, $pager); + $tasks = $this->loadModel('task')->getProjectTasks($projectID, $status, $orderBy, $pager); /* 赋值。*/ $this->view->tasks = $tasks ? $tasks : array(); @@ -122,7 +122,7 @@ class project extends control $this->view->position[] = $this->lang->project->task; /* 获得任务列表,并将其分组。*/ - $tasks = $this->loadModel('task')->getProjectTasks($projectID, $groupBy); + $tasks = $this->loadModel('task')->getProjectTasks($projectID, $status = 'all', $groupBy); $groupBy = strtolower(str_replace('`', '', $groupBy)); $taskLang = $this->lang->task; $groupByList = array(); @@ -159,8 +159,26 @@ class project extends control $this->display(); } + /* 将之前未完成的项目任务导入。*/ + public function importTask($projectID) + { + if(!empty($_POST)) + { + $this->project->importTask($projectID); + die(js::locate(inlink('task', "projectID=$projectID"), 'parent')); + } + + $project = $this->commonAction($projectID); + + $this->view->header->title = $project->name . $this->lang->colon . $this->lang->project->importTask; + $this->view->position[] = html::a(inlink('browse', "projectID=$projectID"), $project->name); + $this->view->position[] = $this->lang->project->importTask; + $this->view->tasks2Imported = $this->project->getTasks2Imported($projectID); + $this->display(); + } + /* 浏览某一个项目下面的需求。*/ - public function story($projectID = 0, $orderBy = 'statusdesc', $recTotal = 0, $recPerPage = 20, $pageID = 1) + public function story($projectID = 0, $orderBy = 'status_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { /* 加载story, user模块,加载task模块的语言。*/ $this->loadModel('story'); @@ -199,7 +217,7 @@ class project extends control } /* 浏览某一个项目下面的bug。*/ - public function bug($projectID = 0, $orderBy = 'status,iddesc', $recTotal = 0, $recPerPage = 20, $pageID = 1) + public function bug($projectID = 0, $orderBy = 'status,id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { /* 加载bug和user模块。*/ $this->loadModel('bug'); diff --git a/trunk/module/project/lang/zh-cn.php b/trunk/module/project/lang/zh-cn.php index 776338cf8e..4d45136d25 100644 --- a/trunk/module/project/lang/zh-cn.php +++ b/trunk/module/project/lang/zh-cn.php @@ -38,6 +38,8 @@ $lang->project->linkStory = '关联需求'; $lang->project->unlinkStory = '移除需求'; $lang->project->manageTasks = '任务管理'; $lang->project->linkTask = '关联任务'; +$lang->project->importTask = '导入任务'; +$lang->project->import = '导入'; $lang->project->manageChilds = '关联子项目'; $lang->project->confirmDelete = '您确定删除项目[%s]吗?'; $lang->project->confirmUnlinkMember = '您确定从该项目中移除该用户吗?'; diff --git a/trunk/module/project/model.php b/trunk/module/project/model.php index 835d2ac990..aa7de1a581 100644 --- a/trunk/module/project/model.php +++ b/trunk/module/project/model.php @@ -100,7 +100,7 @@ class projectModel extends model /* 获得项目id=>name列表。*/ public function getPairs() { - return $this->dao->select('id,name')->from(TABLE_PROJECT)->where('iscat')->eq(0)->andwhere('company')->eq($this->app->company->id)->orderBy('status, enddesc')->fetchPairs(); + return $this->dao->select('id,name')->from(TABLE_PROJECT)->where('iscat')->eq(0)->andwhere('company')->eq($this->app->company->id)->orderBy('status, end_desc')->fetchPairs(); } /* 获得完整的列表。*/ @@ -108,7 +108,7 @@ class projectModel extends model { $sql = $this->dao->select('*')->from(TABLE_PROJECT)->where('iscat')->eq(0)->andwhere('company')->eq($this->app->company->id); if($status != 'all') $sql->andWhere('status')->in($status); - return $sql->orderBy('status, enddesc')->fetchAll(); + return $sql->orderBy('status, end_desc')->fetchAll(); } /* 通过Id获取项目信息。*/ @@ -156,6 +156,64 @@ class projectModel extends model ->fetchPairs(); } + /* 获得可以被导入的任务列表。*/ + public function getTasks2Imported($projectID) + { + $this->loadModel('task'); + $releatedProjects = $this->getRelatedProjects($projectID); + if(!$releatedProjects) return array(); + $tasks = array(); + foreach($releatedProjects as $releatedProjectID => $releatedProjectName) + { + $projectTasks = $this->task->getProjectTasks($releatedProjectID, 'wait,doing,cancel'); + if(!$projectTasks) continue; + $tasks = array_merge($tasks, $projectTasks); + } + return $tasks; + } + + /* 导入任务。*/ + public function importTask($projectID) + { + $tasks = $this->dao->select('id, project, owner, story')->from(TABLE_TASK)->where('id')->in($this->post->tasks)->fetchAll('id'); + + /* 更新task表。*/ + foreach($tasks as $task) + { + /* 记录owner和story。*/ + $owners[$task->owner] = $task->project; + $stories[$task->story] = $task->story; + + $status = $task->consumed > 0 ? 'doing' : 'wait'; + $this->dao->update(TABLE_TASK)->set('project')->eq($projectID)->set('status')->eq($status)->where('id')->in($this->post->tasks)->exec(); + $this->loadModel('action')->create('task', $task->id, 'moved', '', $task->project); + } + + /* 将没有关联进来的用户加入到团队中。*/ + $teamMembers = $this->getTeamMemberPairs($projectID); + foreach($owners as $account => $preProjectID) + { + if(!isset($teamMembers[$account])) + { + $role = $this->dao->select('*')->from(TABLE_TEAM)->where('project')->eq($preProjectID)->andWhere('account')->eq($account)->fetch(); + $role->project = $projectID; + $role->joinDate = helper::today(); + $this->dao->insert(TABLE_TEAM)->data($role)->exec(); + } + } + + /* 将没有关联的需求关联到项目中。*/ + $projectStories = $this->loadModel('story')->getProjectStoryPairs($projectID); + foreach($stories as $storyID) + { + if(!isset($projectStories[$storyID])) + { + $story = $this->dao->findById($storyID)->fields("$projectID as project, id as story, product, version")->from(TABLE_STORY)->fetch(); + $this->dao->insert(TABLE_PROJECTSTORY)->data($story)->exec(); + } + } + } + /* 获得相关的子项目列表。*/ public function getChildProjects($projectID) { @@ -286,7 +344,7 @@ class projectModel extends model /* 没有指定结束日期的情况。*/ if($project->end == '0000-00-00') { - $sets = $sql->orderBy('datedesc')->limit(14)->fetchAll('name'); + $sets = $sql->orderBy('date_desc')->limit(14)->fetchAll('name'); $sets = array_reverse($sets); /* 如果没有记录,手工补齐。*/ diff --git a/trunk/module/project/view/importtask.html.php b/trunk/module/project/view/importtask.html.php new file mode 100644 index 0000000000..8a6cb27280 --- /dev/null +++ b/trunk/module/project/view/importtask.html.php @@ -0,0 +1,75 @@ +. + * + * @copyright Copyright 2009-2010 Chunsheng Wang + * @author Chunsheng Wang + * @package project + * @version $Id$ + * @link http://www.zentao.cn + */ +?> + + +
+
+ + + + + + + + + + + + + + + + + + + owner == $app->user->account ? 'style=color:red' : '';?> + + + + + + + + + + + + + + + +
task->project;?>task->id;?>task->pri;?>task->name;?>task->owner;?>task->left;?>task->type;?>task->deadline;?>task->status;?>task->story;?>project->import;?>
project];?>id", sprintf('%03d', $task->id))) printf('%03d', $task->id);?>pri;?>id", $task->name)) echo $task->name;?>>ownerRealName;?>left;?>task->typeList[$task->type];?>delay)) echo 'delayed';?>>deadline, 0, 4) > 0) echo $task->deadline;?>status;?> >task->statusList[$task->status];?> + storyID) + { + if(common::hasPriv('story', 'view')) echo html::a($this->createLink('story', 'view', "storyid=$task->storyID"), $task->storyTitle); + else echo $task->storyTitle; + } + ?> +
+
project->importTask);?>
+
+
+ diff --git a/trunk/module/project/view/task.html.php b/trunk/module/project/view/task.html.php index cb8d8601c9..ecd34e251c 100644 --- a/trunk/module/project/view/task.html.php +++ b/trunk/module/project/view/task.html.php @@ -27,7 +27,7 @@
- id&orderBy=%s&recTotal=$recTotal&recPerPage=$recPerPage"; ?> + id&status=all&orderBy=%s&recTotal=$recTotal&recPerPage=$recPerPage"; ?> @@ -36,7 +36,7 @@ - + diff --git a/trunk/module/project/view/taskheader.html.php b/trunk/module/project/view/taskheader.html.php index 467b7ada81..43d78d643f 100644 --- a/trunk/module/project/view/taskheader.html.php +++ b/trunk/module/project/view/taskheader.html.php @@ -12,11 +12,16 @@ echo "" ; common::printLink('project', 'groupTask', "project=$project->id&groupby=owner", $lang->project->groupTaskByOwner); echo '' ; echo ""; common::printLink('project', 'groupTask', "project=$project->id&groupby=estimate",$lang->project->groupTaskByEstimate); echo '' ; echo ""; common::printLink('project', 'groupTask', "project=$project->id&groupby=consumed",$lang->project->groupTaskByConsumed); echo '' ; - echo "" ; common::printLink('project', 'groupTask', "project=$project->id&groupby=`left`", $lang->project->groupTaskByLeft); echo '' ; + echo "" ; common::printLink('project', 'groupTask', "project=$project->id&groupby=left", $lang->project->groupTaskByLeft); echo '' ; echo "" ; common::printLink('project', 'groupTask', "project=$project->id&groupby=type", $lang->project->groupTaskByType); echo '' ; echo ""; common::printLink('project', 'groupTask', "project=$project->id&groupby=deadline",$lang->project->groupTaskByDeadline); echo '' ; ?> -
id", $lang->task->create); ?>
+
+ id", $lang->task->create); + common::printLink('project', 'importTask', "project=$project->id", $lang->project->importTask); + ?> +
task->id);?>task->owner);?> task->estimate);?> task->consumed);?>task->left);?>task->left);?> task->type);?> task->deadline);?> task->status);?>