From f669c70afda793f05aa166c9e664c0ebcabfa7f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E9=87=91=E5=8B=87?= Date: Tue, 19 Dec 2023 12:07:00 +0800 Subject: [PATCH] * Refactor methods of group: update*. --- module/group/control.php | 9 +- module/group/model.php | 390 +++++++++--------- module/group/test/group.class.php | 66 ++- module/group/test/model/getprivlistbynav.php | 0 module/group/test/model/insertprivs.php | 30 ++ module/group/test/model/isclickable.php | 32 ++ module/group/test/model/sortresource.php | 31 ++ .../group/test/model/updateprojectadmin.php | 52 ++- module/group/test/model/updateuser.php | 23 +- module/group/test/model/updateview.php | 41 +- module/group/ui/manageview.html.php | 1 - module/group/zen.php | 65 +++ 12 files changed, 495 insertions(+), 245 deletions(-) create mode 100644 module/group/test/model/getprivlistbynav.php create mode 100755 module/group/test/model/insertprivs.php create mode 100755 module/group/test/model/isclickable.php create mode 100755 module/group/test/model/sortresource.php diff --git a/module/group/control.php b/module/group/control.php index a2040877c4..2004273409 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -133,7 +133,8 @@ class group extends control { if($_SERVER['REQUEST_METHOD'] == 'POST') { - $this->group->updateView($groupID); + $formData = $this->buildUpdateViewForm(); + $this->group->updateView($groupID, $formData); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); $link = isInModal() ? 'parent' : $this->createLink('group', 'browse'); @@ -160,9 +161,11 @@ class group extends control $executions = $this->loadModel('execution')->getPairs(0, 'all', 'all'); foreach($executions as $id => $name) { - if(isset($executionProject[$id])) $executions[$id] = $executionProject[$id] . ' / ' . $name; + if(isset($executionProject[$id])) $executions[$id] = $executionProject[$id] . ' / ' . trim($name, '/'); } + $this->app->loadLang('action'); + $this->view->group = $group; $this->view->programs = $this->loadModel('program')->getParentPairs('', '', false); $this->view->projects = $this->loadModel('project')->getPairsByProgram(0, 'all', true, 'order_desc'); @@ -262,7 +265,7 @@ class group extends control { if(!empty($_POST)) { - $this->group->updateProjectAdmin($groupID); + $this->group->updateProjectAdmin($groupID, $this->buildProjectAdminForm()); return $this->sendSuccess(array('load' => true)); } diff --git a/module/group/model.php b/module/group/model.php index 535f4be613..10dee62bf7 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -378,6 +378,7 @@ class groupModel extends model } /** + * 获取项目管理员。 * Get project admins for manage project admin. * * @access public @@ -434,6 +435,7 @@ class groupModel extends model } /** + * 删除分组。 * Remove group. * * @param int $groupID @@ -475,26 +477,23 @@ class groupModel extends model } /** + * 更新视野权限。 * Update view priv. * * @param int $groupID + * @param array $actions * @access public * @return bool */ - public function updateView(int $groupID) + public function updateView(int $groupID, array $actions) { - $actions = $this->post->actions; - $oldGroup = $this->getByID($groupID); - $projects = isset($actions['projects']) ? $actions['projects'] : array(); - $sprints = isset($actions['sprints']) ? $actions['sprints'] : array(); - - /* Add shadow productID when select noProduct project or execution. */ - if(($projects or $sprints) and isset($actions['products'])) + /* 如果产品不为空,需要将影子产品追加上。Add shadow productID when select noProduct project or execution. */ + if(($actions['projects'] || $actions['sprints']) && isset($actions['products'])) { /* Get all noProduct projects and executions . */ $noProductList = $this->loadModel('project')->getNoProductList(); $shadowProductIDList = $this->dao->select('id')->from(TABLE_PRODUCT)->where('shadow')->eq(1)->fetchPairs(); - $noProductObjects = array_merge($projects, $sprints); + $noProductObjects = array_merge($actions['projects'], $actions['sprints']); foreach($noProductObjects as $objectID) { @@ -502,17 +501,16 @@ class groupModel extends model } } - $actions['views'] = empty($actions['views']) ? array() : array_keys($actions['views']); - $actions['views'] = array_combine($actions['views'], $actions['views']); - if(isset($_POST['actionallchecker'])) $actions['views'] = array(); - if(!isset($actions['actions'])) $actions['actions'] = array(); - - if(isset($actions['actions']['project']['started'])) $actions['actions']['project']['syncproject'] = 'syncproject'; - if(isset($actions['actions']['execution']['started'])) $actions['actions']['execution']['syncexecution'] = 'syncexecution'; - - $dynamic = $actions['actions']; - if(!isset($_POST['actionallchecker'])) + /* 设置views。 Set views. */ + if(!$actions['actionallchecker']) { + $actions['views'] = empty($actions['views']) ? array() : array_keys($actions['views']); + $actions['views'] = array_combine($actions['views'], $actions['views']); + + if(!isset($actions['actions'])) $actions['actions'] = array(); + if(isset($actions['actions']['project']['started'])) $actions['actions']['project']['syncproject'] = 'syncproject'; + if(isset($actions['actions']['execution']['started'])) $actions['actions']['execution']['syncexecution'] = 'syncexecution'; + $dynamic = array(); foreach($actions['actions'] as $moduleName => $moduleActions) { @@ -524,15 +522,16 @@ class groupModel extends model $moduleActions = array_keys($moduleActions); $dynamic[$moduleName] = array_combine($moduleActions, $moduleActions); } + $actions['actions'] = $dynamic; } - $actions['actions'] = $dynamic; $actions = empty($actions) ? '' : json_encode($actions); $this->dao->update(TABLE_GROUP)->set('acl')->eq($actions)->where('id')->eq($groupID)->exec(); - return dao::isError() ? false : true; + return !dao::isError(); } /** + * 按分组维护权限。 * Update privilege of a group. * * @param int $groupID @@ -615,6 +614,7 @@ class groupModel extends model } /** + * 按模块维护权限。 * Update privilege by module. * * @access public @@ -642,6 +642,7 @@ class groupModel extends model } /** + * 更新用户。 * Update users. * * @param int $groupID @@ -683,82 +684,65 @@ class groupModel extends model } /** + * 更新项目管理员。 * Update project admins. * * @param int $groupID + * @param array $formData * @access public * @return void */ - public function updateProjectAdmin(int $groupID) + public function updateProjectAdmin(int $groupID, array $formData) { - $this->loadModel('user'); - $allUsers = $this->dao->select('account')->from(TABLE_PROJECTADMIN)->fetchPairs(); $this->dao->delete()->from(TABLE_PROJECTADMIN)->exec(); - $members = $this->post->members ? $this->post->members : array(); - $programs = $this->post->program ? $this->post->program : array(); - $projects = $this->post->project ? $this->post->project : array(); - $products = $this->post->product ? $this->post->product : array(); - $executions = $this->post->execution ? $this->post->execution : array(); - $programAll = $this->post->programAll ? $this->post->programAll : ''; - $projectAll = $this->post->projectAll ? $this->post->projectAll : ''; - $productAll = $this->post->productAll ? $this->post->productAll : ''; - $executionAll = $this->post->executionAll ? $this->post->executionAll : ''; $noProductList = $this->loadModel('project')->getNoProductList(); $shadowProductIDList = $this->dao->select('id')->from(TABLE_PRODUCT)->where('shadow')->eq(1)->fetchPairs(); - foreach($members as $lineID => $accounts) + foreach($formData as $lineID => $data) { - $programs[$lineID] = isset($programs[$lineID]) ? $programs[$lineID] : array(); - $projects[$lineID] = isset($projects[$lineID]) ? $projects[$lineID] : array(); - $products[$lineID] = isset($products[$lineID]) ? $products[$lineID] : array(); - $executions[$lineID] = isset($executions[$lineID]) ? $executions[$lineID] : array(); - - if(($projects[$lineID] or $executions[$lineID]) and !empty($products[$lineID])) + if(!in_array('all', $data['product'])) { - $objects = array_merge($projects[$lineID], $executions[$lineID]); - foreach($objects as $objectID) + /* 无产品项目的隐藏产品需要添加到product里。 Append products of 'No Product' project,execution. */ + if($data['project'] || $data['execution']) { - if(isset($noProductList[$objectID])) $products[$lineID][] = $noProductList[$objectID]->product; + $objects = array_merge($data['project'], $data['execution']); + foreach($objects as $objectID) + { + if(isset($noProductList[$objectID])) $data['product'][] = $noProductList[$objectID]->product; + } } + + if((in_array('all', $data['execution']) || in_array('all', $data['project']))) $data['product'] = array_merge($data['product'], $shadowProductIDList); } - if(isset($executionAll[$lineID]) or isset($projectAll[$lineID])) $products[$lineID] = array_merge($products[$lineID], $shadowProductIDList); - - if(empty($accounts)) continue; - foreach($accounts as $account) + foreach($data['accounts'] as $account) { - $program = isset($programAll[$lineID]) ? 'all' : implode(',', $programs[$lineID]); - $project = isset($projectAll[$lineID]) ? 'all' : implode(',', $projects[$lineID]); - $product = isset($productAll[$lineID]) ? 'all' : implode(',', $products[$lineID]); - $execution = isset($executionAll[$lineID]) ? 'all' : implode(',', $executions[$lineID]); - - $data = new stdclass(); - $data->group = $lineID; - $data->account = $account; - $data->programs = $program; - $data->projects = $project; - $data->products = $product; - $data->executions = $execution; - - $this->dao->replace(TABLE_PROJECTADMIN)->data($data)->exec(); + $projectAdmin = new stdclass(); + $projectAdmin->group = $lineID; + $projectAdmin->account = $account; + $projectAdmin->programs = implode(',', $data['program']); + $projectAdmin->projects = implode(',', $data['project']); + $projectAdmin->products = implode(',', $data['product']); + $projectAdmin->executions = implode(',', $data['execution']); + $this->dao->replace(TABLE_PROJECTADMIN)->data($projectAdmin)->exec(); $allUsers[$account] = $account; } } + $this->loadModel('user'); foreach($allUsers as $account) { - if(!$account) continue; - $this->user->computeUserView($account, true); + if($account) $this->user->computeUserView($account, true); } - if(!dao::isError()) return true; - return false; + return !dao::isError(); } /** + * resource排序。 * Sort resource. * * @access public @@ -815,25 +799,7 @@ class groupModel extends model } /** - * Check nav have subset. - * - * @param string $nav - * @param string $subset - * @access public - * @return bool - */ - public function checkNavSubset(string $nav, string $subset): bool - { - if(empty($nav)) return true; - - if($nav == 'general') return !isset($this->config->group->subset->$subset) || !isset($this->config->group->subset->$subset->nav) || $this->config->group->subset->$subset->nav == 'general'; - - return isset($this->config->group->subset->$subset) - && isset($this->config->group->subset->$subset->nav) - && $this->config->group->subset->$subset->nav == $nav; - } - - /** + * 判断分组操作是否可点击。 * Judge an action is clickable or not. * * @param object $group @@ -853,6 +819,78 @@ class groupModel extends model return true; } + /** + * Load language of resource. + * + * @access public + * @return void + */ + public function loadResourceLang(): void + { + foreach($this->lang->resource as $moduleName => $action) $this->app->loadLang($moduleName); + + $this->app->loadLang('doc'); + $this->app->loadLang('api'); + + $this->lang->custom->common = $this->lang->group->config; + $this->lang->doc->common = $this->lang->doc->manage; + $this->lang->api->common = $this->lang->api->manage; + + if(($this->config->edition == 'max' or $this->config->edition == 'ipd') and $this->config->vision == 'rnd' and isset($this->lang->baseline)) $this->lang->baseline->common = $this->lang->group->docTemplate; + } + + /** + * Process circular dependency. + * + * @param array $depends + * @param array $privs + * @param array $excludes + * @access protected + * @return array + */ + protected function processDepends(array $depends, array $privs, array $excludes): array + { + foreach($privs as $priv) + { + if(!isset($depends[$priv])) continue; + + foreach($depends[$priv] as $dependPriv) + { + if(isset($privs[$dependPriv]) || in_array($dependPriv, $excludes)) continue; + $privs[$dependPriv] = $dependPriv; + + $dependPrivs = $this->processDepends($depends, $depends[$dependPriv], $excludes); + + foreach($dependPrivs as $depend) + { + if(!in_array($depend, $excludes)) $privs[$depend] = $depend; + } + } + } + + return $privs; + } + + /** + * 检查subset是否属于该nav。 + * Check nav have subset. + * + * @param string $nav + * @param string $subset + * @access protected + * @return bool + */ + protected function checkNavSubset(string $nav, string $subset): bool + { + if(empty($nav)) return true; + + if($nav == 'general') return !isset($this->config->group->subset->$subset) || !isset($this->config->group->subset->$subset->nav) || $this->config->group->subset->$subset->nav == 'general'; + + return isset($this->config->group->subset->$subset) + && isset($this->config->group->subset->$subset->nav) + && $this->config->group->subset->$subset->nav == $nav; + } + /** * Get priv list by nav. * @@ -914,124 +952,6 @@ class groupModel extends model return $privList; } - /** - * Load language of resource. - * - * @access public - * @return void - */ - public function loadResourceLang(): void - { - foreach($this->lang->resource as $moduleName => $action) $this->app->loadLang($moduleName); - - $this->app->loadLang('doc'); - $this->app->loadLang('api'); - - $this->lang->custom->common = $this->lang->group->config; - $this->lang->doc->common = $this->lang->doc->manage; - $this->lang->api->common = $this->lang->api->manage; - - if(($this->config->edition == 'max' or $this->config->edition == 'ipd') and $this->config->vision == 'rnd' and isset($this->lang->baseline)) $this->lang->baseline->common = $this->lang->group->docTemplate; - } - - /** - * Process circular dependency. - * - * @param array $depends - * @param array $privs - * @param array $excludes - * @access protected - * @return array - */ - protected function processDepends(array $depends, array $privs, array $excludes): array - { - foreach($privs as $priv) - { - if(!isset($depends[$priv])) continue; - - foreach($depends[$priv] as $dependPriv) - { - if(isset($privs[$dependPriv]) || in_array($dependPriv, $excludes)) continue; - $privs[$dependPriv] = $dependPriv; - - $dependPrivs = $this->processDepends($depends, $depends[$dependPriv], $excludes); - - foreach($dependPrivs as $depend) - { - if(!in_array($depend, $excludes)) $privs[$depend] = $depend; - } - } - } - - return $privs; - } - - /** - * Get related privs. - * - * @param array $allPrivList - * @param array $selectedPrivList - * @param array $recommendSelect - * @access public - * @return array - */ - public function getRelatedPrivs(array $allPrivList, array $selectedPrivList, array $recommendSelect = array()): array - { - $this->loadResourceLang(); - - $depends = array(); - - $privSubsets = array(); - $relatedPrivs = array('depend' => array(), 'recommend' => array()); - foreach($this->config->group->package as $packagePage => $package) - { - if(!isset($package->privs)) continue; - - foreach($package->privs as $privCode => $priv) - { - $privSubsets[$privCode] = $package->subset; - - foreach(array('depend', 'recommend') as $type) - { - /* Show related pirvs when select. */ - if($type == 'recommend' && in_array($privCode, $recommendSelect)) $relatedPrivs[$type][$privCode] = $privCode; - if($type == 'depend') $depends[$privCode] = $priv['depend']; - - if(!in_array($privCode, $selectedPrivList) || !isset($priv[$type])) continue; - - foreach($priv[$type] as $relatedPriv) - { - if(!in_array($relatedPriv, $selectedPrivList) && in_array($relatedPriv, $allPrivList)) $relatedPrivs[$type][$relatedPriv] = $relatedPriv; - } - } - } - } - - /* Process circular dependency. */ - $relatedPrivs['depend'] = $this->processDepends($depends, $relatedPrivs['depend'], $selectedPrivList); - - $subsetPrivs = array('depend' => array(), 'recommend' => array()); - foreach(array('depend', 'recommend') as $type) - { - foreach($relatedPrivs[$type] as $relatedPriv) - { - if($type == 'recommend' && isset($relatedPrivs['depend'][$relatedPriv])) continue; // Don't show depend privs to recommend. - - $subsetName = $privSubsets[$relatedPriv]; - $subsetTitle = isset($this->lang->$subsetName) && isset($this->lang->$subsetName->common) ? $this->lang->$subsetName->common : $subsetName; - if(!isset($subsetPrivs[$type][$subsetName])) $subsetPrivs[$type][$subsetName] = array('id' => $subsetName, 'text' => $subsetTitle, 'children' => array()); - - list($moduleName, $methodName) = explode('-', $relatedPriv); - $method = $this->lang->resource->$moduleName->$methodName; - - if(!isset($this->lang->$moduleName->$method)) $this->app->loadLang($moduleName); - $subsetPrivs[$type][$subsetName]['children'][] = array('id' => $relatedPriv, 'data-module' => $moduleName, 'data-method' => $methodName, 'subset' => $subsetName, 'text' => $this->lang->$moduleName->$method, 'data-id' => $relatedPriv); - } - } - - return array('depend' => array_values($subsetPrivs['depend']), 'recommend' => array_values($subsetPrivs['recommend'])); - } - /** * Get privs list by group. * @@ -1115,4 +1035,70 @@ class groupModel extends model return $versionPrivs; } + + /** + * Get related privs. + * + * @param array $allPrivList + * @param array $selectedPrivList + * @param array $recommendSelect + * @access public + * @return array + */ + public function getRelatedPrivs(array $allPrivList, array $selectedPrivList, array $recommendSelect = array()): array + { + $this->loadResourceLang(); + + $depends = array(); + + $privSubsets = array(); + $relatedPrivs = array('depend' => array(), 'recommend' => array()); + foreach($this->config->group->package as $packagePage => $package) + { + if(!isset($package->privs)) continue; + + foreach($package->privs as $privCode => $priv) + { + $privSubsets[$privCode] = $package->subset; + + foreach(array('depend', 'recommend') as $type) + { + /* Show related pirvs when select. */ + if($type == 'recommend' && in_array($privCode, $recommendSelect)) $relatedPrivs[$type][$privCode] = $privCode; + if($type == 'depend') $depends[$privCode] = $priv['depend']; + + if(!in_array($privCode, $selectedPrivList) || !isset($priv[$type])) continue; + + foreach($priv[$type] as $relatedPriv) + { + if(!in_array($relatedPriv, $selectedPrivList) && in_array($relatedPriv, $allPrivList)) $relatedPrivs[$type][$relatedPriv] = $relatedPriv; + } + } + } + } + + /* Process circular dependency. */ + $relatedPrivs['depend'] = $this->processDepends($depends, $relatedPrivs['depend'], $selectedPrivList); + + $subsetPrivs = array('depend' => array(), 'recommend' => array()); + foreach(array('depend', 'recommend') as $type) + { + foreach($relatedPrivs[$type] as $relatedPriv) + { + if($type == 'recommend' && isset($relatedPrivs['depend'][$relatedPriv])) continue; // Don't show depend privs to recommend. + + $subsetName = $privSubsets[$relatedPriv]; + $subsetTitle = isset($this->lang->$subsetName) && isset($this->lang->$subsetName->common) ? $this->lang->$subsetName->common : $subsetName; + if(!isset($subsetPrivs[$type][$subsetName])) $subsetPrivs[$type][$subsetName] = array('id' => $subsetName, 'text' => $subsetTitle, 'children' => array()); + + list($moduleName, $methodName) = explode('-', $relatedPriv); + $method = $this->lang->resource->$moduleName->$methodName; + + if(!isset($this->lang->$moduleName->$method)) $this->app->loadLang($moduleName); + $subsetPrivs[$type][$subsetName]['children'][] = array('id' => $relatedPriv, 'data-module' => $moduleName, 'data-method' => $methodName, 'subset' => $subsetName, 'text' => $this->lang->$moduleName->$method, 'data-id' => $relatedPriv); + } + } + + return array('depend' => array_values($subsetPrivs['depend']), 'recommend' => array_values($subsetPrivs['recommend'])); + } } diff --git a/module/group/test/group.class.php b/module/group/test/group.class.php index 3ea86bcd0a..6c1445df22 100755 --- a/module/group/test/group.class.php +++ b/module/group/test/group.class.php @@ -64,6 +64,27 @@ class groupTest return $group; } + /** + * 获取group信息,方便ztf检查 + * Get group for ztf + * + * @param int $groupID + * @access private + * @return object + */ + public function insertPrivsTest($privs) + { + $this->objectModel->insertPrivs($privs); + + $privs = $this->objectModel->dao->select('*')->from(TABLE_GROUPPRIV)->fetchGroup('group'); + foreach($privs as $group => $privList) + { + foreach($privList as $key => $priv) $privs[$group][$key] = $priv->module . '-' . $priv->method; + } + + return $privs; + } + /** * Copy a group. * @@ -388,11 +409,13 @@ class groupTest */ public function updateUserTest($groupID) { - $objects = $this->objectModel->updateUser($groupID); + $this->objectModel->updateUser($groupID); if(dao::isError()) return dao::getError(); - return $objects; + $users = $this->objectModel->getUserPairs($groupID); + + return $users; } /** @@ -414,16 +437,42 @@ class groupTest * Update project admins. * * @param int $groupID + * @param array $formData * @access public * @return void */ - public function updateProjectAdminTest($groupID) + public function updateViewTest($groupID, $formData) { - $objects = $this->objectModel->updateProjectAdmin($groupID); + $this->objectModel->updateView($groupID, $formData); if(dao::isError()) return dao::getError(); + $group = $this->objectModel->getByID($groupID); + $acl = $group->acl; + if(isset($acl['actions'])) + { + foreach($acl['actions'] as $module => $methods) + { + $acl['actions'][$module] = implode('|', $methods); + } + } - return $objects; + return $acl; + } + + /** + * Update project admins. + * + * @param int $groupID + * @param array $formData + * @access public + * @return void + */ + public function updateProjectAdminTest($groupID, $formData) + { + $this->objectModel->updateProjectAdmin($groupID, $formData); + + if(dao::isError()) return dao::getError(); + return $this->getProjectAdminsTest(); } /** @@ -434,10 +483,7 @@ class groupTest */ public function sortResourceTest() { - $objects = $this->objectModel->sortResource(); - - if(dao::isError()) return dao::getError(); - - return $objects; + $this->objectModel->sortResource(); + return $this->objectModel->lang->resource; } } diff --git a/module/group/test/model/getprivlistbynav.php b/module/group/test/model/getprivlistbynav.php new file mode 100644 index 0000000000..e69de29bb2 diff --git a/module/group/test/model/insertprivs.php b/module/group/test/model/insertprivs.php new file mode 100755 index 0000000000..6ce12deb8c --- /dev/null +++ b/module/group/test/model/insertprivs.php @@ -0,0 +1,30 @@ +#!/usr/bin/env php +create(); +timeout=0 +cid=1 + +- 已有权限的分组新增一个权限 + - 第1条的0属性 @module1-method1 + - 第1条的1属性 @project-create +- 没有权限的分组新增一个权限第5条的0属性 @project-create + +*/ + +include dirname(__FILE__, 5) . '/test/lib/init.php'; +include dirname(__FILE__, 2) . '/group.class.php'; + +zdTable('group')->gen(5); +zdTable('grouppriv')->gen(4); +su('admin'); + +$insertPrivs = array((object)array('group' => 1, 'module' => 'project', 'method' => 'create')); +$newPrivs = array((object)array('group' => 5, 'module' => 'project', 'method' => 'create')); + +$group = new groupTest(); + +r($group->insertPrivsTest($insertPrivs)) && p('1:0;1:1') && e('module1-method1,project-create'); // 已有权限的分组新增一个权限 +r($group->insertPrivsTest($newPrivs)) && p('5:0') && e('project-create'); // 没有权限的分组新增一个权限 diff --git a/module/group/test/model/isclickable.php b/module/group/test/model/isclickable.php new file mode 100755 index 0000000000..dd3c6841ec --- /dev/null +++ b/module/group/test/model/isclickable.php @@ -0,0 +1,32 @@ +#!/usr/bin/env php +create(); +timeout=0 +cid=1 + +- 受限用户不能管理视野 @0 +- 测试action的大小写 @0 +- 受限用户不能维护项目管理员 @0 +- 受限用户不能复制分组 @0 +- 项目管理员可以维护项目管理员 @1 +- 项目管理员可以复制分组 @1 + +*/ + +include dirname(__FILE__, 5) . '/test/lib/init.php'; + +global $tester; +$tester->loadModel('group'); + +$limitedGroup = (object)array('role' => 'limited'); +$projectAdminGroup = (object)array('role' => 'projectAdmin'); + +r(groupModel::isClickable($limitedGroup, 'manageview')) && p() && e('0'); // 受限用户不能管理视野 +r(groupModel::isClickable($limitedGroup, 'manageView')) && p() && e('0'); // 测试action的大小写 +r(groupModel::isClickable($limitedGroup, 'manageprojectadmin')) && p() && e('0'); // 受限用户不能维护项目管理员 +r(groupModel::isClickable($limitedGroup, 'copy')) && p() && e('0'); // 受限用户不能复制分组 +r(groupModel::isClickable($projectAdminGroup, 'manageprojectadmin')) && p() && e('1'); // 项目管理员可以维护项目管理员 +r(groupModel::isClickable($projectAdminGroup, 'copy')) && p() && e('1'); // 项目管理员可以复制分组 \ No newline at end of file diff --git a/module/group/test/model/sortresource.php b/module/group/test/model/sortresource.php new file mode 100755 index 0000000000..285d223bae --- /dev/null +++ b/module/group/test/model/sortresource.php @@ -0,0 +1,31 @@ +#!/usr/bin/env php +sortResource(); +timeout=0 +cid=1 + +- 检查program和personnel模块的排序 + - 属性2 @program + - 属性3 @personnel +- 检查my模块方法的排序 + - 属性4 @project + - 属性12 @audit + +*/ +include dirname(__FILE__, 5) . '/test/lib/init.php'; +include dirname(__FILE__, 2) . '/group.class.php'; + +su('admin'); + +zdTable('user')->gen(100); +zdTable('group')->gen(5); +zdTable('usergroup')->config('usergroup')->gen(10); + +$group = new groupTest(); +$resource = $group->sortResourceTest(); + +r(array_keys((array)$resource)) && p('2,3') && e('program,personnel'); // 检查program和personnel模块的排序 +r(array_keys((array)$resource->my)) && p('4,12') && e('project,audit'); // 检查my模块方法的排序 \ No newline at end of file diff --git a/module/group/test/model/updateprojectadmin.php b/module/group/test/model/updateprojectadmin.php index bb6c2844a2..e5d312670b 100755 --- a/module/group/test/model/updateprojectadmin.php +++ b/module/group/test/model/updateprojectadmin.php @@ -1,19 +1,59 @@ #!/usr/bin/env php updateProjectAdmin(); +timeout=0 cid=1 -pid=1 - +- 测试项目管理员更新项目集第user1条的programs属性 @2 +- 测试项目管理员更新产品第user1条的products属性 @2 +- 测试项目管理员更新项目第user1条的projects属性 @2 +- 测试项目管理员更新执行第user1条的executions属性 @2 +- 测试项目管理员更新多人项目集第user1,user2条的programs属性 @2 +- 测试项目管理员更新多人产品第user1,user2条的products属性 @2 +- 测试项目管理员更新多人项目第user1,user2条的projects属性 @2 +- 测试项目管理员更新多人执行第user1,user2条的executions属性 @2 +- 测试项目管理员更新所有项目集第user1,user2条的programs属性 @all +- 测试项目管理员更新所有项目集第user1,user2条的products属性 @all +- 测试项目管理员更新所有项目集第user1,user2条的projects属性 @all +- 测试项目管理员更新所有项目集第user1,user2条的executions属性 @all */ +include dirname(__FILE__, 5) . '/test/lib/init.php'; +include dirname(__FILE__, 2) . '/group.class.php'; +su('admin'); + $group = new groupTest(); -r($group->updateProjectAdminTest()) && p() && e(); \ No newline at end of file +$programs1 = array('program' => array(2), 'project' => array(), 'product' => array(), 'execution' => array(), 'accounts' => array('user1')); +$products1 = array('program' => array(), 'project' => array(), 'product' => array(2), 'execution' => array(), 'accounts' => array('user1')); +$projects1 = array('program' => array(), 'project' => array(2), 'product' => array(), 'execution' => array(), 'accounts' => array('user1')); +$executions1 = array('program' => array(), 'project' => array(), 'product' => array(), 'execution' => array(2), 'accounts' => array('user1')); + +$programs2 = array('program' => array(2), 'project' => array(), 'product' => array(), 'execution' => array(), 'accounts' => array('user1,user2')); +$products2 = array('program' => array(), 'project' => array(), 'product' => array(2), 'execution' => array(), 'accounts' => array('user1,user2')); +$projects2 = array('program' => array(), 'project' => array(2), 'product' => array(), 'execution' => array(), 'accounts' => array('user1,user2')); +$executions2 = array('program' => array(), 'project' => array(), 'product' => array(), 'execution' => array(2), 'accounts' => array('user1,user2')); + +$allPrograms = array('program' => array('all'), 'project' => array(), 'product' => array(), 'execution' => array(), 'accounts' => array('user1,user2')); +$allProducts = array('program' => array(), 'project' => array(), 'product' => array('all'), 'execution' => array(), 'accounts' => array('user1,user2')); +$allProjects = array('program' => array(), 'project' => array('all'), 'product' => array(), 'execution' => array(), 'accounts' => array('user1,user2')); +$allExecutions = array('program' => array(), 'project' => array(), 'product' => array(), 'execution' => array('all'), 'accounts' => array('user1,user2')); + +r($group->updateProjectAdminTest(1, array($programs1))) && p('user1:programs') && e('2'); // 测试项目管理员更新项目集 +r($group->updateProjectAdminTest(1, array($products1))) && p('user1:products') && e('2'); // 测试项目管理员更新产品 +r($group->updateProjectAdminTest(1, array($projects1))) && p('user1:projects') && e('2'); // 测试项目管理员更新项目 +r($group->updateProjectAdminTest(1, array($executions1))) && p('user1:executions') && e('2'); // 测试项目管理员更新执行 + +r($group->updateProjectAdminTest(1, array($programs2))) && p('user1,user2:programs') && e('2'); // 测试项目管理员更新多人项目集 +r($group->updateProjectAdminTest(1, array($products2))) && p('user1,user2:products') && e('2'); // 测试项目管理员更新多人产品 +r($group->updateProjectAdminTest(1, array($projects2))) && p('user1,user2:projects') && e('2'); // 测试项目管理员更新多人项目 +r($group->updateProjectAdminTest(1, array($executions2))) && p('user1,user2:executions') && e('2'); // 测试项目管理员更新多人执行 + +r($group->updateProjectAdminTest(1, array($allPrograms))) && p('user1,user2:programs') && e('all'); // 测试项目管理员更新所有项目集 +r($group->updateProjectAdminTest(1, array($allProducts))) && p('user1,user2:products') && e('all'); // 测试项目管理员更新所有项目集 +r($group->updateProjectAdminTest(1, array($allProjects))) && p('user1,user2:projects') && e('all'); // 测试项目管理员更新所有项目集 +r($group->updateProjectAdminTest(1, array($allExecutions))) && p('user1,user2:executions') && e('all'); // 测试项目管理员更新所有项目集 \ No newline at end of file diff --git a/module/group/test/model/updateuser.php b/module/group/test/model/updateuser.php index 8f4412079b..dfd60d9735 100755 --- a/module/group/test/model/updateuser.php +++ b/module/group/test/model/updateuser.php @@ -1,19 +1,30 @@ #!/usr/bin/env php updateUser(); +timeout=0 cid=1 -pid=1 - +- 更新分组成员,检查已有用户属性user1 @用户1 +- 更新分组成员,检查已删除用户属性user6 @` ` +- 更新分组成员,检查新增用户属性user10 @用户10 */ +include dirname(__FILE__, 5) . '/test/lib/init.php'; +include dirname(__FILE__, 2) . '/group.class.php'; + +su('admin'); + +zdTable('user')->gen(100); +zdTable('group')->gen(5); +zdTable('usergroup')->config('usergroup')->gen(10); $group = new groupTest(); -r($group->updateUserTest()) && p() && e(); \ No newline at end of file +$_POST['members'] = array('user1' => 'user1', 'user10' => 'user10'); + +r($group->updateUserTest(1)) && p('user1') && e('用户1'); // 更新分组成员,检查已有用户 +r($group->updateUserTest(1)) && p('user6') && e('` `'); // 更新分组成员,检查已删除用户 +r($group->updateUserTest(1)) && p('user10') && e('用户10'); // 更新分组成员,检查新增用户 \ No newline at end of file diff --git a/module/group/test/model/updateview.php b/module/group/test/model/updateview.php index f8b0518aec..6e7948ef10 100755 --- a/module/group/test/model/updateview.php +++ b/module/group/test/model/updateview.php @@ -1,32 +1,39 @@ #!/usr/bin/env php updateView(); +timeout=0 cid=1 -pid=1 -针对ID为1的权限分组,设置全选权限,查看返回的数据元素数量 >> 2 -针对ID为1的权限分组,设置任务创建权限,查看返回的数据元素数量 >> 3 -针对ID为1的权限分组,设置任务创建权限,查看是否有创建方法 >> create +- 验证views第views条的program属性 @program +- 验证programs第programs条的0属性 @1 +- 验证products第products条的0属性 @1 +- 验证sprints第sprints条的0属性 @1 +- 验证actions第actions条的program属性 @create */ -global $tester; -$tester->loadModel('group'); +include dirname(__FILE__, 5) . '/test/lib/init.php'; +include dirname(__FILE__, 2) . '/group.class.php'; -$_POST['allchecker'] = 1; -$tester->group->updateView(1); -$group1 = $tester->group->getByID(1); +su('admin'); -$_POST['actions']['task']['create'] = 'create'; -$tester->group->updateView(1); -$group2 = $tester->group->getByID(1); +$formData = array( + 'views' => array('program' => 'on'), + 'programs' => array(1), + 'products' => array(1), + 'projects' => array(1), + 'sprints' => array(1), + 'actions' => array('program' => array('create' => 'on')), + 'actionallchecker' => false, +); -r(count($group1->acl)) && p() && e('2'); // 针对ID为1的权限分组,设置全选权限,查看返回的数据元素数量 -r(count($group2->acl)) && p() && e('3'); // 针对ID为1的权限分组,设置任务创建权限,查看返回的数据元素数量 -r($group2->acl) && p('task:create') && e('create'); // 针对ID为1的权限分组,设置任务创建权限,查看是否有创建方法 +$group = new groupTest(); +r($group->updateViewTest(1, $formData)) && p('views:program') && e('program'); // 验证views +r($group->updateViewTest(1, $formData)) && p('programs:0') && e('1'); // 验证programs +r($group->updateViewTest(1, $formData)) && p('products:0') && e('1'); // 验证products +r($group->updateViewTest(1, $formData)) && p('sprints:0') && e('1'); // 验证sprints +r($group->updateViewTest(1, $formData)) && p('actions:program') && e('create'); // 验证actions diff --git a/module/group/ui/manageview.html.php b/module/group/ui/manageview.html.php index 74e289b0ec..d84ece4050 100644 --- a/module/group/ui/manageview.html.php +++ b/module/group/ui/manageview.html.php @@ -130,7 +130,6 @@ foreach($lang->mainNav as $module => $title) ); } - formPanel ( set::id('manageViewForm'), diff --git a/module/group/zen.php b/module/group/zen.php index fbebcd6101..6b91b80792 100644 --- a/module/group/zen.php +++ b/module/group/zen.php @@ -227,4 +227,69 @@ class groupZen extends group $this->view->packages = $packages; $this->view->privs = $this->group->getPrivByParents(key($subsets)); } + + /** + * 构造视野维护的表单。 + * Build update view form. + * + * @access protected + * @return array + */ + protected function buildUpdateViewForm() + { + $formData = array(); + + $actions = $this->post->actions; + $formData['views'] = isset($actions['views']) ? $actions['views'] : array(); + $formData['programs'] = isset($actions['programs']) ? $actions['programs'] : array(); + $formData['projects'] = isset($actions['projects']) ? $actions['projects'] : array(); + $formData['products'] = isset($actions['products']) ? $actions['products'] : array(); + $formData['sprints'] = isset($actions['sprints']) ? $actions['sprints'] : array(); + $formData['actions'] = isset($actions['actions']) ? $actions['actions'] : array(); + + $formData['actionallchecker'] = isset($_POST['actionallchecker']); + + return $formData; + } + + /** + * 构造项目管理员的表单。 + * Build project admin form. + * + * @access protected + * @return array + */ + protected function buildProjectAdminForm() + { + $members = $this->post->members ? $this->post->members : array(); + $programs = $this->post->program ? $this->post->program : array(); + $projects = $this->post->project ? $this->post->project : array(); + $products = $this->post->product ? $this->post->product : array(); + $executions = $this->post->execution ? $this->post->execution : array(); + $programAll = $this->post->programAll ? $this->post->programAll : ''; + $projectAll = $this->post->projectAll ? $this->post->projectAll : ''; + $productAll = $this->post->productAll ? $this->post->productAll : ''; + $executionAll = $this->post->executionAll ? $this->post->executionAll : ''; + + $formData = array(); + foreach($members as $lineID => $accounts) + { + if(empty($accounts)) continue; + + $formData[$lineID] = array(); + + $programs[$lineID] = isset($programs[$lineID]) ? $programs[$lineID] : array(); + $projects[$lineID] = isset($projects[$lineID]) ? $projects[$lineID] : array(); + $products[$lineID] = isset($products[$lineID]) ? $products[$lineID] : array(); + $executions[$lineID] = isset($executions[$lineID]) ? $executions[$lineID] : array(); + + $formData[$lineID]['program'] = isset($programAll[$lineID]) ? array('all') : $programs[$lineID]; + $formData[$lineID]['project'] = isset($projectAll[$lineID]) ? array('all') : $projects[$lineID]; + $formData[$lineID]['product'] = isset($productAll[$lineID]) ? array('all') : $products[$lineID]; + $formData[$lineID]['execution'] = isset($executionAll[$lineID]) ? array('all') : $executions[$lineID]; + $formData[$lineID]['accounts'] = $accounts; + } + + return $formData; + } }