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;?>
-
+
| productCommon;?> |
PO);?> |
@@ -52,7 +52,17 @@
| product->qa;?> |
QD);?> |
+ bizVersion)):?>
+ product->reviewer;?> |
+ |
+
+ bizVersion)):?>
+
+ | 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();
|