diff --git a/db/update15.0.sql b/db/update15.0.sql index 0454c02f16..381574d0b3 100644 --- a/db/update15.0.sql +++ b/db/update15.0.sql @@ -1,3 +1,4 @@ ALTER TABLE `zt_project` CHANGE `lifetime` `lifetime` char(30) NOT NULL DEFAULT ''; ALTER TABLE `zt_story` ADD `category` varchar(30) NOT NULL DEFAULT 'feature' AFTER `type`; ALTER TABLE `zt_testtask` ADD `type` varchar(255) NOT NULL DEFAULT '' AFTER `build`; +ALTER TABLE `zt_testtask` ADD `testreport` mediumint(8) unsigned NOT NULL AFTER `status`; diff --git a/db/zentao.sql b/db/zentao.sql index 19468f47c2..be5c3a333c 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -1060,6 +1060,7 @@ CREATE TABLE IF NOT EXISTS `zt_testtask` ( `desc` text NOT NULL, `report` text NOT NULL, `status` enum('blocked','doing','wait','done') NOT NULL DEFAULT 'wait', + `testreport` mediumint(8) unsigned NOT NULL, `auto` varchar(10) NOT NULL DEFAULT 'no', `subStatus` varchar(30) NOT NULL default '', `deleted` enum('0','1') NOT NULL default '0', diff --git a/module/build/control.php b/module/build/control.php index 98a8af08d8..bca492741a 100644 --- a/module/build/control.php +++ b/module/build/control.php @@ -373,10 +373,10 @@ class build extends control } if($varName == 'testTaskBuild') { - $builds = $this->build->getExecutionBuildPairs($executionID, $productID, $branch, 'noempty,notrunk'); + $builds = array('' => '') + $this->build->getExecutionBuildPairs($executionID, $productID, $branch, 'noempty,notrunk'); if($isJsonView) die(json_encode($builds)); - if(empty($builds)) + if(empty(array_filter($builds))) { $projectID = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($executionID)->fetch('project'); @@ -385,7 +385,7 @@ class build extends control $html .= html::a("javascript:loadExecutionBuilds($executionID)", $this->lang->refresh); die($html); } - die(html::select('build', $builds, $build, "class='form-control'")); + die(html::select('build', $builds, $build, "class='form-control' onchange='loadTestReports(this.value)'")); } if($varName == 'dropdownList') { diff --git a/module/custom/config.php b/module/custom/config.php index e5837ffb1e..4b000df4ce 100644 --- a/module/custom/config.php +++ b/module/custom/config.php @@ -1,6 +1,6 @@ custom = new stdClass(); -$config->custom->canAdd['story'] = 'reasonList,sourceList,priList'; +$config->custom->canAdd['story'] = 'reasonList,sourceList,priList,categoryList'; $config->custom->canAdd['task'] = 'priList,typeList,reasonList'; $config->custom->canAdd['bug'] = 'priList,severityList,osList,browserList,typeList,resolutionList'; $config->custom->canAdd['testcase'] = 'priList,typeList,stageList,resultList,statusList'; diff --git a/module/custom/lang/de.php b/module/custom/lang/de.php index 1cdf6d058a..a9ead14a0d 100644 --- a/module/custom/lang/de.php +++ b/module/custom/lang/de.php @@ -96,6 +96,7 @@ $lang->custom->project->defaultCurrency = 'Default Currency'; $lang->custom->project->fields['unitList'] = 'Unit List'; $lang->custom->story = new stdClass(); +$lang->custom->story->fields['categoryList'] = 'Category'; $lang->custom->story->fields['priList'] = 'Priority'; $lang->custom->story->fields['sourceList'] = 'Source'; $lang->custom->story->fields['reasonList'] = 'Close Reason'; diff --git a/module/custom/lang/en.php b/module/custom/lang/en.php index 355cc1523f..d36dc06a47 100644 --- a/module/custom/lang/en.php +++ b/module/custom/lang/en.php @@ -96,6 +96,7 @@ $lang->custom->project->defaultCurrency = 'Default Currency'; $lang->custom->project->fields['unitList'] = 'Unit List'; $lang->custom->story = new stdClass(); +$lang->custom->story->fields['categoryList'] = 'Category'; $lang->custom->story->fields['priList'] = 'Priority'; $lang->custom->story->fields['sourceList'] = 'Source'; $lang->custom->story->fields['reasonList'] = 'Close Reason'; diff --git a/module/custom/lang/fr.php b/module/custom/lang/fr.php index 8e44c229c8..61d7910aaa 100644 --- a/module/custom/lang/fr.php +++ b/module/custom/lang/fr.php @@ -96,6 +96,7 @@ $lang->custom->project->defaultCurrency = 'Default Currency'; $lang->custom->project->fields['unitList'] = 'Unit List'; $lang->custom->story = new stdClass(); +$lang->custom->story->fields['categoryList'] = 'Category'; $lang->custom->story->fields['priList'] = 'Priorité'; $lang->custom->story->fields['sourceList'] = 'Source'; $lang->custom->story->fields['reasonList'] = 'Raison Fermeture'; diff --git a/module/custom/lang/vi.php b/module/custom/lang/vi.php index 58232273fe..a02fecb7e2 100644 --- a/module/custom/lang/vi.php +++ b/module/custom/lang/vi.php @@ -96,6 +96,7 @@ $lang->custom->project->defaultCurrency = 'Default Currency'; $lang->custom->project->fields['unitList'] = 'Unit List'; $lang->custom->story = new stdClass(); +$lang->custom->story->fields['categoryList'] = 'Category'; $lang->custom->story->fields['priList'] = 'Ưu tiên'; $lang->custom->story->fields['sourceList'] = 'Nguồn'; $lang->custom->story->fields['reasonList'] = 'Lý do đóng'; diff --git a/module/custom/lang/zh-cn.php b/module/custom/lang/zh-cn.php index b6a783ee18..4bd7d560f0 100644 --- a/module/custom/lang/zh-cn.php +++ b/module/custom/lang/zh-cn.php @@ -96,6 +96,7 @@ $lang->custom->project->defaultCurrency = '默认货币'; $lang->custom->project->fields['unitList'] = '预算单位'; $lang->custom->story = new stdClass(); +$lang->custom->story->fields['categoryList'] = '类型'; $lang->custom->story->fields['priList'] = '优先级'; $lang->custom->story->fields['sourceList'] = '来源'; $lang->custom->story->fields['reasonList'] = '关闭原因'; diff --git a/module/custom/lang/zh-tw.php b/module/custom/lang/zh-tw.php index 3b3ca37137..76e5d66b07 100644 --- a/module/custom/lang/zh-tw.php +++ b/module/custom/lang/zh-tw.php @@ -96,6 +96,7 @@ $lang->custom->project->defaultCurrency = '預設貨幣'; $lang->custom->project->fields['unitList'] = '預算單位'; $lang->custom->story = new stdClass(); +$lang->custom->story->fields['categoryList'] = '類型'; $lang->custom->story->fields['priList'] = '優先順序'; $lang->custom->story->fields['sourceList'] = '來源'; $lang->custom->story->fields['reasonList'] = '關閉原因'; diff --git a/module/group/lang/de.php b/module/group/lang/de.php index c409ea8634..00c6974c81 100644 --- a/module/group/lang/de.php +++ b/module/group/lang/de.php @@ -56,6 +56,7 @@ $lang->group->copyOptions['copyPriv'] = 'Rechte kopieren'; $lang->group->copyOptions['copyUser'] = 'Benutzer kopieren'; $lang->group->versions[''] = 'Verlauf'; +$lang->group->versions['15_0_rc1'] = 'ZenTao15.0.rc1'; $lang->group->versions['12_5'] = 'ZenTao12.5'; $lang->group->versions['12_3'] = 'ZenTao12.3'; $lang->group->versions['11_6_2'] = 'ZenTao11.6.2'; diff --git a/module/group/lang/en.php b/module/group/lang/en.php index 59007182f7..11212c03e7 100644 --- a/module/group/lang/en.php +++ b/module/group/lang/en.php @@ -56,6 +56,7 @@ $lang->group->copyOptions['copyPriv'] = 'Copy Privileges'; $lang->group->copyOptions['copyUser'] = 'Copy Users'; $lang->group->versions[''] = 'History'; +$lang->group->versions['15_0_rc1'] = 'ZenTao15.0.rc1'; $lang->group->versions['12_5'] = 'ZenTao12.5'; $lang->group->versions['12_3'] = 'ZenTao12.3'; $lang->group->versions['11_6_2'] = 'ZenTao11.6.2'; diff --git a/module/group/lang/fr.php b/module/group/lang/fr.php index 778ec86411..edc1f8030a 100644 --- a/module/group/lang/fr.php +++ b/module/group/lang/fr.php @@ -56,6 +56,7 @@ $lang->group->copyOptions['copyPriv'] = 'Copier Privilèges'; $lang->group->copyOptions['copyUser'] = 'Copier Utilisateurs'; $lang->group->versions[''] = 'History'; +$lang->group->versions['15_0_rc1'] = 'ZenTao15.0.rc1'; $lang->group->versions['12_5'] = 'ZenTao12.5'; $lang->group->versions['12_3'] = 'ZenTao12.3'; $lang->group->versions['11_6_2'] = 'ZenTao11.6.2'; diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index b222123b5b..30b7a100ba 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1746,3 +1746,97 @@ $lang->changelog['12.3'][] = 'ci-commitResult'; $lang->changelog['12.5'][] = 'story-batchToTask'; $lang->changelog['12.5'][] = 'custom-product'; $lang->changelog['12.5'][] = 'custom-project'; + +$lang->changelog['15.0.rc1'][] = 'program-browse'; +$lang->changelog['15.0.rc1'][] = 'program-view'; +$lang->changelog['15.0.rc1'][] = 'program-product'; +$lang->changelog['15.0.rc1'][] = 'program-create'; +$lang->changelog['15.0.rc1'][] = 'program-edit'; +$lang->changelog['15.0.rc1'][] = 'program-start'; +$lang->changelog['15.0.rc1'][] = 'program-suspend'; +$lang->changelog['15.0.rc1'][] = 'program-activate'; +$lang->changelog['15.0.rc1'][] = 'program-close'; +$lang->changelog['15.0.rc1'][] = 'program-delete'; +$lang->changelog['15.0.rc1'][] = 'program-project'; +$lang->changelog['15.0.rc1'][] = 'program-stakeholder'; +$lang->changelog['15.0.rc1'][] = 'program-createStakeholder'; +$lang->changelog['15.0.rc1'][] = 'program-unlinkStakeholder'; +$lang->changelog['15.0.rc1'][] = 'program-batchUnlinkStakeholders'; +$lang->changelog['15.0.rc1'][] = 'program-unbindWhitelist'; +$lang->changelog['15.0.rc1'][] = 'program-export'; +$lang->changelog['15.0.rc1'][] = 'project-execution'; +$lang->changelog['15.0.rc1'][] = 'project-group'; +$lang->changelog['15.0.rc1'][] = 'project-createGroup'; +$lang->changelog['15.0.rc1'][] = 'project-manageView'; +$lang->changelog['15.0.rc1'][] = 'project-managePriv'; +$lang->changelog['15.0.rc1'][] = 'project-manageGroupMember'; +$lang->changelog['15.0.rc1'][] = 'project-copyGroup'; +$lang->changelog['15.0.rc1'][] = 'project-editGroup'; +$lang->changelog['15.0.rc1'][] = 'project-whitelist'; +$lang->changelog['15.0.rc1'][] = 'project-addWhitelist'; +$lang->changelog['15.0.rc1'][] = 'project-unbindWhitelist'; +$lang->changelog['15.0.rc1'][] = 'project-qa'; +$lang->changelog['15.0.rc1'][] = 'project-createGuide'; +$lang->changelog['15.0.rc1'][] = 'project-moduleOpen'; +$lang->changelog['15.0.rc1'][] = 'personnel-accessible'; +$lang->changelog['15.0.rc1'][] = 'personnel-invest'; +$lang->changelog['15.0.rc1'][] = 'personnel-whitelist'; +$lang->changelog['15.0.rc1'][] = 'personnel-addWhitelist'; +$lang->changelog['15.0.rc1'][] = 'personnel-unbindWhitelist'; +$lang->changelog['15.0.rc1'][] = 'my-workAction'; +$lang->changelog['15.0.rc1'][] = 'my-contributeAction'; +$lang->changelog['15.0.rc1'][] = 'my-testtask'; +$lang->changelog['15.0.rc1'][] = 'my-execution'; +$lang->changelog['15.0.rc1'][] = 'my-doc'; +$lang->changelog['15.0.rc1'][] = 'my-calendarAction'; +$lang->changelog['15.0.rc1'][] = 'story-trackAB'; +$lang->changelog['15.0.rc1'][] = 'story-processStoryChange'; +$lang->changelog['15.0.rc1'][] = 'projectstory-story'; +$lang->changelog['15.0.rc1'][] = 'projectstory-trackAction'; +$lang->changelog['15.0.rc1'][] = 'projectstory-view'; +$lang->changelog['15.0.rc1'][] = 'projectstory-linkStory'; +$lang->changelog['15.0.rc1'][] = 'projectstory-unlinkStory'; +$lang->changelog['15.0.rc1'][] = 'projectstory-importplanstories'; +$lang->changelog['15.0.rc1'][] = 'execution-whitelist'; +$lang->changelog['15.0.rc1'][] = 'execution-addWhitelist'; +$lang->changelog['15.0.rc1'][] = 'execution-unbindWhitelist'; +$lang->changelog['15.0.rc1'][] = 'automation-browse'; +$lang->changelog['15.0.rc1'][] = 'group-manageProjectAdmin'; +$lang->changelog['15.0.rc1'][] = 'user-execution'; +$lang->changelog['15.0.rc1'][] = 'custom-setStoryConcept'; +$lang->changelog['15.0.rc1'][] = 'custom-editStoryConcept'; +$lang->changelog['15.0.rc1'][] = 'custom-browseStoryConcept'; +$lang->changelog['15.0.rc1'][] = 'custom-setDefaultConcept'; +$lang->changelog['15.0.rc1'][] = 'custom-deleteStoryConcept'; +$lang->changelog['15.0.rc1'][] = 'search-index'; +$lang->changelog['15.0.rc1'][] = 'search-buildIndex'; +$lang->changelog['15.0.rc1'][] = 'projectbuild-browse'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-browseAction'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-create'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-edit'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-delete'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-view'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-export'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-linkStory'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-unlinkStory'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-batchUnlinkStory'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-linkBug'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-unlinkBug'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-batchUnlinkBug'; +$lang->changelog['15.0.rc1'][] = 'projectrelease-changeStatus'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-browse'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-create'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-batchCreate'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-edit'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-delete'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-viewAction'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-issue'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-viewIssueAction'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-communicate'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-expect'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-expectation'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-deleteExpect'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-createExpect'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-editExpect'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-viewExpect'; +$lang->changelog['15.0.rc1'][] = 'stakeholder-userIssue'; diff --git a/module/group/lang/vi.php b/module/group/lang/vi.php index f6fb87f221..0f6b989416 100644 --- a/module/group/lang/vi.php +++ b/module/group/lang/vi.php @@ -56,6 +56,7 @@ $lang->group->copyOptions['copyPriv'] = 'Copy Privileges'; $lang->group->copyOptions['copyUser'] = 'Copy người dùng'; $lang->group->versions[''] = 'Lịch sử'; +$lang->group->versions['15_0_rc1'] = 'ZenTao15.0.rc1'; $lang->group->versions['12_5'] = 'ZenTao12.5'; $lang->group->versions['12_3'] = 'ZenTao12.3'; $lang->group->versions['11_6_2'] = 'ZenTao11.6.2'; diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php index da058bfbab..32bee9be0e 100644 --- a/module/group/lang/zh-cn.php +++ b/module/group/lang/zh-cn.php @@ -56,6 +56,7 @@ $lang->group->copyOptions['copyPriv'] = '复制权限'; $lang->group->copyOptions['copyUser'] = '复制用户'; $lang->group->versions[''] = '修改历史'; +$lang->group->versions['15_0_rc1'] = '禅道15.0.rc1'; $lang->group->versions['12_5'] = '禅道12.5'; $lang->group->versions['12_3'] = '禅道12.3'; $lang->group->versions['11_6_2'] = '禅道11.6.2'; diff --git a/module/group/lang/zh-tw.php b/module/group/lang/zh-tw.php index d27ce23d8f..ffefc4ca8f 100644 --- a/module/group/lang/zh-tw.php +++ b/module/group/lang/zh-tw.php @@ -56,6 +56,7 @@ $lang->group->copyOptions['copyPriv'] = '複製權限'; $lang->group->copyOptions['copyUser'] = '複製用戶'; $lang->group->versions[''] = '修改歷史'; +$lang->group->versions['15_0'] = '禪道15.0'; $lang->group->versions['12_5'] = '禪道12.5'; $lang->group->versions['12_3'] = '禪道12.3'; $lang->group->versions['11_6_2'] = '禪道11.6.2'; diff --git a/module/personnel/model.php b/module/personnel/model.php index 436f40e1ea..ebaed2944f 100644 --- a/module/personnel/model.php +++ b/module/personnel/model.php @@ -41,20 +41,64 @@ class personnelModel extends model /* Determine who can be accessed based on access control. */ $program = $this->loadModel('program')->getByID($programID); $personnelList = array(); - if($program->acl != 'open') + $personnelList = $this->dao->select('t2.id,t2.dept,t2.account,t2.role,t2.realname,t2.gender')->from(TABLE_USERVIEW)->alias('t1') + ->leftJoin(TABLE_USER)->alias('t2')->on('t1.account=t2.account') + ->where('t2.deleted')->eq(0) + ->beginIF($program->acl != 'open')->andWhere("CONCAT(',', t1.programs, ',')")->like("%,$programID,%") + ->beginIF($deptID > 0)->andWhere('t2.dept')->eq($deptID)->fi() + ->beginIF($browseType == 'bysearch')->andWhere($accessibleQuery)->fi() + ->page($pager) + ->fetchAll('id'); + + if($program->acl == 'open') { - $personnelList = $this->dao->select('t2.id,t2.dept,t2.account,t2.role,t2.realname,t2.gender')->from(TABLE_USERVIEW)->alias('t1') - ->leftJoin(TABLE_USER)->alias('t2')->on('t1.account=t2.account') - ->where("CONCAT(',', t1.programs, ',')")->like("%,$programID,%") - ->beginIF($deptID > 0)->andWhere('t2.dept')->eq($deptID)->fi() - ->beginIF($browseType == 'bysearch')->andWhere($accessibleQuery)->fi() - ->page($pager) - ->fetchAll(); + foreach($personnelList as $personnel) + { + if(!$this->canViewProgram($programID, $personnel->account)) unset($personnelList[$personnel->id]); + } } return $personnelList; } + /** + * Check if you have permission to view the program. + * + * @param int $programID + * @param string $account + * @access public + * @return void + */ + public function canViewProgram($programID, $account) + { + if(strpos($this->app->company->admins, ",{$account},") !== false) return true; + static $groupAcl = array(); + if(empty($groupAcl)) $groupAcl = $this->dao->select('id,acl')->from(TABLE_GROUP)->fetchPairs(); + + static $userGroups = array(); + if(empty($userGroups)) $userGroups = $this->dao->select('*')->from(TABLE_USERGROUP)->fetchGroup('account', 'group'); + + $programRight = false; + if(isset($userGroups[$account])) + { + foreach($userGroups[$account] as $groupID => $userGroup) + { + $group = json_decode($groupAcl[$groupID]); + if(!isset($group->programs)) + { + $programRight = true; + continue; + } + elseif(in_array($programID, $group->programs)) + { + $programRight = true; + continue; + } + } + } + return $programRight; + } + /** * Get invest person list. * diff --git a/module/personnel/view/accessible.html.php b/module/personnel/view/accessible.html.php index d06bcb048a..745a1c51b5 100644 --- a/module/personnel/view/accessible.html.php +++ b/module/personnel/view/accessible.html.php @@ -12,7 +12,6 @@ -