From 412fbb23053702d5670130651763759cd22fb9d5 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Tue, 16 Nov 2021 16:25:00 +0800 Subject: [PATCH] * Finish task #44370. --- db/update15.9.sql | 8 ++-- db/zentao.sql | 7 ++-- module/common/lang/common.php | 1 + module/product/control.php | 29 ++++++++++++++ module/product/lang/en.php | 1 + module/product/lang/zh-cn.php | 1 + module/product/model.php | 2 + module/product/view/create.html.php | 4 ++ module/product/view/edit.html.php | 4 ++ module/product/view/view.html.php | 12 +++++- module/story/control.php | 10 +++++ module/story/view/create.html.php | 2 +- module/story/view/edit.html.php | 2 +- module/story/view/header.html.php | 61 +++++++++++++++++++++++++++++ module/user/model.php | 32 ++++++++++----- 15 files changed, 158 insertions(+), 18 deletions(-) diff --git a/db/update15.9.sql b/db/update15.9.sql index 4efcfcac48..b7c6396a34 100644 --- a/db/update15.9.sql +++ b/db/update15.9.sql @@ -8,7 +8,7 @@ CREATE TABLE IF NOT EXISTS `zt_stage` ( `createdDate` datetime NOT NULL, `editedBy` varchar(30) NOT NULL, `editedDate` datetime NOT NULL, - `deleted` enum('0','1') NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; @@ -19,7 +19,7 @@ CREATE TABLE IF NOT EXISTS `zt_design` ( `product` varchar(255) NOT NULL, `commit` text NOT NULL, `commitedBy` varchar(30) NOT NULL, - `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', `name` varchar(255) NOT NULL, `status` varchar(30) NOT NULL, `createdBy` varchar(30) NOT NULL, @@ -29,7 +29,7 @@ CREATE TABLE IF NOT EXISTS `zt_design` ( `assignedTo` varchar(30) NOT NULL, `assignedBy` varchar(30) NOT NULL, `assignedDate` datetime NOT NULL, - `deleted` enum('0','1') NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', `story` char(30) NOT NULL, `desc` text NOT NULL, `version` smallint(6) NOT NULL, @@ -94,3 +94,5 @@ INSERT INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) VA ('all','stage','typeList','release','发布', '1'), ('all','stage','typeList','review','总结评审','1'), ('all','stage','typeList','other','其他','1'); + +ALTER TABLE `zt_product` ADD `reviewer` varchar(255) NOT NULL AFTER `whitelist`; diff --git a/db/zentao.sql b/db/zentao.sql index acc2fcfde7..c6f1f109a8 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -395,7 +395,7 @@ CREATE TABLE IF NOT EXISTS `zt_design` ( `product` varchar(255) NOT NULL, `commit` text NOT NULL, `commitedBy` varchar(30) NOT NULL, - `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', `name` varchar(255) NOT NULL, `status` varchar(30) NOT NULL, `createdBy` varchar(30) NOT NULL, @@ -405,7 +405,7 @@ CREATE TABLE IF NOT EXISTS `zt_design` ( `assignedTo` varchar(30) NOT NULL, `assignedBy` varchar(30) NOT NULL, `assignedDate` datetime NOT NULL, - `deleted` enum('0','1') NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', `story` char(30) NOT NULL, `desc` text NOT NULL, `version` smallint(6) NOT NULL, @@ -801,6 +801,7 @@ CREATE TABLE IF NOT EXISTS `zt_product` ( `RD` varchar(30) NOT NULL, `acl` enum('open','private','custom') NOT NULL default 'open', `whitelist` text NOT NULL, + `reviewer` varchar(255) NOT NULL, `createdBy` varchar(30) NOT NULL, `createdDate` datetime NOT NULL, `createdVersion` varchar(20) NOT NULL, @@ -1067,7 +1068,7 @@ CREATE TABLE IF NOT EXISTS `zt_stage` ( `createdDate` datetime NOT NULL, `editedBy` varchar(30) NOT NULL, `editedDate` datetime NOT NULL, - `deleted` enum('0','1') NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- DROP TABLE IF EXISTS `zt_stakeholder`; diff --git a/module/common/lang/common.php b/module/common/lang/common.php index 96f8e12f14..a633d01ce2 100644 --- a/module/common/lang/common.php +++ b/module/common/lang/common.php @@ -4,6 +4,7 @@ $lang->index = new stdclass(); $lang->my = new stdclass(); $lang->todo = new stdclass(); $lang->program = new stdclass(); +$lang->programplan = new stdclass(); $lang->product = new stdclass(); $lang->project = new stdclass(); $lang->design = new stdclass(); diff --git a/module/product/control.php b/module/product/control.php index 1f8a05849e..636bc7b878 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -718,6 +718,7 @@ class product extends control $this->view->users = $this->user->getPairs('noletter'); $this->view->groups = $this->loadModel('group')->getPairs(); $this->view->branches = $this->loadModel('branch')->getPairs($productID); + $this->view->reviewers = explode(',', $product->reviewer); $this->display(); } @@ -997,6 +998,34 @@ class product extends control if(!$productID) die(html::select('line', array('' => '') + $lines, '', "class='form-control chosen'")); } + /** + * Ajax get reviewers. + * + * @param int $productID + * @param int $storyID + * @access public + * @return void + */ + public function ajaxGetReviewers($productID, $storyID = 0) + { + /* Get product reviewers. */ + $product = $this->product->getByID($productID); + $productReviewers = $product->reviewer; + if(!$productReviewers) $productReviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); + + $storyReviewers = ''; + if($storyID) + { + $story = $this->loadModel('story')->getByID($storyID); + $storyReviewers = $this->story->getReviewerPairs($story->id, $story->version); + $storyReviewers = implode(',', array_keys($storyReviewers)); + } + + $reviewers = $this->loadModel('user')->getPairs('noclosed|nodeleted', $storyReviewers, 0, $productReviewers); + + die(html::select("reviewer[]", $reviewers, $storyReviewers, "class='form-control chosen' multiple")); + } + /** * Drop menu page. * diff --git a/module/product/lang/en.php b/module/product/lang/en.php index 30fd0e7882..386387d4d6 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -105,6 +105,7 @@ $lang->product->QD = 'QA Manager'; $lang->product->RD = 'Release Manager'; $lang->product->feedback = 'Feedback Manger'; $lang->product->acl = 'Access Control'; +$lang->product->reviewer = 'Reviewer'; $lang->product->whitelist = 'Whitelist'; $lang->product->branch = '%s'; $lang->product->qa = 'Test'; diff --git a/module/product/lang/zh-cn.php b/module/product/lang/zh-cn.php index 1c06dcdf85..0c32941990 100644 --- a/module/product/lang/zh-cn.php +++ b/module/product/lang/zh-cn.php @@ -105,6 +105,7 @@ $lang->product->QD = '测试负责人'; $lang->product->RD = '发布负责人'; $lang->product->feedback = '反馈负责人'; $lang->product->acl = '访问控制'; +$lang->product->reviewer = '评审人'; $lang->product->whitelist = '白名单'; $lang->product->branch = '所属%s'; $lang->product->qa = '测试'; diff --git a/module/product/model.php b/module/product/model.php index 1b8ce5cdba..212984f5bc 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -513,6 +513,7 @@ class productModel extends model ->setIF($this->post->acl == 'open', 'whitelist', '') ->stripTags($this->config->product->editor->create['id'], $this->config->allowedTags) ->join('whitelist', ',') + ->join('reviewer', ',') ->remove('uid,newLine,lineName') ->get(); @@ -586,6 +587,7 @@ class productModel extends model $product = fixer::input('post') ->setDefault('line', 0) ->join('whitelist', ',') + ->join('reviewer', ',') ->stripTags($this->config->product->editor->edit['id'], $this->config->allowedTags) ->remove('uid,changeProjects') ->get(); diff --git a/module/product/view/create.html.php b/module/product/view/create.html.php index 179d5646a2..bbe57026fb 100644 --- a/module/product/view/create.html.php +++ b/module/product/view/create.html.php @@ -68,6 +68,10 @@ product->RD;?> + + product->reviewer;?> + + product->type;?> diff --git a/module/product/view/edit.html.php b/module/product/view/edit.html.php index a27f68f257..bbe159b59d 100644 --- a/module/product/view/edit.html.php +++ b/module/product/view/edit.html.php @@ -64,6 +64,10 @@ product->RD;?> RD, "class='form-control chosen'");?> + + product->reviewer;?> + reviewer, "class='form-control chosen' multiple");?> + product->type;?> product->typeList, $product->type, "class='form-control'");?> diff --git a/module/product/view/view.html.php b/module/product/view/view.html.php index b5b6bb9692..6a4c69a28b 100644 --- a/module/product/view/view.html.php +++ b/module/product/view/view.html.php @@ -41,7 +41,7 @@
product->manager;?>
- + @@ -52,7 +52,17 @@ + bizVersion)):?> + + + + bizVersion)):?> + + + + +
productCommon;?> PO);?>
product->qa;?> QD);?> product->reviewer;?>
product->reviewer;?>
diff --git a/module/story/control.php b/module/story/control.php index 13545833b1..28d4f07706 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -299,6 +299,10 @@ class story extends control ->fetch('id'); } + /* Get reviewers. */ + $reviewers = $product->reviewer; + if(!$reviewers) $reviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); + /* Set Custom. */ foreach(explode(',', $this->config->story->list->customCreateFields) as $field) $customFields[$field] = $this->lang->story->$field; $this->view->customFields = $customFields; @@ -323,6 +327,7 @@ class story extends control $this->view->branches = $product->type != 'normal' ? $this->loadModel('branch')->getPairs($productID) : array(); $this->view->productID = $productID; $this->view->product = $product; + $this->view->reviewers = $this->user->getPairs('noclosed|nodeleted', '', 0, $reviewers); $this->view->objectID = $objectID; $this->view->estimate = $estimate; $this->view->storyTitle = $title; @@ -626,6 +631,10 @@ class story extends control $reviewedReviewer = array(); foreach($reviewedBy as $reviewer) $reviewedReviewer[] = zget($users, $reviewer); + /* Get product reviewers. */ + $productReviewers = $product->reviewer; + if(!$productReviewers) $productReviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); + $this->story->replaceURLang($story->type); $this->view->title = $this->lang->story->edit . "STORY" . $this->lang->colon . $this->view->story->title; @@ -638,6 +647,7 @@ class story extends control $this->view->branches = $product->type == 'normal' ? array() : $this->loadModel('branch')->getPairs($story->product); $this->view->reviewers = implode(',', $reviewerList); $this->view->reviewedReviewer = $reviewedReviewer; + $this->view->productReviewers = $this->user->getPairs('noclosed|nodeleted', $reviewerList, 0, $productReviewers); $this->view->isShowReviewer = $isShowReviewer; $this->display(); } diff --git a/module/story/view/create.html.php b/module/story/view/create.html.php index 296bc4fb49..ca50a74931 100644 --- a/module/story/view/create.html.php +++ b/module/story/view/create.html.php @@ -104,7 +104,7 @@ id='reviewerBox'>
- PO : '', "class='form-control chosen' multiple");?> + PO : '', "class='form-control chosen' multiple");?>
story->checkForceReview()):?>
diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index c6db99463f..cc28420747 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -211,7 +211,7 @@ story->reviewers;?> - + status == 'closed'):?> diff --git a/module/story/view/header.html.php b/module/story/view/header.html.php index cb917062dd..6cc8ed4654 100644 --- a/module/story/view/header.html.php +++ b/module/story/view/header.html.php @@ -1,6 +1,13 @@ diff --git a/module/user/model.php b/module/user/model.php index 3533390f11..eb546ebc3b 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -68,13 +68,14 @@ class userModel extends model /** * Get the account=>realname pairs. * - * @param string $params noletter|noempty|nodeleted|noclosed|withguest|pofirst|devfirst|qafirst|pmfirst|realname|outside|inside|all, can be sets of theme - * @param string $usersToAppended account1,account2 - * @param int $maxCount + * @param string $params noletter|noempty|nodeleted|noclosed|withguest|pofirst|devfirst|qafirst|pmfirst|realname|outside|inside|all, can be sets of theme + * @param string $usersToAppended account1,account2 + * @param int $maxCount + * @param string|array $accounts * @access public * @return array */ - public function getPairs($params = '', $usersToAppended = '', $maxCount = 0) + public function getPairs($params = '', $usersToAppended = '', $maxCount = 0, $accounts = '') { if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getUserPairs(); /* Set the query fields and orderBy condition. @@ -102,6 +103,7 @@ class userModel extends model ->where('1') ->beginIF(strpos($params, 'all') === false)->andWhere('type')->eq($type)->fi() ->beginIF(strpos($params, 'nodeleted') !== false or empty($this->config->user->showDeleted))->andWhere('deleted')->eq('0')->fi() + ->beginIF($accounts)->andWhere('account')->in($accounts)->fi() ->orderBy($orderBy) ->beginIF($maxCount)->limit($maxCount)->fi() ->fetchAll($keyField); @@ -2055,12 +2057,10 @@ class userModel extends model /* Get all groups for whiteList. */ $allGroups = $this->dao->select('account, `group`')->from(TABLE_USERGROUP)->fetchAll(); $userGroups = array(); - $groupUsers = array(); foreach($allGroups as $group) { if(!isset($userGroups[$group->account])) $userGroups[$group->account] = ''; $userGroups[$group->account] .= "{$group->group},"; - $groupUsers[$group->group][$group->account] = $group->account; } list($productTeams, $productStakeholders) = $this->getProductMembers($products); @@ -2083,7 +2083,7 @@ class userModel extends model $teams = zget($productTeams, $productID, array()); $stakeholders = zget($productStakeholders, $productID, array()); $whiteList = zget($whiteListGroup, $productID, array()); - $viewList += $this->getProductViewListUsers($product, $groupUsers, $teams, $stakeholders, $whiteList); + $viewList += $this->getProductViewListUsers($product, $teams, $stakeholders, $whiteList); } $users = $viewList; @@ -2409,14 +2409,13 @@ class userModel extends model * Get product view list users. * * @param object $product - * @param array $groupUsers * @param array $linkedProjects * @param array $teams * @param array $whiteList * @access public * @return array */ - public function getProductViewListUsers($product, $groupUsers, $teams, $stakeholders, $whiteList) + public function getProductViewListUsers($product, $teams, $stakeholders, $whiteList) { $users = array(); @@ -2428,6 +2427,21 @@ class userModel extends model $users[$product->createdBy] = $product->createdBy; if(isset($product->feedback)) $users[$product->feedback] = $product->feedback; + if($teams === '' and $stakeholders === '') + { + list($productTeams, $productStakeholders) = $this->getProductMembers(array($product->id => $product)); + $teams = isset($productTeams[$product->id]) ? $productTeams[$product->id] : array(); + $teams = isset($productStakeholders[$product->id]) ? $productStakeholders[$product->id] : array(); + } + + if($whiteList === '') + { + $whiteList = $this->dao->select('account')->from(TABLE_ACL) + ->where('objectType')->eq('product') + ->andWhere('objectID')->eq($product->id) + ->fetchPairs(); + } + $users += $teams ? $teams : array(); $users += $stakeholders ? $stakeholders : array(); $users += $whiteList ? $whiteList : array();