diff --git a/db/update20.0.sql b/db/update20.0.sql index 8bea0bd6c7..306b11e57b 100644 --- a/db/update20.0.sql +++ b/db/update20.0.sql @@ -4,6 +4,7 @@ DROP `catID`, ADD `project` mediumint(8) NOT NULL DEFAULT 0 AFTER `id`, ADD `model` char(30) NOT NULL AFTER `project`, CHANGE `type` `type` char(30) NOT NULL DEFAULT 'sprint' AFTER `model`, +CHANGE `acl` `acl` char(30) NOT NULL DEFAULT 'open', ADD `product` varchar(20) NOT NULL DEFAULT 'single' AFTER `type`, ADD `lifetime` char(30) NOT NULL AFTER `product`, ADD `budget` varchar(30) NOT NULL DEFAULT '0' AFTER `lifetime`, @@ -81,7 +82,7 @@ CREATE TABLE `zt_stakeholder` ( -- DROP TABLE IF EXISTS `zt_expect`; CREATE TABLE `zt_expect` ( - `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, `userID` mediumint(8) NOT NULL, `program` mediumint(8) NOT NULL DEFAULT 0, `expect` text NOT NULL, diff --git a/db/zentao.sql b/db/zentao.sql index 805215fb10..268483b6fc 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -717,7 +717,7 @@ CREATE TABLE `zt_project` ( `QD` varchar(30) NOT NULL DEFAULT '', `RD` varchar(30) NOT NULL DEFAULT '', `team` varchar(90) NOT NULL, - `acl` enum('open','private','custom') NOT NULL DEFAULT 'open', + `acl` char(30) NOT NULL DEFAULT 'open', `whitelist` text NOT NULL, `order` mediumint(8) unsigned NOT NULL, `deleted` enum('0','1') NOT NULL DEFAULT '0', @@ -1302,7 +1302,7 @@ CREATE TABLE IF NOT EXISTS `zt_entry` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- DROP TABLE IF EXISTS `zt_expect`; CREATE TABLE `zt_expect` ( - `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, `userID` mediumint(8) NOT NULL, `program` mediumint(8) NOT NULL DEFAULT 0, `expect` text NOT NULL, diff --git a/module/program/control.php b/module/program/control.php index 59454e8af1..eefbd95450 100644 --- a/module/program/control.php +++ b/module/program/control.php @@ -457,7 +457,7 @@ class program extends control * @access public * @return void */ - public function createStakeholder($programID = 0, $dept = '', $parentID = 0) + public function createStakeholder($programID = 0, $dept = '', $parentIdList = '') { if($_POST) { @@ -483,7 +483,7 @@ class program extends control $this->view->dept = $dept; $this->view->depts = array('' => '') + $this->dept->getOptionMenu(); $this->view->stakeholders = $this->program->getStakeholders($programID, 't1.id_desc'); - $this->view->parentStakeholders = $this->program->getStakeholders($parentID, 't1.id_desc'); + $this->view->parentStakeholders = $this->program->getStakeholdersByList($parentIdList); $this->display(); } diff --git a/module/program/js/pgmedit.js b/module/program/js/pgmedit.js new file mode 100644 index 0000000000..21de13d9eb --- /dev/null +++ b/module/program/js/pgmedit.js @@ -0,0 +1,11 @@ +function setAclList(programID) +{ + if(programID != 0) + { + $('.aclBox').html($('#subPGMAcl').html()); + } + else + { + $('.aclBox').html($('#PGMAcl').html()); + } +} diff --git a/module/program/js/prjedit.js b/module/program/js/prjedit.js index e4f2b4f37a..de53e5007c 100644 --- a/module/program/js/prjedit.js +++ b/module/program/js/prjedit.js @@ -13,3 +13,15 @@ $(function() } }); }); + +function setAclList(programID) +{ + if(programID != 0) + { + $('.aclBox').html($('#PGMAcl').html()); + } + else + { + $('.aclBox').html($('#PRJAcl').html()); + } +} diff --git a/module/program/model.php b/module/program/model.php index 13208dadf3..231cdecd18 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -339,7 +339,6 @@ class programModel extends model ->stripTags($this->config->program->editor->pgmedit['id'], $this->config->allowedTags) ->remove('uid') ->get(); - if(!isset($project->whitelist) or $project->acl != 'custom') $project->whitelist = ''; $program = $this->loadModel('file')->processImgURL($program, $this->config->program->editor->pgmedit['id'], $this->post->uid); $children = $this->getChildren($programID); @@ -456,8 +455,14 @@ class programModel extends model $programMenu = array(); $query = $this->dao->select('*')->from(TABLE_PROJECT) ->where('deleted')->eq('0') - ->beginIF($from == 'program')->andWhere('type')->in('program,project')->fi() - ->beginIF($from == 'product')->andWhere('type')->eq('program')->fi() + ->beginIF($from == 'program') + ->andWhere('type')->in('program,project') + ->andWhere('id')->in($this->app->user->view->programs . $this->app->user->view->projects) + ->fi() + ->beginIF($from == 'product') + ->andWhere('type')->eq('program') + ->andWhere('id')->in($this->app->user->view->programs) + ->fi() ->beginIF(!$this->cookie->showClosed)->andWhere('status')->ne('closed')->fi() ->orderBy('grade desc, `order`')->get(); $stmt = $this->dbh->query($query); @@ -526,6 +531,7 @@ class programModel extends model /** * Get stakeholders by program id. * + * @param string $orderBy * @param int $programID * @access public * @return void @@ -541,6 +547,22 @@ class programModel extends model ->fetchAll(); } + /** + * Get stakeholders by program id list. + * + * @param string $programIdList + * @param string $orderBy + * @access public + * @return void + */ + public function getStakeholdersByList($programIdList = 0) + { + return $this->dao->select('distinct user as account')->from(TABLE_STAKEHOLDER) + ->where('objectID')->in($programIdList) + ->andWhere('objectType')->eq('program') + ->fetchAll(); + } + /** * Create stakeholder for a program. * @@ -900,7 +922,7 @@ class programModel extends model ->where('type')->eq('project') ->andWhere('deleted')->eq(0) ->beginIF($programID)->andWhere('parent')->eq($programID)->fi() - ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->programs)->fi() + ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi() ->fetchPairs(); } @@ -959,7 +981,7 @@ class programModel extends model ->beginIF($programID)->andWhere('parent')->eq($programID)->fi() ->andWhere('model')->eq($model) ->andWhere('deleted')->eq('0') - ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->programs)->fi() + ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi() ->orderBy('id_desc') ->fetchPairs(); } diff --git a/module/program/view/createstakeholder.html.php b/module/program/view/createstakeholder.html.php index f0985ffa5e..035149db2b 100644 --- a/module/program/view/createstakeholder.html.php +++ b/module/program/view/createstakeholder.html.php @@ -12,6 +12,7 @@ ?> +path, ",$programID,") . ',';?> diff --git a/module/program/view/pgmedit.html.php b/module/program/view/pgmedit.html.php index 2375266973..c889236538 100644 --- a/module/program/view/pgmedit.html.php +++ b/module/program/view/pgmedit.html.php @@ -13,6 +13,7 @@ project->weekend);?> +parent ? $lang->program->subPGMAclList : $lang->program->PGMAclList;?>
@@ -22,7 +23,7 @@ - + @@ -70,11 +71,7 @@ - - - acl != 'custom') echo "class='hidden'";?>> - - + - + @@ -115,11 +116,7 @@ - - - acl != 'custom') echo "class='hidden'";?>> - - +
program->PGMParent;?>parent, "class='form-control chosen'");?>parent, "class='form-control chosen' onchange=setAclList(this.value)");?>
project->acl;?>program->PGMAclList, $program->acl, "onclick='setWhite(this.value);'", 'block'));?>
project->whitelist;?>whitelist, '', '', 'inline');?>acl, "onclick='setWhite(this.value);'", 'block'));?>
@@ -86,4 +83,10 @@ + + diff --git a/module/program/view/prjedit.html.php b/module/program/view/prjedit.html.php index a0370c2d2a..5b64673916 100644 --- a/module/program/view/prjedit.html.php +++ b/module/program/view/prjedit.html.php @@ -14,6 +14,7 @@ project->weekend);?> +parent ? $lang->program->PGMPRJAclList : $lang->program->PRJAclList;?>
@@ -28,7 +29,7 @@
program->PGMParent;?>parent, "class='form-control chosen'");?>parent, "class='form-control chosen' onchange='setAclList(this.value)");?>
program->PRJName;?>
project->acl;?>program->PRJAclList, $project->acl, "onclick='setWhite(this.value);'", 'block'));?>
project->whitelist;?>whitelist, '', '', 'inline');?>acl, "onclick='setWhite(this.value);'", 'block'));?>
@@ -134,4 +131,10 @@ + + diff --git a/module/programplan/model.php b/module/programplan/model.php index d68f999e98..ba4cb7a573 100644 --- a/module/programplan/model.php +++ b/module/programplan/model.php @@ -74,6 +74,7 @@ class programplanModel extends model ->beginIF($browseType == 'all')->andWhere('project')->eq($programID)->fi() ->beginIF($browseType == 'parent')->andWhere('parent')->eq($programID)->fi() ->beginIF($browseType == 'children')->andWhere('parent')->eq($planID)->fi() + ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->stages)->fi() ->beginIF($productID)->andWhere('id')->in($projects)->fi() ->andWhere('deleted')->eq(0) ->orderBy($orderBy) diff --git a/module/project/model.php b/module/project/model.php index 44d8e17515..45fbebb6ba 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -29,7 +29,7 @@ class projectModel extends model /* If is admin, return true. */ if($this->app->user->admin) return true; - return (strpos(",{$this->app->user->view->projects},", ",{$projectID},") !== false); + return (strpos(",{$this->app->user->view->sprints},", ",{$projectID},") !== false); } /** @@ -291,7 +291,7 @@ class projectModel extends model if(!isset($projects[$this->session->project])) { $this->session->set('project', key($projects)); - if($projectID && strpos(",{$this->app->user->view->projects},", ",{$this->session->project},") === false) $this->accessDenied(); + if($projectID && strpos(",{$this->app->user->view->sprints},", ",{$this->session->project},") === false) $this->accessDenied(); } return $this->session->project; } @@ -464,7 +464,7 @@ class projectModel extends model if(!dao::isError()) { $this->file->updateObjectID($this->post->uid, $projectID, 'project'); - if($project->acl != 'open' and ($project->acl != $oldProject->acl or $project->whitelist != $oldProject->whitelist)) $this->loadModel('user')->updateUserView($projectID, 'project'); + if($project->acl != 'open' and ($project->acl != $oldProject->acl or $project->whitelist != $oldProject->whitelist)) $this->loadModel('user')->updateUserView($projectID, 'sprint'); return common::createChanges($oldProject, $project); } } @@ -730,7 +730,7 @@ class projectModel extends model ->where('deleted')->eq(0) ->beginIF($programID)->andWhere('parent')->eq($programID)->fi() ->beginIF(strpos($mode, 'withdelete') === false)->andWhere('deleted')->eq(0)->fi() - ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi() + ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->sprints)->fi() ->orderBy($orderBy) ->fetchAll(); $pairs = array(); @@ -788,7 +788,7 @@ class projectModel extends model ->beginIF($status == 'undone')->andWhere('t2.status')->notIN('done,closed')->fi() ->beginIF($branch)->andWhere('t1.branch')->eq($branch)->fi() ->beginIF($status != 'all' and $status != 'undone')->andWhere('status')->in($status)->fi() - ->beginIF(!$this->app->user->admin)->andWhere('t2.id')->in($this->app->user->view->projects)->fi() + ->beginIF(!$this->app->user->admin)->andWhere('t2.id')->in($this->app->user->view->sprints)->fi() ->orderBy('order_desc') ->beginIF($limit)->limit($limit)->fi() ->fetchAll('id'); @@ -800,7 +800,7 @@ class projectModel extends model ->andWhere('type')->in('sprint,stage') ->beginIF($status == 'undone')->andWhere('status')->notIN('done,closed')->fi() ->beginIF($status != 'all' and $status != 'undone')->andWhere('status')->in($status)->fi() - ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi() + ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->sprints)->fi() ->beginIF($programID)->andWhere('parent')->eq($programID)->fi() ->orderBy('order_desc') ->beginIF($limit)->limit($limit)->fi() @@ -828,7 +828,7 @@ class projectModel extends model ->where('t1.product')->eq($productID) ->andWhere('t2.deleted')->eq(0) ->beginIF($branch)->andWhere('t1.branch')->eq($branch)->fi() - ->beginIF(!$this->app->user->admin)->andWhere('t2.id')->in($this->app->user->view->projects)->fi() + ->beginIF(!$this->app->user->admin)->andWhere('t2.id')->in($this->app->user->view->sprints)->fi() ->andWhere('t2.openedBy', true)->eq($this->app->user->account) ->orWhere('t3.account')->eq($this->app->user->account) ->markRight(1) @@ -842,7 +842,7 @@ class projectModel extends model return $this->dao->select('t1.*, IF(INSTR(" done,closed", t1.status) < 2, 0, 1) AS isDone')->from(TABLE_PROJECT)->alias('t1') ->leftJoin(TABLE_TEAM)->alias('t2')->on('t2.root=t1.id') ->where('t1.deleted')->eq(0) - ->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->projects)->fi() + ->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->sprints)->fi() ->andWhere('t1.openedBy', true)->eq($this->app->user->account) ->orWhere('t2.account')->eq($this->app->user->account) ->markRight(1) @@ -897,7 +897,7 @@ class projectModel extends model $list = $this->dao->select('t1.id, t1.name,t1.status, t2.product')->from(TABLE_PROJECT)->alias('t1') ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id = t2.project') ->where('t1.deleted')->eq(0) - ->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->projects)->fi() + ->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->sprints)->fi() ->fetchGroup('product'); $noProducts = array(); @@ -1318,7 +1318,7 @@ class projectModel extends model { $projects = $this->dao->select('*')->from(TABLE_PROJECT) ->where('id')->in($projectIds) - ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi() + ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->sprints)->fi() ->andWhere('deleted')->eq(0) ->orderBy('id desc') ->fetchAll('id'); diff --git a/module/stakeholder/model.php b/module/stakeholder/model.php index 3dcb4a7857..4497a1f034 100644 --- a/module/stakeholder/model.php +++ b/module/stakeholder/model.php @@ -261,7 +261,7 @@ class stakeholderModel extends model { $objects = $this->dao->select('id, path, parent')->from(TABLE_PROJECT)->where('id')->in($objectIdList)->andWhere('acl')->ne('open')->fetchAll('id'); - $parents = ''; + $parents = array(); foreach($objects as $object) { if($object->parent == 0) continue; @@ -279,7 +279,7 @@ class stakeholderModel extends model $parentStakeholderGroup = array(); foreach($parentStakeholders as $parentStakeholder) { - $subPrograms = zget($parentPrograms, $parentStakeholder->objectID, array()); + $subPrograms = zget($parents, $parentStakeholder->objectID, array()); foreach($subPrograms as $subProgramID) $parentStakeholderGroup[$subProgramID][$parentStakeholder->user] = $parentStakeholder->user; } diff --git a/module/user/control.php b/module/user/control.php index 2db7c7e7d0..0b56498cc2 100644 --- a/module/user/control.php +++ b/module/user/control.php @@ -732,7 +732,7 @@ class user extends control /* Authorize him and save to session. */ $user->rights = $this->user->authorize($user->account); $user->groups = $this->user->getGroups($user->account); - $user->view = $this->user->grantUserView($user->account, $user->rights['acls'], $user->rights['programs']); + $user->view = $this->user->grantUserView($user->account, $user->rights['acls'], $user->rights['projects']); $this->session->set('user', $user); $this->app->user = $this->session->user; $this->loadModel('action')->create('user', $user->id, 'login'); diff --git a/module/user/model.php b/module/user/model.php index d40f805542..c671850d33 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -1384,11 +1384,11 @@ class userModel extends model /* Get stakeholders. */ if($stakeholders === null) { - $stmt = $this->dao->select('objectID,account')->from(TABLE_STAKEHOLDER)->query(); - while($stakeholder = $stmt->fetch()) $stakeholders[$stakeholder->objectID][$stakeholder->account] = $stakeholder->account; + $stmt = $this->dao->select('objectID,user')->from(TABLE_STAKEHOLDER)->query(); + while($stakeholder = $stmt->fetch()) $stakeholders[$stakeholder->objectID][$stakeholder->user] = $stakeholder->user; } - list($productTeams, $productStakeholders) = $this->getProductStakeholders($allProducts); + list($productTeams, $productStakeholders) = $this->getProductMembers($allProducts); $userView = new stdclass(); $userView->account = $account; @@ -1412,8 +1412,7 @@ class userModel extends model $programs = array(); foreach($allPrograms as $id => $program) { - $stakeholders = isset($stakeholders[$id]) ? $stakeholders[$id] : array(); - if($this->checkProgramPriv($program, $account, $stakeholders)) $programs[$id] = $id; + if($this->checkProgramPriv($program, $account, zget($stakeholders, $id, array()))) $programs[$id] = $id; } $userView->programs = join(',', $programs); @@ -1421,19 +1420,17 @@ class userModel extends model $products = array(); foreach($allProducts as $id => $product) { - $stakeholders = isset($productStakeholders[$product->id]) ? $productStakeholders[$product->id] : array(); - $teams = isset($programTeams[$product->id]) ? $teamGroups[$product->id] : array(); - if($this->checkProductPriv($product, $account, $groups, $teams, $stakeholders)) $products[$id] = $id; + if($this->checkProductPriv($product, $account, $groups, zget($productTeams, $product->id, array()), zget($productStakeholders, $product->id, array()))) $products[$id] = $id; } - $userView->product = join(',', $products); + $userView->products = join(',', $products); /* Process project userview. */ $projects = array(); foreach($allProjects as $id => $project) { - $projectTeams = isset($teams[$id]) ? $teams[$id] : array(); - $stakeholders = isset($stakeholders[$id]) ? $stakeholders[$id] : array(); - if($this->checkProjectPriv($project, $account, $stakeholders, $projectTeams)) $projects[$id] = $id; + $projectTeams = zget($teams, $id, array()); + $projectStakeholders = zget($stakeholders, $id, array()); + if($this->checkProjectPriv($project, $account, $projectStakeholders, $projectTeams)) $projects[$id] = $id; } $userView->projects = join(',', $projects); @@ -1441,9 +1438,9 @@ class userModel extends model $sprints = array(); foreach($allSprints as $id => $sprint) { - $sprintTeams = isset($teams[$id]) ? $teams[$id] : array(); - $stakeholders = isset($stakeholders[$sprint->project]) ? $stakeholders[$sprint->project] : array(); - if($this->checkSprintPriv($sprint, $account, $stakeholders, $sprintTeams)) $sprints[$id] = $id; + $sprintTeams = zget($teams, $id, array()); + $sprintStakeholders = zget($stakeholders, $sprint->project, array()); + if($this->checkSprintPriv($sprint, $account, $sprintStakeholders, $sprintTeams)) $sprints[$id] = $id; } $userView->projects = join(',', $projects); @@ -1451,9 +1448,9 @@ class userModel extends model $stages = array(); foreach($allStages as $id => $stage) { - $stageTeams = isset($teams[$id]) ? $teams[$id] : array(); - $stakeholders = isset($stakeholders[$sprint->project]) ? $stakeholders[$sprint->project] : array(); - if($this->checkStagePriv($project, $account, $stakeholders, $stageTeams)) $stages[$id] = $id; + $stageTeams = zget($teams, $id, array()); + $stageStakeholders = zget($stakeholders, $sprint->project, array()); + if($this->checkStagePriv($project, $account, $stageStakeholders, $stageTeams)) $stages[$id] = $id; } $userView->stages = join(',', $stages); } @@ -1464,13 +1461,13 @@ class userModel extends model } /** - * Get product teams and stakeholders + * Get product teams and stakeholders. * * @param array $allProducts * @access public * @return array */ - public function getProductStakeholders($allProducts) + public function getProductMembers($allProducts) { /* Get product and project relation. */ $projectProducts = array(); @@ -1723,7 +1720,7 @@ class userModel extends model */ public function updateProjectView($projectIdList, $users) { - $projects = $this->dao->select('id, PM, PO, QD, RD, openedBy, acl, parent, path')->from(TABLE_PROJECT)->where('id')->in($projectIdList)->andWhere('acl')->ne('open')->fetchAll('id'); + $projects = $this->dao->select('id, PM, PO, QD, RD, openedBy, acl, parent, path, type')->from(TABLE_PROJECT)->where('id')->in($projectIdList)->andWhere('acl')->ne('open')->fetchAll('id'); if(empty($projects)) return true; $teamGroups = array(); @@ -1804,7 +1801,7 @@ class userModel extends model $groupUsers[$group->group][$group->account] = $group->account; } - list($productTeams, $productStakeholders) = $this->getProductStakeholders($products); + list($productTeams, $productStakeholders) = $this->getProductMembers($products); /* Get white list.*/ $whiteList = array(); @@ -1853,7 +1850,7 @@ class userModel extends model */ public function updateStageView($stageIdList, $users) { - $stages = $this->dao->select('id, PM, PO, QD, RD, openedBy, acl, parent, path, grade')->from(TABLE_PROJECT)->where('id')->in($stageIdList)->andWhere('acl')->ne('open')->fetchAll('id'); + $stages = $this->dao->select('id, PM, PO, QD, RD, openedBy, acl, parent, path, grade, type')->from(TABLE_PROJECT)->where('id')->in($stageIdList)->andWhere('acl')->ne('open')->fetchAll('id'); if(empty($stages)) return true; $teamGroups = array(); @@ -1924,7 +1921,7 @@ class userModel extends model */ public function updateSprintView($sprintIdList, $users) { - $sprints = $this->dao->select('id, PM, PO, QD, RD, openedBy, acl, parent, path, grade')->from(TABLE_PROJECT)->where('id')->in($sprintIdList)->andWhere('acl')->ne('open')->fetchAll('id'); + $sprints = $this->dao->select('id, PM, PO, QD, RD, openedBy, acl, parent, path, grade, type')->from(TABLE_PROJECT)->where('id')->in($sprintIdList)->andWhere('acl')->ne('open')->fetchAll('id'); if(empty($sprints)) return true; $teamGroups = array();