From 87aa57b5a63127bd64e66cc759ce3220441cb5ce Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 22 Jan 2024 13:50:14 +0800 Subject: [PATCH] * Add whitelist groups to project, and add its priv initialization function. --- db/update20.0.alpha1.sql | 2 ++ module/project/config/form.php | 1 + module/project/ui/create.field.php | 4 +++- module/project/ui/edit.field.php | 4 +++- module/project/zen.php | 2 ++ module/user/model.php | 34 ++++++++++++++++++++++++++++++ 6 files changed, 45 insertions(+), 2 deletions(-) diff --git a/db/update20.0.alpha1.sql b/db/update20.0.alpha1.sql index 68d0c2ecdc..5c3ad4b2de 100644 --- a/db/update20.0.alpha1.sql +++ b/db/update20.0.alpha1.sql @@ -78,3 +78,5 @@ ALTER table `zt_metric` ADD `lastCalcRows` int NOT NULL DEFAULT 0 AFTER `order`; ALTER table `zt_metric` ADD `lastCalcTime` datetime DEFAULT NULL AFTER `lastCalcRows`; UPDATE `zt_metric` SET `desc` = '按系统统计的年度关闭执行数是指在关闭时间在某年的执行数。该度量项可以反映团队或组织在某年的工作效率。较高的年度关闭执行数可能表示团队或组织在完成任务方面表现出较高的效率,反之则可能需要审查工作流程和资源分配情况,以提高执行效率。' WHERE `code` = 'count_of_annual_closed_execution'; + +ALTER TABLE `zt_project` ADD COLUMN `groups` text NULL AFTER `acl`; diff --git a/module/project/config/form.php b/module/project/config/form.php index dd6a77affb..69bfb33a94 100755 --- a/module/project/config/form.php +++ b/module/project/config/form.php @@ -24,6 +24,7 @@ $config->project->form->create['end'] = array('type' => 'date', 'requir $config->project->form->create['days'] = array('type' => 'int', 'required' => false, 'default' => 0); $config->project->form->create['desc'] = array('type' => 'string', 'required' => false, 'default' => '', 'control' => 'editor'); $config->project->form->create['acl'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->project->form->create['groups'] = array('type' => 'array', 'required' => false, 'default' => array(), 'filter' => 'join'); $config->project->form->create['whitelist'] = array('type' => 'array', 'required' => false, 'default' => ''); $config->project->form->create['auth'] = array('type' => 'array', 'required' => false, 'default' => ''); $config->project->form->create['model'] = array('type' => 'string', 'required' => false, 'default' => ''); diff --git a/module/project/ui/create.field.php b/module/project/ui/create.field.php index 8ff1476177..395cf62d49 100644 --- a/module/project/ui/create.field.php +++ b/module/project/ui/create.field.php @@ -44,6 +44,8 @@ if($model == 'waterfall' || $model == 'waterfallplus') $fields->field('budget')->foldable(); -$fields->field('acl')->foldable()->control(array('control' => 'aclBox', 'aclItems' => data('programID') ? $lang->project->subAclList : $lang->project->aclList, 'aclValue' => $copyProject ? data('copyProject.acl') : 'private', 'whitelistLabel' => $lang->project->whitelist)); +$fields->field('acl') + ->foldable() + ->control(array('control' => 'aclBox', 'aclItems' => data('programID') ? $lang->project->subAclList : $lang->project->aclList, 'aclValue' => $copyProject ? data('copyProject.acl') : 'open', 'whitelistLabel' => $lang->project->whitelist, 'groupLabel' => $lang->product->groups, 'groupItems' => data('groups'), 'userLabel' => $lang->product->users)); $fields->field('auth')->foldable()->value($copyProject ? data('copyProject.auth') : 'extend'); diff --git a/module/project/ui/edit.field.php b/module/project/ui/edit.field.php index a829ae0aeb..24834e4ade 100644 --- a/module/project/ui/edit.field.php +++ b/module/project/ui/edit.field.php @@ -14,4 +14,6 @@ if(in_array($model, array('scrum', 'kanban'))) $fields->field('name')->checkbox( $fields->field('hasProduct')->disabled(true); -$fields->field('acl')->control(array('control' => 'aclBox', 'aclItems' => data('programID') ? $lang->project->subAclList : $lang->project->aclList, 'aclValue' => data('project.acl'), 'whitelistLabel' => $lang->project->whitelist)); +$fields->field('acl') + ->foldable() + ->control(array('control' => 'aclBox', 'aclItems' => data('programID') ? $lang->project->subAclList : $lang->project->aclList, 'aclValue' => data('project.acl'), 'whitelistLabel' => $lang->project->whitelist, 'groupLabel' => $lang->product->groups, 'groupItems' => data('groups'), 'groupValue' => data('project.groups'), 'userLabel' => $lang->product->users, 'userValue' => data('project.whitelist'))); diff --git a/module/project/zen.php b/module/project/zen.php index 6dea54e93c..f03309068f 100755 --- a/module/project/zen.php +++ b/module/project/zen.php @@ -311,6 +311,7 @@ class projectZen extends project $this->view->linkedProducts = isset($linkedProducts) ? $linkedProducts : array(); $this->view->linkedBranches = $this->project->getBranchesByProject($copyProjectID); $this->view->isStage = in_array($model, array('waterfall', 'waterfallplus', 'ipd')); + $this->view->groups = $this->loadModel('group')->getPairs(); $this->display(); } @@ -441,6 +442,7 @@ class projectZen extends project $this->view->from = $from; $this->view->programID = $programID; $this->view->disableParent = $disableParent; + $this->view->groups = $this->loadModel('group')->getPairs(); $this->display(); } diff --git a/module/user/model.php b/module/user/model.php index 144eefb198..51d8eb9d26 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -2051,6 +2051,9 @@ class userModel extends model $userView->products = rtrim($userView->products, ',') . ',' . join(',', $openedProducts); $userView->projects = rtrim($userView->projects, ',') . ',' . join(',', $openedProjects); + /* 合并项目集/产品/项目/执行的权限组人员到用户访问权限。 */ + $userView = $this->mergeObjectGroupsToUserView($account, $userView); + /* 合并用户视图权限到用户访问权限。 */ $userView = $this->mergeAclsToUserView($account, $userView, $acls, $projects); @@ -2062,6 +2065,37 @@ class userModel extends model return $userView; } + /** + * 合并项目集/产品/项目/执行的权限组人员到用户访问权限。 + * Merge the groups program, product, project and sprints to userView. + * + * @param string $account + * @param object $userView + * @access private + * @return object + */ + private function mergeObjectGroupsToUserView(string $account, object $userView): object + { + $programs = array(); + $products = array(); + $projects = array(); + $sprints = array(); + $groups = $this->getGroups($account); + foreach($groups as $groupID) + { + $query = "FIND_IN_SET({$groupID}, `groups`)"; + $products += $this->dao->select('id,id')->from(TABLE_PRODUCT)->where($query)->andWhere('acl')->eq('private')->andWhere('deleted')->eq('0')->fetchPairs(); + $programs += $this->dao->select('id,id')->from(TABLE_PROGRAM)->where($query)->andWhere('acl')->eq('private')->andWhere('type')->eq('program')->andWhere('deleted')->eq('0')->fetchPairs(); + $projects += $this->dao->select('id,id')->from(TABLE_PROJECT)->where($query)->andWhere('acl')->eq('private')->andWhere('type')->eq('project')->andWhere('deleted')->eq('0')->fetchPairs(); + $sprints += $this->dao->select('id,id')->from(TABLE_PROJECT)->where($query)->andWhere('acl')->eq('private')->andWhere('type')->in('stage,sprint,kanban')->andWhere('deleted')->eq('0')->fetchPairs(); + } + $userView->products .= ',' . implode(',', $products); + $userView->programs .= ',' . implode(',', $programs); + $userView->projects .= ',' . implode(',', $projects); + $userView->sprints .= ',' . implode(',', $sprints); + return $userView; + } + /** * 合并用户视图权限到用户访问权限。 * Merge acls to userView.