From db16ec554ef9a0d3c32a0bfb3d90569805de09b7 Mon Sep 17 00:00:00 2001 From: wangchunsheng Date: Mon, 29 Mar 2010 07:14:08 +0000 Subject: [PATCH] + add the feature of priv setting. --- module/project/control.php | 23 ++++++++----- module/project/lang/zh-cn.php | 9 +++++ module/project/model.php | 53 +++++++++++++++++++++++++++-- module/project/view/create.html.php | 14 ++++++++ module/project/view/edit.html.php | 17 +++++++-- module/project/view/view.html.php | 13 +++++++ 6 files changed, 116 insertions(+), 13 deletions(-) diff --git a/module/project/control.php b/module/project/control.php index 6872b7f5de..02558361d9 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -45,7 +45,6 @@ class project extends control { $this->locate($this->createLink($this->moduleName, 'task', "projectID=$projectID")); } - /* task, story, bug等方法的一些公共操作。*/ private function commonAction($projectID = 0) { @@ -58,7 +57,7 @@ class project extends control $products = $this->project->getProducts($project->id); $childProjects = $this->project->getChildProjects($project->id); $teamMembers = $this->project->getTeamMembers($project->id); - + /* 设置菜单。*/ $this->project->setMenu($this->projects, $project->id); @@ -69,6 +68,13 @@ class project extends control $this->assign('products', $products); $this->assign('teamMembers', $teamMembers); + /* 检查是否有访问权限。*/ + if(!$this->project->checkPriv($project)) + { + echo(js::alert($this->lang->project->accessDenied)); + die(js::locate('back')); + } + return $project; } @@ -339,13 +345,10 @@ class project extends control /* 设置菜单。*/ $this->project->setMenu($this->projects, ''); - $header['title'] = $this->lang->project->create; - $position[] = $header['title']; - $projects = array('' => '') + $this->projects; - - $this->assign('header', $header); - $this->assign('position', $position); - $this->assign('projects', $projects); + $this->view->header->title = $this->lang->project->create; + $this->view->position[] = $this->view->header->title; + $this->view->projects = array('' => '') + $this->projects; + $this->view->groups = $this->loadModel('group')->getPairs(); $this->display(); } @@ -379,6 +382,7 @@ class project extends control $this->assign('position', $position); $this->assign('projects', $projects); $this->assign('project', $project); + $this->assign('groups', $this->loadModel('group')->getPairs()); $this->display(); } @@ -394,6 +398,7 @@ class project extends control $this->assign('header', $header); $this->assign('position', $position); + $this->assign('groups', $this->loadModel('group')->getPairs()); $this->display(); } diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index 4d45136d25..4d28e180cf 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -70,6 +70,9 @@ $lang->project->canceledDate = '取消日期'; $lang->project->PO = '产品负责人'; $lang->project->PM = '项目负责人'; $lang->project->QM = '测试负责人'; +$lang->project->acl = '访问控制'; +$lang->project->whitelist = '分组白名单'; + $lang->project->teamname = '团队名称'; $lang->project->team = '团队成员'; $lang->project->products = '相关产品'; @@ -101,6 +104,12 @@ $lang->project->statusList->wait = '未开始'; $lang->project->statusList->doing = '进行中'; $lang->project->statusList->done = '已完成'; +$lang->project->aclList['open'] = '默认设置(有项目视图权限,即可访问)'; +$lang->project->aclList['private'] = '私有项目(只有项目团队成员才能访问)'; +$lang->project->aclList['custom'] = '自定义白名单(团队成员和白名单的成员可以访问)'; + +$lang->project->accessDenied = '您无权访问该项目!'; + $lang->team->account = '用户'; $lang->team->role = '角色'; $lang->team->joinDate = '加盟日'; diff --git a/module/project/model.php b/module/project/model.php index aa7de1a581..82510a4522 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -28,6 +28,35 @@ class projectModel extends model /* 每次关联成员的数量。*/ const LINK_MEMBERS_ONE_TIME = 10; + /* 检查权限。*/ + public function checkPriv($project) + { + /* 访问级别为open,不做任何处理。*/ + if($project->acl == 'open') return true; + + /* 获得团队的成员列表,供后面判断。*/ + $teamMembers = $this->getTeamMemberPairs($project->id); + + /* 级别为private。*/ + if($project->acl == 'private') + { + return isset($teamMembers[$this->app->user->account]); + } + + /* 级别为custom。*/ + if($project->acl == 'custom') + { + if(isset($teamMembers[$this->app->user->account])) return true; + $userGroups = $this->loadModel('user')->getGroups($this->app->user->account); + $projectGroups = explode(',', $project->whitelist); + foreach($userGroups as $groupID) + { + if(in_array($groupID, $projectGroups)) return true; + } + return false; + } + } + /* 设置菜单。*/ public function setMenu($projects, $projectID) { @@ -47,6 +76,8 @@ class projectModel extends model ->add('company', $this->app->company->id) ->stripTags('name, code, team') ->specialChars('goal, desc') + ->setIF($this->post->acl != 'custom', 'whitelist', '') + ->join('whitelist', ',') ->get(); $this->dao->insert(TABLE_PROJECT)->data($project) ->autoCheck($skipFields = 'begin,end') @@ -56,7 +87,17 @@ class projectModel extends model ->check('name', 'unique') ->check('code', 'unique') ->exec(); - if(!dao::isError()) return $this->dao->lastInsertId(); + + /* 将当前操作者加入到项目团队中。*/ + if(!dao::isError()) + { + $projectID = $this->dao->lastInsertId(); + $member->project = $projectID; + $member->account = $this->app->user->account; + $member->joinDate = helper::today(); + $this->dao->insert(TABLE_TEAM)->data($member)->exec(); + return $projectID; + } } /* 更新一个项目。*/ @@ -69,6 +110,8 @@ class projectModel extends model ->specialChars('goal, desc') ->setIF($this->post->begin == '0000-00-00', 'begin', '') ->setIF($this->post->end == '0000-00-00', 'end', '') + ->setIF($this->post->acl != 'custom', 'whitelist', '') + ->join('whitelist', ',') ->get(); $this->dao->update(TABLE_PROJECT)->data($project) ->autoCheck($skipFields = 'begin,end') @@ -100,7 +143,13 @@ 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, end_desc')->fetchPairs(); + $projects = $this->dao->select('*')->from(TABLE_PROJECT)->where('iscat')->eq(0)->andwhere('company')->eq($this->app->company->id)->orderBy('status, end desc')->fetchAll(); + $pairs = array(); + foreach($projects as $project) + { + if($this->checkPriv($project)) $pairs[$project->id] = $project->name; + } + return $pairs; } /* 获得完整的列表。*/ diff --git a/module/project/view/create.html.php b/module/project/view/create.html.php index 0e87a0aa90..39395aa906 100644 --- a/module/project/view/create.html.php +++ b/module/project/view/create.html.php @@ -24,6 +24,12 @@ ?> +
@@ -57,6 +63,14 @@ + + + + + + + + diff --git a/module/project/view/edit.html.php b/module/project/view/edit.html.php index 80767932b1..82e3d1cb24 100644 --- a/module/project/view/edit.html.php +++ b/module/project/view/edit.html.php @@ -24,6 +24,13 @@ ?> + +
project->desc;?>
project->acl;?>project->aclList, 'open', "onclick='setWhite(this.value);'");?>
@@ -61,8 +68,14 @@ - - + + + + acl != 'custom') echo "class='hidden'";?>> + + + +
desc, "rows='5' class='area-1'");?>
project->acl;?>project->aclList, $project->acl, "onclick='setWhite(this.value);'");?>
project->whitelist;?>whitelist);?>
diff --git a/module/project/view/view.html.php b/module/project/view/view.html.php index fad57b36d5..e86b348dab 100644 --- a/module/project/view/view.html.php +++ b/module/project/view/view.html.php @@ -60,6 +60,19 @@ $productName) echo html::a($this->createLink('product', 'browse', "productID=$productID"), $productName) . '
';?> + + project->acl;?> + project->aclList[$project->acl];?> + + + project->whitelist;?> + + whitelist); + foreach($whitelist as $groupID) if(isset($groups[$groupID])) echo $groups[$groupID] . ' '; + ?> + +