diff --git a/db/update17.4.sql b/db/update17.4.sql index 9b2e71b002..3c90e379ff 100644 --- a/db/update17.4.sql +++ b/db/update17.4.sql @@ -200,3 +200,20 @@ ALTER TABLE `zt_sqlview` ENGINE='InnoDB'; ALTER TABLE `zt_searchindex` ADD FULLTEXT `title_content` (`title`, `content`); ALTER TABLE `zt_searchindex` DROP INDEX `title`; ALTER TABLE `zt_searchindex` DROP INDEX `content`; + +ALTER TABLE `zt_productplan` ADD `createdBy` varchar(30) NOT NULL AFTER `closedReason`; +ALTER TABLE `zt_productplan` ADD `createdDate` datetime NOT NULL AFTER `createdBy`; + +ALTER TABLE `zt_release` ADD `createdBy` varchar(30) NOT NULL AFTER `subStatus`; +ALTER TABLE `zt_release` ADD `createdDate` datetime NOT NULL AFTER `createdBy`; + +ALTER TABLE `zt_testtask` ADD `createdBy` varchar(30) NOT NULL AFTER `subStatus`; +ALTER TABLE `zt_testtask` ADD `createdDate` datetime NOT NULL AFTER `createdBy`; + +INSERT IGNORE INTO `zt_workflowfield` (`module`, `field`, `type`, `length`, `name`, `control`, `expression`, `options`, `default`, `rules`, `placeholder`, `order`, `searchOrder`, `exportOrder`, `canExport`, `canSearch`, `isValue`, `readonly`, `buildin`, `role`, `desc`, `createdBy`, `createdDate`, `editedBy`, `editedDate`) VALUES +('testtask', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 393, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'), +('testtask', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 394, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'), +('productplan', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 11, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'), +('productplan', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 12, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'), +('release', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 14, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'), +('release', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 15, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'); diff --git a/db/zentao.sql b/db/zentao.sql index 53175ed5a4..9cbb9bb4e9 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -1091,6 +1091,8 @@ CREATE TABLE IF NOT EXISTS `zt_productplan` ( `end` date NOT NULL, `order` text NOT NULL, `closedReason` varchar(20) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, `deleted` enum('0','1') NOT NULL default '0', PRIMARY KEY (`id`), KEY `product` (`product`), @@ -1242,6 +1244,8 @@ CREATE TABLE IF NOT EXISTS `zt_release` ( `notify` varchar(255), `status` varchar(20) NOT NULL default 'normal', `subStatus` varchar(30) NOT NULL default '', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, `deleted` enum('0','1') NOT NULL default '0', PRIMARY KEY (`id`), KEY `product` (`product`), @@ -1671,6 +1675,8 @@ CREATE TABLE IF NOT EXISTS `zt_testtask` ( `testreport` mediumint(8) unsigned NOT NULL, `auto` varchar(10) NOT NULL DEFAULT 'no', `subStatus` varchar(30) NOT NULL default '', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, `deleted` enum('0','1') NOT NULL default '0', PRIMARY KEY (`id`), KEY `product` (`product`), diff --git a/framework/base/router.class.php b/framework/base/router.class.php index 60ef97b0b1..dd4f15306f 100644 --- a/framework/base/router.class.php +++ b/framework/base/router.class.php @@ -996,14 +996,7 @@ class baseRouter if($writable) { $ztSessionHandler = new ztSessionHandler($_GET['tid']); - session_set_save_handler( - array($ztSessionHandler, "open"), - array($ztSessionHandler, "close"), - array($ztSessionHandler, "read"), - array($ztSessionHandler, "write"), - array($ztSessionHandler, "destroy"), - array($ztSessionHandler, "gc") - ); + session_set_save_handler($ztSessionHandler, true); } } @@ -3107,7 +3100,7 @@ class EndResponseException extends \Exception * * @package framework */ -class ztSessionHandler +class ztSessionHandler implements SessionHandlerInterface { public $sessSavePath; public $tagID; diff --git a/framework/model.class.php b/framework/model.class.php index 3ae6f6d4be..2bd51df082 100644 --- a/framework/model.class.php +++ b/framework/model.class.php @@ -157,6 +157,21 @@ class model extends baseModel } if(empty($relations)) $relations = $this->dao->select('next, actions')->from(TABLE_WORKFLOWRELATION)->where('prev')->eq($moduleName)->fetchPairs(); + $this->loadModel('flow'); + + $approvalProgressMenu = ''; + if($type == 'view' && !empty($this->config->openedApproval) && commonModel::hasPriv('approval', 'progress')) + { + $flow = $this->loadModel('workflow', 'flow')->getByModule($moduleName); + if($flow->approval == 'enabled') + { + $approvalID = isset($data->approval) ? $data->approval : 0; + $extraClass = strpos(',testsuite,build,release,productplan,', ",{$moduleName},") !== false ? 'btn-link' : ''; + $approvalProgressMenu .= "
"; + $approvalProgressMenu .= baseHTML::a(helper::createLink('approval', 'progress', "approvalID={$approvalID}", '', true), $this->lang->flow->approvalProgress, "class='btn {$extraClass} iframe'"); + } + } + $menu = ''; if($show) { @@ -164,8 +179,10 @@ class model extends baseModel { if(strpos($action->position, $type) === false || $action->show != $show) continue; - $menu .= $this->loadModel('flow')->buildActionMenu($moduleName, $action, $data, $type, $relations); + $menu .= $this->flow->buildActionMenu($moduleName, $action, $data, $type, $relations); } + + if($approvalProgressMenu) $menu .= $approvalProgressMenu; } else { @@ -174,10 +191,12 @@ class model extends baseModel { if(strpos($action->position, $type) === false) continue; - if($type == 'view' || $action->show == 'direct') $menu .= $this->loadModel('flow')->buildActionMenu($moduleName, $action, $data, $type, $relations); - if($type == 'browse' && $action->show == 'dropdownlist') $dropdownMenu .= $this->loadModel('flow')->buildActionMenu($moduleName, $action, $data, $type, $relations); + if($type == 'view' || $action->show == 'direct') $menu .= $this->flow->buildActionMenu($moduleName, $action, $data, $type, $relations); + if($type == 'browse' && $action->show == 'dropdownlist') $dropdownMenu .= $this->flow->buildActionMenu($moduleName, $action, $data, $type, $relations); } + if($approvalProgressMenu) $menu .= $approvalProgressMenu; + if($type == 'browse' && $dropdownMenu) { $menu .= "| idAB);?> | testsuite->name);?> | diff --git a/module/testtask/model.php b/module/testtask/model.php index 0e9a9dbb14..bfd9815d95 100644 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -31,6 +31,8 @@ class testtaskModel extends model $task = fixer::input('post') ->setDefault('build', '') ->setIF($this->config->systemMode == 'new', 'project', $projectID) + ->setDefault('createdBy', $this->app->user->account) + ->setDefault('createdDate', helper::now()) ->stripTags($this->config->testtask->editor->create['id'], $this->config->allowedTags) ->join('mailto', ',') ->join('type', ',') @@ -86,7 +88,7 @@ class testtaskModel extends model ->beginIF($scopeAndStatus[0] == 'local')->andWhere('t1.product')->eq((int)$productID)->fi() ->beginIF($scopeAndStatus[0] == 'all')->andWhere('t1.product')->in($products)->fi() ->beginIF(strtolower($scopeAndStatus[1]) == 'totalstatus')->andWhere('t1.status')->in('blocked,doing,wait,done')->fi() - ->beginIF(strtolower($scopeAndStatus[1]) != 'totalstatus')->andWhere('t1.status')->eq($scopeAndStatus[1])->fi() + ->beginIF(!in_array(strtolower($scopeAndStatus[1]), array('totalstatus', 'review'), true))->andWhere('t1.status')->eq($scopeAndStatus[1])->fi() ->beginIF($branch !== 'all')->andWhere('t4.branch')->eq($branch)->fi() ->beginIF($beginTime)->andWhere('t1.begin')->ge($beginTime)->fi() ->beginIF($endTime)->andWhere('t1.end')->le($endTime)->fi() @@ -95,6 +97,10 @@ class testtaskModel extends model ->andWhere('t1.product')->eq((int)$productID) ->markRight(1) ->fi() + ->beginIF($scopeAndStatus[1] == 'review') + ->andWhere("FIND_IN_SET('{$this->app->user->account}', t1.reviewers)") + ->andWhere('t1.reviewStatus')->eq('doing') + ->fi() ->orderBy($orderBy) ->page($pager) ->fetchAll('id'); diff --git a/module/testtask/view/browse.html.php b/module/testtask/view/browse.html.php index 8b6cee92ab..0a636ab293 100644 --- a/module/testtask/view/browse.html.php +++ b/module/testtask/view/browse.html.php @@ -34,6 +34,7 @@ $status = $this->session->testTaskVersionStatus; ?> + testtask->featureBar['browse'] as $key => $label):?> $label", '', "id='{$key}Tab' class='btn btn-link'");?> diff --git a/module/upgrade/config.php b/module/upgrade/config.php index 9b79b1efbd..38f4ac22d8 100644 --- a/module/upgrade/config.php +++ b/module/upgrade/config.php @@ -370,3 +370,56 @@ $config->delete['17_2'][] = 'extension/lite/extension/lite/workflowrule/ext/view $config->upgrade->openModules = array('action', 'admin', 'api', 'automation', 'backup', 'block', 'branch', 'budget', 'bug', 'build', 'caselib', 'ci', 'client', 'common', 'company', 'compile', 'convert', 'cron', 'custom', 'datatable', 'dept', 'design', 'dev', 'doc', 'durationestimation', 'entry', 'execution', 'extension', 'file', 'git', 'gitlab', 'group', 'holiday', 'im', 'index', 'index.html', 'install', 'issue', 'jenkins', 'job', 'kanban', 'license', 'mail', 'message', 'misc', 'mr', 'my', 'personnel', 'pipeline', 'product', 'productplan', 'productset', 'program', 'programplan', 'project', 'projectbuild', 'projectrelease', 'projectstory', 'qa', 'release', 'repo', 'report', 'risk', 'score', 'search', 'setting', 'sonarqube', 'sso', 'stage', 'stakeholder', 'story', 'subject', 'svn', 'task', 'testcase', 'testreport', 'testsuite', 'testtask', 'todo', 'tree', 'tutorial', 'upgrade', 'user', 'webhook', 'weekly', 'workestimation', 'gitea'); $config->upgrade->unsetModules = array('design', 'program', 'programplan', 'projectbuild', 'projectrelease', 'stage', 'stakeholder', 'product', 'branch', 'productplan', 'release', 'build', 'qa', 'bug', 'testcase', 'testtask', 'testreport', 'testsuite', 'caselib', 'automation', 'repo', 'ci', 'compile', 'jenkins', 'job', 'svn', 'gitlab', 'sonarqube', 'mr', 'git', 'report', 'sqlbuilder', 'feedback', 'faq', 'attend', 'holiday', 'leave', 'makeup', 'overtime', 'lieu', 'ops', 'host', 'serverroom', 'account', 'domain', 'service', 'deploy', 'conference', 'traincourse', 'pssp', 'baseline', 'classify', 'cm', 'cmcl', 'auditcl', 'reviewcl', 'process', 'activity', 'zoutput', 'auditplan', 'nc', 'subject', 'weekly', 'workestimation', 'issue', 'durationestimation', 'risk', 'opportunity', 'trainplan', 'gapanalysis', 'researchplan', 'researchreport', 'meeting', 'meetingroom', 'budget', 'reviewissue', 'reviewsetting', 'review', 'milestone', 'measurement', 'measrecord', 'assetlib', 'setting', 'im', 'client', 'ldap', 'dev', 'api', 'gitea'); + +global $lang; +$config->upgrade->defaultActions = array(); +$config->upgrade->defaultActions['type'] = 'single'; +$config->upgrade->defaultActions['extensionType'] = 'none'; +$config->upgrade->defaultActions['batchMode'] = 'different'; +$config->upgrade->defaultActions['layout'] = 'normal'; +$config->upgrade->defaultActions['show'] = 'direct'; +$config->upgrade->defaultActions['order'] = 0; +$config->upgrade->defaultActions['buildin'] = 1; +$config->upgrade->defaultActions['role'] = 'buildin'; +$config->upgrade->defaultActions['virtual'] = 0; +$config->upgrade->defaultActions['status'] = 'enable'; +$config->upgrade->defaultActions['vision'] = 'rnd'; + +$config->upgrade->recoveryActions = new stdclass(); +$config->upgrade->recoveryActions->feedback = new stdclass(); +$config->upgrade->recoveryActions->feedback->review = array(); +$config->upgrade->recoveryActions->feedback->review['action'] = 'review'; +$config->upgrade->recoveryActions->feedback->review['module'] = 'feedback'; +$config->upgrade->recoveryActions->feedback->review['name'] = $lang->upgrade->recoveryActions->review; +$config->upgrade->recoveryActions->feedback->review['method'] = 'operate'; +$config->upgrade->recoveryActions->feedback->review['open'] = 'modal'; +$config->upgrade->recoveryActions->feedback->review['position'] = 'browseandview'; +$config->upgrade->recoveryActions->feedback->review['hasLite'] = true; + +$config->upgrade->recoveryActions->task = new stdclass(); +$config->upgrade->recoveryActions->task->review = array(); +$config->upgrade->recoveryActions->task->review['action'] = 'cancel'; +$config->upgrade->recoveryActions->task->review['module'] = 'task'; +$config->upgrade->recoveryActions->task->review['name'] = $lang->upgrade->recoveryActions->cancel; +$config->upgrade->recoveryActions->task->review['method'] = 'operate'; +$config->upgrade->recoveryActions->task->review['open'] = 'modal'; +$config->upgrade->recoveryActions->task->review['position'] = 'view'; +$config->upgrade->recoveryActions->task->review['hasLite'] = true; + +$config->upgrade->recoveryActions->story = new stdclass(); +$config->upgrade->recoveryActions->story->review = array(); +$config->upgrade->recoveryActions->story->review['action'] = 'review'; +$config->upgrade->recoveryActions->story->review['module'] = 'story'; +$config->upgrade->recoveryActions->story->review['name'] = $lang->upgrade->recoveryActions->review; +$config->upgrade->recoveryActions->story->review['method'] = 'operate'; +$config->upgrade->recoveryActions->story->review['open'] = 'normal'; +$config->upgrade->recoveryActions->story->review['position'] = 'browseandview'; + +$config->upgrade->recoveryActions->testcase = new stdclass(); +$config->upgrade->recoveryActions->testcase->review = array(); +$config->upgrade->recoveryActions->testcase->review['action'] = 'review'; +$config->upgrade->recoveryActions->testcase->review['module'] = 'testcase'; +$config->upgrade->recoveryActions->testcase->review['name'] = $lang->upgrade->recoveryActions->review; +$config->upgrade->recoveryActions->testcase->review['method'] = 'operate'; +$config->upgrade->recoveryActions->testcase->review['open'] = 'normal'; +$config->upgrade->recoveryActions->testcase->review['position'] = 'browseandview'; diff --git a/module/upgrade/lang/de.php b/module/upgrade/lang/de.php index 95d0e128e0..d3c660ca0a 100644 --- a/module/upgrade/lang/de.php +++ b/module/upgrade/lang/de.php @@ -156,3 +156,7 @@ $lang->upgrade->createExecutionTip = <<
|---|