Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms into sprint/224_tianshujie_63687
This commit is contained in:
@@ -120,7 +120,7 @@ class productEntry extends Entry
|
||||
if(isset($data->result) and $data->result == 'fail') return $this->sendError(400, $data->message);
|
||||
|
||||
$product = $this->product->getByID($productID);
|
||||
$this->send(200, $this->format($product, 'createdDate:time'));
|
||||
$this->send(200, $this->format($product, 'createdDate:time,whitelist:userList,createdBy:user,PO:user,RD:user,QD:user'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1182,11 +1182,14 @@ CREATE TABLE `zt_im_chat` (
|
||||
`ownedBy` varchar(30) NOT NULL DEFAULT '',
|
||||
`editedBy` varchar(30) NOT NULL DEFAULT '',
|
||||
`editedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
`mergedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
`lastActiveTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
`lastMessage` int(11) unsigned NOT NULL DEFAULT '0',
|
||||
`lastMessageIndex` int(11) unsigned NOT NULL DEFAULT 0,
|
||||
`dismissDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
`pinnedMessages` text NOT NULL,
|
||||
`mergedChats` text NOT NULL DEFAULT '',
|
||||
`adminInvite` enum('0','1') NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `gid` (`gid`),
|
||||
KEY `name` (`name`),
|
||||
|
||||
+37
-13
@@ -14,16 +14,6 @@ ALTER TABLE `zt_testtask` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
ALTER TABLE `zt_build` ADD `createdBy` varchar(30) NOT NULL AFTER `desc`;
|
||||
ALTER TABLE `zt_build` 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'),
|
||||
('build', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 15, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
|
||||
('build', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 16, 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');
|
||||
|
||||
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackType' ORDER BY `id` DESC LIMIT 1) WHERE `module`='feedback' AND `field`='type';
|
||||
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackSolution' ORDER BY `id` DESC LIMIT 1) WHERE `module`='feedback' AND `field`='solution';
|
||||
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackclosedReason' ORDER BY `id` DESC LIMIT 1), `control`='select' WHERE `module`='feedback' AND `field`='closedReason';
|
||||
@@ -32,8 +22,42 @@ UPDATE `zt_project` SET `closedDate`='' AND `closedBy`='' WHERE `status` != 'clo
|
||||
|
||||
UPDATE `zt_grouppriv` SET `method`='exportTemplate' WHERE `method` = 'exportTemplet';
|
||||
|
||||
INSERT IGNORE INTO `zt_workflowaction` (`module`, `action`, `method`, `name`, `type`, `batchMode`, `extensionType`, `open`, `position`, `layout`, `show`, `buildin`, `role`, `createdBy`, `createdDate`) VALUES
|
||||
('bug', 'batchactivate', 'batchoperate', '批量激活', 'batch', 'different', 'none', 'normal', 'browse', 'normal', 'direct', '1', 'buildin', '', '2022-08-09 15:52');
|
||||
|
||||
INSERT INTO `zt_grouppriv` (SELECT `group`,`module`,'reply' FROM `zt_grouppriv` WHERE `module` = 'feedback' AND `method` = 'comment');
|
||||
INSERT INTO `zt_grouppriv` (SELECT `group`,`module`,'ask' FROM `zt_grouppriv` WHERE `module` = 'feedback' AND `method` = 'comment');
|
||||
|
||||
CREATE TABLE `zt_chart` (
|
||||
`id` mediumint NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`type` varchar(30) NOT NULL,
|
||||
`dataset` varchar(30) NOT NULL,
|
||||
`desc` mediumtext NOT NULL,
|
||||
`settings` mediumtext NOT NULL,
|
||||
`filters` mediumtext NOT NULL,
|
||||
`createdBy` char(30) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
`deleted` tinyint NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
CREATE TABLE `zt_dashboard` (
|
||||
`id` mediumint(8) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`module` mediumint NOT NULL,
|
||||
`desc` mediumtext NOT NULL,
|
||||
`layout` mediumtext NOT NULL,
|
||||
`filters` mediumtext NOT NULL,
|
||||
`createdBy` varchar(30) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
`deleted` tinyint NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
CREATE TABLE `zt_dataset` (
|
||||
`id` mediumint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(155) NOT NULL,
|
||||
`sql` text NOT NULL,
|
||||
`fields` mediumtext NOT NULL,
|
||||
`objects` mediumtext NOT NULL,
|
||||
`createdBy` varchar(30) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
`deleted` tinyint NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
@@ -424,6 +424,20 @@ CREATE TABLE IF NOT EXISTS `zt_cfd` (
|
||||
`date` date NOT NULL,
|
||||
UNIQUE KEY `execution_type_name_date` (`execution`,`type`,`name`,`date`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_chart`;
|
||||
CREATE TABLE `zt_chart` (
|
||||
`id` mediumint NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`type` varchar(30) NOT NULL,
|
||||
`dataset` varchar(30) NOT NULL,
|
||||
`desc` mediumtext NOT NULL,
|
||||
`settings` mediumtext NOT NULL,
|
||||
`filters` mediumtext NOT NULL,
|
||||
`createdBy` char(30) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
`deleted` tinyint NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_company`;
|
||||
CREATE TABLE IF NOT EXISTS `zt_company` (
|
||||
`id` mediumint(8) unsigned NOT NULL auto_increment,
|
||||
@@ -486,6 +500,31 @@ CREATE TABLE IF NOT EXISTS `zt_cron` (
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `lastTime` (`lastTime`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_dashboard`;
|
||||
CREATE TABLE `zt_dashboard` (
|
||||
`id` mediumint(8) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`module` mediumint NOT NULL,
|
||||
`desc` mediumtext NOT NULL,
|
||||
`layout` mediumtext NOT NULL,
|
||||
`filters` mediumtext NOT NULL,
|
||||
`createdBy` varchar(30) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
`deleted` tinyint NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_dataset`;
|
||||
CREATE TABLE `zt_dataset` (
|
||||
`id` mediumint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(155) NOT NULL,
|
||||
`sql` text NOT NULL,
|
||||
`fields` mediumtext NOT NULL,
|
||||
`objects` mediumtext NOT NULL,
|
||||
`createdBy` varchar(30) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
`deleted` tinyint NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_dept`;
|
||||
CREATE TABLE IF NOT EXISTS `zt_dept` (
|
||||
`id` mediumint(8) unsigned NOT NULL auto_increment,
|
||||
|
||||
@@ -76,11 +76,17 @@
|
||||
35939 密码难度规则优化
|
||||
企业版:
|
||||
6130 甘特图支持拖拽设置任务的起止日期
|
||||
7742 反馈模块动作设计增加回复和追问动作
|
||||
8252 动作界面只读字段设置默认值,创建的时候写入到数据库
|
||||
9004 数据校验取消校验按钮交互优化
|
||||
33993 甘特图样式优化
|
||||
34482 新增反馈编辑他人反馈的权限
|
||||
35082 执行甘特图,增加任务顺序的拖动排序功能
|
||||
35857 反馈列表转用户需求icon更换
|
||||
35933 执行甘特图的持续天数改成工期
|
||||
35236 在执行需求列表的搜索条件中可以搜索工作流的需求流程中新增的字段
|
||||
35699 bug模块动作设计增加批量激活的动作
|
||||
35802 工作流自定义流程,保存成功的提示交互优化
|
||||
旗舰版:
|
||||
35836 项目问题列表中优先级字段居中显示
|
||||
35837 项目问题列表“优先级”字段修改为“P”
|
||||
@@ -104,6 +110,24 @@
|
||||
35217 复制项目,阶段信息确认页面增加阶段选择弹窗
|
||||
35218 复制项目的交互样式优化
|
||||
35310 复制项目增加团队成员与权限复制
|
||||
36036 关闭审批后停用发起动作,再次开启审批未自动启用动作
|
||||
禅道客户端:
|
||||
34119 一键包集成喧喧网页端
|
||||
34460 优化会话中禅道链接卡片的跳转交互
|
||||
34667 完善XXD命令行应用给出的提示
|
||||
34668 修改docker入口脚本,确保owt中的rabbitmq正常启动
|
||||
34669 服务器地址不正确导致客户端登录失败后,尝试去掉路径后进行重试
|
||||
34670 完善音视频服务器端口配置和提示
|
||||
34671 优化音视频服务配置中“是否启用HTTPS”的设置
|
||||
34672 设计并增加离线部署SRS音视频的方案
|
||||
34673 没有麦克风时允许加入会议
|
||||
34848 解决服务器时间和客户端时间不一样的问题
|
||||
35087 研究喧喧和其他应用系统的多页面集成
|
||||
35088 删除服务器聊天记录的功能
|
||||
35268 通过服务端下载客户端后,登录时带入服务端地址
|
||||
35280 实现自动清理解散90天以上群数据的功能
|
||||
35294 后台检查XXC是否有新版时去掉XXB的版本判断
|
||||
35297 网络诊断时给出具体提示以引导用户
|
||||
修复的Bug
|
||||
22662 执行任务列表父子任务显示错乱
|
||||
24608 英文下批量编辑执行页面执行状态名称显示不全
|
||||
@@ -113,6 +137,19 @@
|
||||
25837 产品-计划的需求列表没有展示需求标题颜色
|
||||
25851 导入任务相关研发需求详情弹窗中样式问题
|
||||
25282 导入用户时,左右滚动条必须拖动到底部才显示
|
||||
25019 需要测试再进行详细确认:xxd以windows服务的形式启动(注意是在windows管理的服务里面点击启动),日志会存在C:\Windows\System32\log下
|
||||
25273 禅道卡片中的弹窗不展示
|
||||
25390 一张图片发送多人再撤回其中一张图,在其他窗口中图片显示已撤回
|
||||
25402 sendChatMessage返回值有问题
|
||||
25427 提示升级页面不显示了
|
||||
25526 后台没有被禁用的用户登录客户端时提示“账号被禁用”
|
||||
25603 喧喧一键安装包安装xxd错误
|
||||
25605 独立消息记录窗口中链接打不开
|
||||
25622 连续发送消息不给提示
|
||||
25628 客户端链接转任务跳转到地盘
|
||||
25630 消息记录点击两次喧喧直接崩溃了
|
||||
25644 产品计划卡片没显示内容
|
||||
25646 禅道客户端一、口、x遮挡成员按钮
|
||||
|
||||
2022-07-27 17.4
|
||||
完成的需求
|
||||
@@ -206,6 +243,11 @@
|
||||
34795 项目甘特图可以在阶段或任务前增加图标显示状态
|
||||
34742 项目甘特图中没有起止日期的任务的时间显示为所属阶段时间
|
||||
34729 QA质量保证计划可以批量编辑
|
||||
35424 产品计划增加审批设置
|
||||
35437 内置模块显示审批进度。
|
||||
35438 内置模块增加待我审批标签
|
||||
35596 产品发布增加审批设置
|
||||
35597 测试单增加审批设置
|
||||
禅道客户端:
|
||||
34124 XXD可以从XXB主动拉取配置
|
||||
34123 喧喧增加禅道的checktable.php以便自动修复数据库
|
||||
|
||||
@@ -198,11 +198,11 @@ $lang->admin->menu->dev['menuOrder'][20] = 'entry';
|
||||
|
||||
$lang->admin->menu->system['subMenu'] = new stdclass();
|
||||
$lang->admin->menu->system['subMenu']->backup = array('link' => "{$lang->backup->common}|backup|index");
|
||||
$lang->admin->menu->system['subMenu']->trash = array('link' => "{$lang->action->trash}|action|trash");
|
||||
$lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->security|admin|safe", 'alias' => 'checkweak');
|
||||
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
|
||||
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
|
||||
$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
|
||||
$lang->admin->menu->system['subMenu']->trash = array('link' => "{$lang->action->trash}|action|trash");
|
||||
|
||||
if($config->visions == ',lite,' and $config->edition != 'open') $lang->admin->menu->system['subMenu']->license = array('link' => "授权信息|admin|license'", 'alias' => 'license');
|
||||
if($config->visions != ',lite,') unset($lang->admin->menu->system['subMenu']->buildIndex);
|
||||
|
||||
@@ -551,7 +551,7 @@ $lang->resource->task->recordEstimate = 'recordEstimateAction';
|
||||
$lang->resource->task->editEstimate = 'editEstimate';
|
||||
$lang->resource->task->deleteEstimate = 'deleteEstimate';
|
||||
$lang->resource->task->report = 'reportChart';
|
||||
if($config->edition != 'open') $lang->resource->task->exportTemplet = 'exportTemplet';
|
||||
if($config->edition != 'open') $lang->resource->task->exportTemplate = 'exportTemplate';
|
||||
if($config->edition != 'open') $lang->resource->task->import = 'import';
|
||||
|
||||
$lang->task->methodOrder[5] = 'create';
|
||||
@@ -577,7 +577,7 @@ $lang->task->methodOrder[100] = 'editEstimate';
|
||||
$lang->task->methodOrder[105] = 'deleteEstimate';
|
||||
$lang->task->methodOrder[110] = 'report';
|
||||
$lang->task->methodOrder[115] = 'batchChangeModule';
|
||||
$lang->task->methodOrder[120] = 'exportTemplet';
|
||||
$lang->task->methodOrder[120] = 'exportTemplate';
|
||||
$lang->task->methodOrder[125] = 'import';
|
||||
|
||||
/* Doc. */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
$config->story->list->exportFields = '
|
||||
$config->story->exportFields = '
|
||||
id, module, title, spec, keywords,
|
||||
pri, estimate, status,
|
||||
openedBy, openedDate, assignedTo, assignedDate, mailto,
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php if($config->visions == ',lite,'):?>
|
||||
<?php $feedbackDatasources = $this->dao->select('id')->from(TABLE_WORKFLOWDATASOURCE)->where('code')->like('litefeedback%')->andWhere('vision')->eq('lite')->fetchPairs('id', 'id');?>
|
||||
<?php if($feedbackDatasources):?>
|
||||
<script>
|
||||
<?php foreach($feedbackDatasources as $id):?>
|
||||
$('#fieldOptionType option[value=<?php echo $id;?>]').remove();
|
||||
<?php endforeach;?>
|
||||
$('#fieldOptionType').trigger("chosen:updated");
|
||||
</script>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
@@ -245,10 +245,6 @@ $lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <st
|
||||
$lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove stories <strong>$extra</strong> from plan.' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
|
||||
|
||||
/* Used to describe the historical operation records of gantt. */
|
||||
$lang->action->desc->ganttdrag = '$date, <strong>$actor</strong> tasks dragged <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->ganttmove = '$date, <strong>$actor</strong> tasks sorted <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to display dynamic information. */
|
||||
$lang->action->label = new stdclass();
|
||||
$lang->action->label->install = 'install ';
|
||||
@@ -386,7 +382,6 @@ $lang->action->label->unlinkstory = 'unlink stories from';
|
||||
$lang->action->label->unlinkbug = 'unlink bugs from';
|
||||
$lang->action->label->tolib = 'imported';
|
||||
$lang->action->label->updatetolib = 'updated';
|
||||
$lang->action->label->ganttdrag = 'dragged';
|
||||
$lang->action->label->ganttmove = 'sorted';
|
||||
|
||||
/* Dynamic information is grouped by object. */
|
||||
@@ -545,6 +540,7 @@ $lang->action->dynamicAction->task['undeleted'] = 'Restore Task';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Hide Task';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = 'Create Build';
|
||||
$lang->action->dynamicAction->build['edited'] = 'Edit Build';
|
||||
|
||||
@@ -245,10 +245,6 @@ $lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <st
|
||||
$lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove stories <strong>$extra</strong> from plan.' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
|
||||
|
||||
/* Used to describe the historical operation records of gantt. */
|
||||
$lang->action->desc->ganttdrag = '$date, <strong>$actor</strong> tasks dragged <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->ganttmove = '$date, <strong>$actor</strong> tasks sorted <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to display dynamic information. */
|
||||
$lang->action->label = new stdclass();
|
||||
$lang->action->label->install = 'install ';
|
||||
@@ -386,7 +382,6 @@ $lang->action->label->unlinkstory = 'unlink stories from';
|
||||
$lang->action->label->unlinkbug = 'unlink bugs from';
|
||||
$lang->action->label->tolib = 'imported';
|
||||
$lang->action->label->updatetolib = 'updated';
|
||||
$lang->action->label->ganttdrag = 'dragged';
|
||||
$lang->action->label->ganttmove = 'sorted';
|
||||
|
||||
/* Dynamic information is grouped by object. */
|
||||
@@ -545,6 +540,7 @@ $lang->action->dynamicAction->task['undeleted'] = 'Restore Task';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Hide Task';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = 'Create Build';
|
||||
$lang->action->dynamicAction->build['edited'] = 'Edit Build';
|
||||
|
||||
@@ -245,10 +245,6 @@ $lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <st
|
||||
$lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove stories <strong>$extra</strong> from plan.' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
|
||||
|
||||
/* Used to describe the historical operation records of gantt. */
|
||||
$lang->action->desc->ganttdrag = '$date, <strong>$actor</strong> tasks dragged <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->ganttmove = '$date, <strong>$actor</strong> tasks sorted <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to display dynamic information. */
|
||||
$lang->action->label = new stdclass();
|
||||
$lang->action->label->install = 'install ';
|
||||
@@ -386,7 +382,6 @@ $lang->action->label->unlinkstory = 'unlink stories from';
|
||||
$lang->action->label->unlinkbug = 'unlink bugs from';
|
||||
$lang->action->label->tolib = 'Importé';
|
||||
$lang->action->label->updatetolib = 'MàJ';
|
||||
$lang->action->label->ganttdrag = 'dragged';
|
||||
$lang->action->label->ganttmove = 'sorted';
|
||||
|
||||
/* Dynamic information is grouped by object. */
|
||||
@@ -545,6 +540,7 @@ $lang->action->dynamicAction->task['undeleted'] = 'Restaurer Tâche';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Masquer Tâche';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'Committer SVN';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'Committer GIT';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = 'Créer Build';
|
||||
$lang->action->dynamicAction->build['edited'] = 'Editer Build';
|
||||
|
||||
@@ -245,10 +245,6 @@ $lang->action->desc->linkbug = '$date, 由 <strong>$actor</strong> 关联BUG
|
||||
$lang->action->desc->unlinkstory = '$date, 由 <strong>$actor</strong> 从计划移除需求 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, 由 <strong>$actor</strong> 从计划移除BUG <strong>$extra</strong>。' . "\n";
|
||||
|
||||
/* 用来描述gantt chat相关操作记录。 */
|
||||
$lang->action->desc->ganttdrag = '$date, 由 <strong>$actor</strong> 拖动了任务 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->ganttmove = '$date, 由 <strong>$actor</strong> 排序了任务 <strong>$extra</strong>。' . "\n";
|
||||
|
||||
/* 用来显示动态信息。*/
|
||||
$lang->action->label = new stdclass();
|
||||
$lang->action->label->install = '安装';
|
||||
@@ -386,7 +382,6 @@ $lang->action->label->unlinkstory = '移除需求从';
|
||||
$lang->action->label->unlinkbug = '移除BUG从';
|
||||
$lang->action->label->tolib = '导入了';
|
||||
$lang->action->label->updatetolib = '更新了';
|
||||
$lang->action->label->ganttdrag = '拖动了';
|
||||
$lang->action->label->ganttmove = '排序了';
|
||||
|
||||
/* 动态信息按照对象分组 */
|
||||
@@ -545,6 +540,7 @@ $lang->action->dynamicAction->task['undeleted'] = '还原任务';
|
||||
$lang->action->dynamicAction->task['hidden'] = '隐藏任务';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN提交';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT提交';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = '排序';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = '创建版本';
|
||||
$lang->action->dynamicAction->build['edited'] = '编辑版本';
|
||||
|
||||
+16
-20
@@ -104,7 +104,7 @@ class actionModel extends model
|
||||
*
|
||||
* @param int $actionID
|
||||
* @access public
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getUnreadActions($actionID = 0)
|
||||
{
|
||||
@@ -707,6 +707,7 @@ class actionModel extends model
|
||||
*/
|
||||
public function getTrashesBySearch($objectType, $type, $queryID, $orderBy, $pager = null)
|
||||
{
|
||||
if($objectType == 'all') return array();
|
||||
if($queryID and $queryID != 'myQueryID')
|
||||
{
|
||||
$query = $this->loadModel('search')->getQuery($queryID);
|
||||
@@ -989,39 +990,43 @@ class actionModel extends model
|
||||
if($projectID == 'all') $authedProjects = (empty($aclViews) or (!empty($aclViews) and !empty($aclViews['project']))) ? $this->app->user->view->projects : '0';
|
||||
if($executionID == 'all') $authedExecutions = (empty($aclViews) or (!empty($aclViews) and !empty($aclViews['execution']))) ? $this->app->user->view->sprints : '0';
|
||||
|
||||
if(empty($authedProducts)) $authedProducts = '0';
|
||||
|
||||
if($productID == 'all' and $projectID == 'all')
|
||||
{
|
||||
$productCondition = '';
|
||||
foreach(explode(',', $authedProducts) as $product) $productCondition = empty($productCondition) ? "product LIKE '%,$product,%'" : "$productCondition OR product LIKE '%,$product,%'";
|
||||
foreach(explode(',', $authedProducts) as $product) $productCondition = empty($productCondition) ? "(execution = '0' and project = '0' and (product LIKE '%,$product,%'" : "$productCondition OR product LIKE '%,$product,%'";
|
||||
$productCondition .= '))';
|
||||
|
||||
$projectCondition = "project " . helper::dbIN($authedProjects);
|
||||
$executionCondition = isset($authedExecutions) ? "execution " . helper::dbIN($authedExecutions) : '';
|
||||
$projectCondition = "(execution = '0' and project != '0' and project " . helper::dbIN($authedProjects) . ')';
|
||||
$executionCondition = isset($authedExecutions) ? "(execution != 0 and execution " . helper::dbIN($authedExecutions) . ')' : '';
|
||||
}
|
||||
elseif($productID == 'all' and is_numeric($projectID))
|
||||
{
|
||||
$products = $this->loadModel('product')->getProductPairsByProject($projectID);
|
||||
$executions = $this->loadModel('execution')->getPairs($projectID);
|
||||
$executions = $this->loadModel('execution')->getPairs($projectID) + array(0 => 0);
|
||||
|
||||
$authedExecutions = isset($authedExecutions) ? array_intersect(array_keys($executions), explode(',', $authedExecutions)) : array_keys($executions);
|
||||
|
||||
$productCondition = '';
|
||||
foreach(array_keys($products) as $product) $productCondition = empty($productCondition) ? "product LIKE '%,$product,%'" : "$productCondition OR product LIKE '%,$product,%'";
|
||||
foreach(array_keys($products) as $product) $productCondition = empty($productCondition) ? "(execution = '0' and project = '0' and (product LIKE '%,$product,%'" : "$productCondition OR product LIKE '%,$product,%'";
|
||||
$productCondition .= '))';
|
||||
|
||||
$projectCondition = "project = $projectID";
|
||||
$executionCondition = "execution " . helper::dbIN($authedExecutions);
|
||||
$projectCondition = "(execution = '0' and project = '$projectID')";
|
||||
$executionCondition = "(execution != '0' and execution " . helper::dbIN($authedExecutions) . ')';
|
||||
}
|
||||
elseif(is_numeric($productID) and $projectID == 'all')
|
||||
{
|
||||
$this->loadModel('product');
|
||||
$projects = $this->product->getProjectPairsByProduct($productID);
|
||||
$executions = $this->product->getExecutionPairsByProduct($productID);
|
||||
$executions = $this->product->getExecutionPairsByProduct($productID) + array(0 => 0);
|
||||
|
||||
$authedProjects = array_intersect(array_keys($projects), explode(',', $authedProjects));
|
||||
$authedExecutions = isset($authedExecutions) ? array_intersect(array_keys($executions), explode(',', $authedExecutions)) : array_keys($executions);
|
||||
|
||||
$productCondition = "product like '%,$productID,%'";
|
||||
$projectCondition = 'project ' . helper::dbIN($authedProjects);
|
||||
$executionCondition = 'execution ' . helper::dbIN($authedExecutions);
|
||||
$projectCondition = "(execution = '0' and project != '0' and project " . helper::dbIN($authedProjects) . ')';
|
||||
$executionCondition = "(execution != '0' and execution " . helper::dbIN($authedExecutions) . ')';
|
||||
}
|
||||
|
||||
$condition = "((product =',0,' or product = '0' or product=',,') AND project = '0' AND execution = '0')";
|
||||
@@ -1222,17 +1227,8 @@ class actionModel extends model
|
||||
$relatedProjects = $relatedData['relatedProjects'];
|
||||
$requirements = $relatedData['requirements'];
|
||||
|
||||
$aclViews = isset($this->app->user->rights['acls']['views']) ? $this->app->user->rights['acls']['views'] : array();
|
||||
$authedProjects = (empty($aclViews) or (!empty($aclViews) and !empty($aclViews['project']))) ? ",{$this->app->user->view->projects}," : '';
|
||||
$authedExecutions = (empty($aclViews) or (!empty($aclViews) and !empty($aclViews['execution']))) ? ",{$this->app->user->view->sprints},": '';
|
||||
|
||||
foreach($actions as $i => $action)
|
||||
{
|
||||
if(($action->execution != '0' and strpos($authedExecutions, ",$action->execution,") === false) or ($action->execution == '0' and $action->project != '0' and strpos($authedProjects, ",$action->project,") === false))
|
||||
{
|
||||
unset($actions[$i]);
|
||||
continue;
|
||||
}
|
||||
/* Add name field to the actions. */
|
||||
$action->objectName = isset($objectNames[$action->objectType][$action->objectID]) ? $objectNames[$action->objectType][$action->objectID] : '';
|
||||
|
||||
|
||||
@@ -373,4 +373,84 @@ class admin extends control
|
||||
$this->view->title = $this->lang->admin->resetPWDSetting;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show table engine.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function tableEngine()
|
||||
{
|
||||
$this->view->title = $this->lang->admin->tableEngine;
|
||||
$this->view->tableEngines = $this->loadModel('misc')->getTableEngines();
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax change table engine.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxChangeTableEngine($tableName)
|
||||
{
|
||||
$response = array();
|
||||
$response['result'] = 'success';
|
||||
$response['message'] = '';
|
||||
|
||||
$tableEngines = $this->loadModel('misc')->getTableEngines();
|
||||
if(!isset($tableEngines[$tableName]))
|
||||
{
|
||||
$response['result'] = 'fail';
|
||||
return print(json_encode($response));
|
||||
}
|
||||
|
||||
if($tableEngines[$tableName] == 'InnoDB')
|
||||
{
|
||||
$response['message'] = sprintf($this->lang->admin->changeSuccess, $tableName);
|
||||
return print(json_encode($response));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
/* Check process this table or not. */
|
||||
$dbProcesses = $this->dao->query("SHOW PROCESSLIST")->fetchAll();
|
||||
foreach($dbProcesses as $dbProcess)
|
||||
{
|
||||
if($dbProcess->db != $this->config->db->name) continue;
|
||||
if(strpos($dbProcess->Info, " {$tableName} ") !== false)
|
||||
{
|
||||
$response['message'] = sprintf($this->lang->upgrade->changingTable, $tableName);
|
||||
return print(json_encode($response));
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(PDOException $e){}
|
||||
|
||||
if(stripos($tableName, 'searchindex') !== false)
|
||||
{
|
||||
$mysqlVersion = $this->loadModel('install')->getMysqlVersion();
|
||||
if($mysqlVersion < 5.6)
|
||||
{
|
||||
$response['result'] = 'fail';
|
||||
$response['message'] = $this->lang->admin->errorInnodb;
|
||||
return print(json_encode($response));
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$sql = "ALTER TABLE `$tableName` ENGINE='InnoDB'";
|
||||
$this->dao->exec($sql);
|
||||
$response['message'] = sprintf($this->lang->admin->changeSuccess, $tableName);
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
$response['result'] = 'fail';
|
||||
$response['message'] = sprintf($this->lang->admin->changeFail, $tableName, htmlspecialchars($e->getMessage()));
|
||||
}
|
||||
|
||||
return print(json_encode($response));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ $lang->admin->captcha = 'Bestätigungscode';
|
||||
$lang->admin->getCaptcha = 'Bestätigungscode anfordern';
|
||||
$lang->admin->register = 'Register';
|
||||
$lang->admin->resetPWDSetting = 'Reset password Setting';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->admin->api = 'API';
|
||||
$lang->admin->log = 'Log';
|
||||
@@ -29,6 +30,15 @@ $lang->admin->setting = 'Einstellungen';
|
||||
$lang->admin->days = 'Gültige Tage';
|
||||
$lang->admin->resetPWDByMail = 'Reset the password via the email';
|
||||
|
||||
$lang->admin->changeEngine = "Change to InnoDB";
|
||||
$lang->admin->changingTable = 'Replacing data table %s engine...';
|
||||
$lang->admin->changeSuccess = 'The data table %s engine has been changed to InnoDB.';
|
||||
$lang->admin->changeFail = "Failed to replace table %s engine. Reason: <span class='text-red'>%s</span>。";
|
||||
$lang->admin->errorInnodb = 'Your MySQL does not support InnoDB data table engine.';
|
||||
$lang->admin->engineInfo = "The <strong>%s</strong> table engine is <strong>%s</strong>.";
|
||||
$lang->admin->engineSummary['hasMyISAM'] = "There are %s tables that are not InnoDB engines";
|
||||
$lang->admin->engineSummary['allInnoDB'] = "All tables are InnoDB engines";
|
||||
|
||||
$lang->admin->info = new stdclass();
|
||||
$lang->admin->info->version = 'Aktuelle Version ist %s. ';
|
||||
$lang->admin->info->links = 'You can visit links below';
|
||||
|
||||
@@ -22,6 +22,7 @@ $lang->admin->captcha = 'Verification Code';
|
||||
$lang->admin->getCaptcha = 'Send Verification Code';
|
||||
$lang->admin->register = 'Register';
|
||||
$lang->admin->resetPWDSetting = 'Reset password Setting';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->admin->api = 'API';
|
||||
$lang->admin->log = 'Log';
|
||||
@@ -29,6 +30,15 @@ $lang->admin->setting = 'Setting';
|
||||
$lang->admin->days = 'Valid Day';
|
||||
$lang->admin->resetPWDByMail = 'Reset the password via the email';
|
||||
|
||||
$lang->admin->changeEngine = "Change to InnoDB";
|
||||
$lang->admin->changingTable = 'Replacing data table %s engine...';
|
||||
$lang->admin->changeSuccess = 'The data table %s engine has been changed to InnoDB.';
|
||||
$lang->admin->changeFail = "Failed to replace table %s engine. Reason: <span class='text-red'>%s</span>。";
|
||||
$lang->admin->errorInnodb = 'Your MySQL does not support InnoDB data table engine.';
|
||||
$lang->admin->engineInfo = "The <strong>%s</strong> table engine is <strong>%s</strong>.";
|
||||
$lang->admin->engineSummary['hasMyISAM'] = "There are %s tables that are not InnoDB engines";
|
||||
$lang->admin->engineSummary['allInnoDB'] = "All tables are InnoDB engines";
|
||||
|
||||
$lang->admin->info = new stdclass();
|
||||
$lang->admin->info->version = 'Current Version is %s. ';
|
||||
$lang->admin->info->links = 'You can visit links below';
|
||||
|
||||
@@ -22,6 +22,7 @@ $lang->admin->captcha = 'Code de vérification';
|
||||
$lang->admin->getCaptcha = 'Obtenir le Code de vérification';
|
||||
$lang->admin->register = 'Register';
|
||||
$lang->admin->resetPWDSetting = 'Reset password Setting';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->admin->api = 'API';
|
||||
$lang->admin->log = 'Log';
|
||||
@@ -29,6 +30,15 @@ $lang->admin->setting = 'Paramétrage';
|
||||
$lang->admin->days = 'Durée de conservation';
|
||||
$lang->admin->resetPWDByMail = 'Reset the password via the email';
|
||||
|
||||
$lang->admin->changeEngine = "Change to InnoDB";
|
||||
$lang->admin->changingTable = 'Replacing data table %s engine...';
|
||||
$lang->admin->changeSuccess = 'The data table %s engine has been changed to InnoDB.';
|
||||
$lang->admin->changeFail = "Failed to replace table %s engine. Reason: <span class='text-red'>%s</span>。";
|
||||
$lang->admin->errorInnodb = 'Your MySQL does not support InnoDB data table engine.';
|
||||
$lang->admin->engineInfo = "The <strong>%s</strong> table engine is <strong>%s</strong>.";
|
||||
$lang->admin->engineSummary['hasMyISAM'] = "There are %s tables that are not InnoDB engines";
|
||||
$lang->admin->engineSummary['allInnoDB'] = "All tables are InnoDB engines";
|
||||
|
||||
$lang->admin->info = new stdclass();
|
||||
$lang->admin->info->version = 'La version actuelle est %s customisée. ';
|
||||
$lang->admin->info->links = 'Vous pouvez visiter les liens ci-dessous';
|
||||
|
||||
@@ -22,6 +22,7 @@ $lang->admin->captcha = '验证码';
|
||||
$lang->admin->getCaptcha = '获取验证码';
|
||||
$lang->admin->register = '登记';
|
||||
$lang->admin->resetPWDSetting = '重置密码设置';
|
||||
$lang->admin->tableEngine = '表引擎';
|
||||
|
||||
$lang->admin->api = '接口';
|
||||
$lang->admin->log = '日志';
|
||||
@@ -29,6 +30,15 @@ $lang->admin->setting = '设置';
|
||||
$lang->admin->days = '日志保存天数';
|
||||
$lang->admin->resetPWDByMail = '通过邮箱重置密码';
|
||||
|
||||
$lang->admin->changeEngine = "更换到InnoDB";
|
||||
$lang->admin->changingTable = '正在更换数据表%s引擎...';
|
||||
$lang->admin->changeSuccess = '已经更换数据表%s引擎为InnoDB。';
|
||||
$lang->admin->changeFail = "更换数据表%s引擎失败,原因:<span class='text-red'>%s</span>。";
|
||||
$lang->admin->errorInnodb = '您当前的数据库不支持使用InnoDB数据表引擎。';
|
||||
$lang->admin->engineInfo = "表<strong>%s</strong>的引擎是<strong>%s</strong>。";
|
||||
$lang->admin->engineSummary['hasMyISAM'] = "有%s个表不是InnoDB引擎";
|
||||
$lang->admin->engineSummary['allInnoDB'] = "所有的表都是InnoDB引擎了";
|
||||
|
||||
$lang->admin->info = new stdclass();
|
||||
$lang->admin->info->version = '当前系统的版本是%s,';
|
||||
$lang->admin->info->links = '您可以访问以下链接:';
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
/**
|
||||
* The tableEngine view file of admin module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package admin
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='main-header'>
|
||||
<?php
|
||||
$MyISAMCount = 0;
|
||||
$engineListHtml = '';
|
||||
foreach($tableEngines as $tableName => $engine)
|
||||
{
|
||||
if($engine != 'InnoDB') $MyISAMCount ++;
|
||||
$engineListHtml .= "<li data-table='$tableName'>" . sprintf($lang->admin->engineInfo, $tableName, $engine) . "</li>\n";
|
||||
}
|
||||
?>
|
||||
<h2>
|
||||
<?php if($MyISAMCount > 0):?>
|
||||
<?php printf($lang->admin->engineSummary['hasMyISAM'], $MyISAMCount);?>
|
||||
<?php echo html::a('###', $lang->admin->changeEngine, '', "class='btn btn-sm changeEngine btn-primary' onclick='changeAllEngines()'");?>
|
||||
<?php else:?>
|
||||
<?php print($lang->admin->engineSummary['allInnoDB']);?>
|
||||
<?php endif;?>
|
||||
</h2>
|
||||
</div>
|
||||
<div>
|
||||
<ul id='engineBox'><?php echo $engineListHtml?></ul>
|
||||
</div>
|
||||
</div>
|
||||
<?php js::set('changingTable', $lang->admin->changingTable);?>
|
||||
<script>
|
||||
/**
|
||||
* Change all table engines.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function changeAllEngines()
|
||||
{
|
||||
var tables = [];
|
||||
var $engineBox = $('#engineBox');
|
||||
$engineBox.find('li').each(function()
|
||||
{
|
||||
tables.push($(this).attr('data-table'));
|
||||
});
|
||||
|
||||
$('.btn.changeEngine').hide();
|
||||
$engineBox.empty();
|
||||
$.each(tables, function(_, table)
|
||||
{
|
||||
changeEngine(table);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Change one engine.
|
||||
*
|
||||
* @param string $table
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function changeEngine(table)
|
||||
{
|
||||
var $engineBox = $('#engineBox');
|
||||
var link = createLink('admin', 'ajaxChangeTableEngine', 'table=' + table);
|
||||
|
||||
if($engineBox.find('[data-table=' + table + ']').length == 0) $engineBox.append("<div data-table='" + table + "'>" + changingTable.replace('%s', table) + "</div>");
|
||||
$.ajax(
|
||||
{
|
||||
type: "GET",
|
||||
url: link,
|
||||
success: function(response)
|
||||
{
|
||||
response = JSON.parse(response);
|
||||
$engineBox.find('[data-table=' + table + ']').html(response.message).addClass('text-success');
|
||||
},
|
||||
error: function()
|
||||
{
|
||||
changeEngine(table);
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
@@ -254,6 +254,8 @@ class blockModel extends model
|
||||
*/
|
||||
public function initBlock($module, $type = '')
|
||||
{
|
||||
if(empty($module)) return;
|
||||
|
||||
$flow = isset($this->config->global->flow) ? $this->config->global->flow : 'full';
|
||||
$account = $this->app->user->account;
|
||||
$vision = $this->config->vision;
|
||||
@@ -507,7 +509,7 @@ class blockModel extends model
|
||||
$this->app->loadLang('project');
|
||||
$params = new stdclass();
|
||||
$params->type['name'] = $this->lang->block->type;
|
||||
$params->type['options'] = $this->lang->project->featureBar;
|
||||
$params->type['options'] = $this->lang->project->featureBar['browse'];
|
||||
$params->type['control'] = 'select';
|
||||
|
||||
$params->orderBy['name'] = $this->lang->block->orderBy;
|
||||
@@ -969,11 +971,10 @@ class blockModel extends model
|
||||
/**
|
||||
* Get project dynamic params.
|
||||
*
|
||||
* @param string $module
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getProjectDynamicParams($module = '')
|
||||
public function getProjectDynamicParams()
|
||||
{
|
||||
$params = $this->appendCountParams();
|
||||
|
||||
|
||||
@@ -303,12 +303,13 @@ $config->bug->datatable->fieldList['openedBuild']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBuild']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['openedBuild']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBuild']['control'] = 'multiple';
|
||||
$config->bug->datatable->fieldList['openedBuild']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'openedBuild&id,name');
|
||||
$config->bug->datatable->fieldList['openedBuild']['dataSource'] = array('module' => 'build', 'method' =>'getBuildPairs', 'params' => '$productID&$branch&noempty,noterminate,nodone,withbranch');
|
||||
|
||||
$config->bug->datatable->fieldList['assignedTo']['title'] = 'assignedToAB';
|
||||
$config->bug->datatable->fieldList['assignedTo']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['assignedTo']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['assignedTo']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['assignedTo']['dataSource'] = array('module' => 'bug', 'method' =>'getProductMemberPairs', 'params' => '$productID&$branch');
|
||||
|
||||
$config->bug->datatable->fieldList['assignedDate']['title'] = 'assignedDate';
|
||||
$config->bug->datatable->fieldList['assignedDate']['fixed'] = 'no';
|
||||
|
||||
@@ -3607,8 +3607,7 @@ class bugModel extends model
|
||||
if($table) $relatedObjects = $this->dao->select($pairs)->from($table)->where('id')->in($relatedObjectIdList)->fetchPairs();
|
||||
|
||||
if(in_array($object, array('build','resolvedBuild'))) $relatedObjects= array('trunk' => $this->lang->trunk) + $relatedObjects;
|
||||
|
||||
return $relatedObjects;
|
||||
return array('' => '', 0 => '') + $relatedObjects;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -288,11 +288,12 @@ $lang->devops->rules = 'Rule';
|
||||
$lang->devops->settings = 'Setting Merge Request';
|
||||
$lang->devops->set = 'Set';
|
||||
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->convert->importJira = 'Import Jira';
|
||||
|
||||
|
||||
@@ -288,11 +288,12 @@ $lang->devops->rules = 'Rule';
|
||||
$lang->devops->settings = 'Setting Merge Request';
|
||||
$lang->devops->set = 'Set';
|
||||
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->convert->importJira = 'Import Jira';
|
||||
|
||||
|
||||
@@ -288,11 +288,12 @@ $lang->devops->rules = 'Rule';
|
||||
$lang->devops->settings = 'Setting Merge Request';
|
||||
$lang->devops->set = 'Set';
|
||||
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->system = 'System';
|
||||
$lang->admin->entry = 'Application';
|
||||
$lang->admin->data = 'Data';
|
||||
$lang->admin->cron = 'Cron';
|
||||
$lang->admin->buildIndex = 'Full Text Search';
|
||||
$lang->admin->tableEngine = 'Table Engine';
|
||||
|
||||
$lang->convert->importJira = 'Import Jira';
|
||||
|
||||
|
||||
@@ -568,6 +568,7 @@ $lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->sec
|
||||
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
|
||||
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
|
||||
$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
|
||||
$lang->admin->menu->system['subMenu']->tableEngine = array('link' => "{$lang->admin->tableEngine}|admin|tableengine|");
|
||||
if(version_compare(phpversion(), 5.6) > 0) $lang->admin->menu->system['subMenu']->convertJira = array('link' => "{$lang->convert->importJira}|convert|convertjira|", 'subModule' => 'convert');
|
||||
|
||||
$lang->admin->dividerMenu = ',company,message,system,';
|
||||
|
||||
@@ -288,11 +288,12 @@ $lang->devops->rules = '指令';
|
||||
$lang->devops->settings = '合并请求设置';
|
||||
$lang->devops->set = '设置';
|
||||
|
||||
$lang->admin->system = '系统';
|
||||
$lang->admin->entry = '应用';
|
||||
$lang->admin->data = '数据';
|
||||
$lang->admin->cron = '定时';
|
||||
$lang->admin->buildIndex = '重建索引';
|
||||
$lang->admin->system = '系统';
|
||||
$lang->admin->entry = '应用';
|
||||
$lang->admin->data = '数据';
|
||||
$lang->admin->cron = '定时';
|
||||
$lang->admin->buildIndex = '重建索引';
|
||||
$lang->admin->tableEngine = '表引擎';
|
||||
|
||||
$lang->convert->importJira = '导入Jira数据';
|
||||
|
||||
|
||||
@@ -154,6 +154,7 @@ $lang->doc->allCollections = 'All Collections';
|
||||
$lang->doc->keywordsTips = 'Please use commas to separate multiple keywords.';
|
||||
$lang->doc->sortLibs = 'Sort Libs';
|
||||
$lang->doc->titlePlaceholder = 'Please enter the title';
|
||||
$lang->doc->confirm = 'Confirm';
|
||||
|
||||
global $config;
|
||||
/* Query condition list. */
|
||||
|
||||
@@ -154,6 +154,7 @@ $lang->doc->allCollections = 'All Collections';
|
||||
$lang->doc->keywordsTips = 'Please use commas to separate keywords.';
|
||||
$lang->doc->sortLibs = 'Sort Libs';
|
||||
$lang->doc->titlePlaceholder = 'Please enter the title';
|
||||
$lang->doc->confirm = 'Confirm';
|
||||
|
||||
global $config;
|
||||
/* Query condition list. */
|
||||
|
||||
@@ -154,6 +154,7 @@ $lang->doc->allCollections = 'All Collections';
|
||||
$lang->doc->keywordsTips = 'Please use commas to separate multiple keywords.';
|
||||
$lang->doc->sortLibs = 'Sort Libs';
|
||||
$lang->doc->titlePlaceholder = 'Veuillez saisir le titre';
|
||||
$lang->doc->confirm = 'Confirm';
|
||||
|
||||
global $config;
|
||||
/* Query condition list. */
|
||||
|
||||
@@ -154,6 +154,7 @@ $lang->doc->allCollections = '查看全部收藏文档';
|
||||
$lang->doc->keywordsTips = '多个关键字请用逗号分隔。';
|
||||
$lang->doc->sortLibs = '文档库排序';
|
||||
$lang->doc->titlePlaceholder = '请输入标题';
|
||||
$lang->doc->confirm = '确认';
|
||||
|
||||
global $config;
|
||||
/* 查询条件列表 */
|
||||
|
||||
@@ -46,12 +46,7 @@
|
||||
|
||||
#noticeAcl {margin-left: 10px; vertical-align: middle;}
|
||||
|
||||
#moreList {display: inline-block; padding: 7px;}
|
||||
#moreList .icon-more-circle {font-size: 20px;}
|
||||
#moreList ul.dropdown-menu {left: -77px;}
|
||||
|
||||
#backBtn {border: unset;}
|
||||
#backBtn i {font-size: 20px;}
|
||||
#basicInfoLink {border: unset;}
|
||||
|
||||
.modal-title {font-size: 14px !important; font-weight: 700 !important;}
|
||||
</style>
|
||||
@@ -64,16 +59,11 @@
|
||||
<table class='table table-form'>
|
||||
<tbody>
|
||||
<tr id='headerBox'>
|
||||
<td width='50px'><?php echo html::linkButton("<i class='icon icon-back-circle'></i>", $backLink, 'self', "id='backBtn'");?></td>
|
||||
<td width='90px'><?php echo html::a($backLink, '<i class="icon icon-back icon-sm"></i> ' . $lang->goback, '', "class='btn btn-secondary' id='backBtn'");?></td>
|
||||
<td class="doc-title" colspan='3'><?php echo html::input('title', '', "placeholder='{$lang->doc->titlePlaceholder}' class='form-control' required");?></td>
|
||||
<td class="text-right">
|
||||
<?php echo html::submitButton('', "data-placement='bottom'", 'btn btn-primary');?>
|
||||
<div id="moreList" class="dropdown dropdown-hover">
|
||||
<?php echo html::a('#', "<i class='icon icon-more-circle'></i>");?>
|
||||
<ul class="dropdown-menu">
|
||||
<li><?php echo html::a('#modalBasicInfo', $lang->doc->basicInfo, '', "data-toggle='modal' id='basicInfoLink'");?><li>
|
||||
</ul>
|
||||
</div>
|
||||
<?php echo html::a('#modalBasicInfo', "<i class='icon icon-cog-outline'></i> " . $lang->settings, '', "data-toggle='modal' id='basicInfoLink' class='btn'");?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -154,7 +144,7 @@
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->close, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->doc->confirm, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
|
||||
@@ -49,12 +49,7 @@
|
||||
|
||||
#noticeAcl {margin-left: 10px; vertical-align: middle;}
|
||||
|
||||
#moreList {display: inline-block; padding: 7px;}
|
||||
#moreList .icon-more-circle {font-size: 20px;}
|
||||
#moreList ul.dropdown-menu {left: -77px;}
|
||||
|
||||
#backBtn {border: unset;}
|
||||
#backBtn i {font-size: 20px;}
|
||||
#basicInfoLink {border: unset;}
|
||||
|
||||
.modal-title {font-size: 14px !important; font-weight: 700 !important;}
|
||||
</style>
|
||||
@@ -64,20 +59,11 @@
|
||||
<table class='table table-form'>
|
||||
<tbody>
|
||||
<tr id='headerBox'>
|
||||
<?php if($from == 'create'):?>
|
||||
<td width='50px'><?php echo html::linkButton("<i class='icon icon-back-circle'></i>", $backLink, 'self', "id='backBtn'");?></td>
|
||||
<?php else:?>
|
||||
<td width='50px'><?php echo html::backButton("<i class='icon icon-back-circle'></i>", "id='backBtn'", '');?></td>
|
||||
<?php endif;?>
|
||||
<td width='90px'><?php echo html::backButton("<i class='icon icon-back icon-sm'></i> " . $lang->goback, "id='backBtn'", 'btn btn-secondary');?></td>
|
||||
<td class="doc-title" colspan='3'><?php echo html::input('title', $doc->title, "placeholder='{$lang->doc->titlePlaceholder}' class='form-control' required");?></td>
|
||||
<td class="text-right">
|
||||
<?php echo html::submitButton('', "data-placement='bottom'", 'btn btn-primary');?>
|
||||
<div id="moreList" class="dropdown dropdown-hover">
|
||||
<?php echo html::a('#', "<i class='icon icon-more-circle'></i>");?>
|
||||
<ul class="dropdown-menu">
|
||||
<li><?php echo html::a('#modalBasicInfo', $lang->doc->basicInfo, '', "data-toggle='modal' id='basicInfoLink'");?><li>
|
||||
</ul>
|
||||
</div>
|
||||
<?php echo html::a('#modalBasicInfo', "<i class='icon icon-cog-outline'></i> " . $lang->settings, '', "data-toggle='modal' id='basicInfoLink' class='btn'");?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -155,7 +141,7 @@
|
||||
</tr>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->close, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->doc->confirm, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
.table-children {border-left: 2px solid #cbd0db; border-right: 2px solid #cbd0db;}
|
||||
.table tbody > tr.table-children.table-child-top {border-top: 2px solid #cbd0db;}
|
||||
.table tbody > tr.table-children.table-child-bottom {border-bottom: 2px solid #cbd0db;}
|
||||
.table td.has-child > a:not(.task-toggle) {max-width: 90%; max-width: calc(100% - 30px); display: inline-block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
.table td.has-child > a:not(.task-toggle) {max-width: 90%; max-width: calc(100% - 30px); display: inline-block; overflow: hidden; white-space: nowrap;}
|
||||
.table td.has-child > .task-toggle {color: #838a9d; position: relative; top: 1px; line-height: 16px;}
|
||||
.table td.has-child > .task-toggle:hover {color: #006af1; cursor: pointer;}
|
||||
.table td.has-child > .task-toggle > .icon {font-size: 16px; display: inline-block; transition: transform .2s; -ms-transform: rotate(-90deg); -moz-transform: rotate(-90deg); -o-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); transform: rotate(-90deg);}
|
||||
|
||||
@@ -100,7 +100,7 @@ class executionModel extends model
|
||||
include $this->app->getModulePath('', 'execution') . 'lang/' . $this->app->getClientLang() . '.php';
|
||||
}
|
||||
|
||||
if(isset($execution->cal) and $execution->acl != 'private') unset($this->lang->execution->menu->settings['subMenu']->whitelist);
|
||||
if(isset($execution->acl) and $execution->acl != 'private') unset($this->lang->execution->menu->settings['subMenu']->whitelist);
|
||||
|
||||
if($execution and $execution->lifetime == 'ops')
|
||||
{
|
||||
@@ -396,7 +396,7 @@ class executionModel extends model
|
||||
$this->dao->insert(TABLE_EXECUTION)->data($sprint)
|
||||
->autoCheck($skipFields = 'begin,end')
|
||||
->batchcheck($this->config->execution->create->requiredFields, 'notempty')
|
||||
->checkIF((!empty($sprint->name) and $this->config->systemMode == 'new'), 'name', 'unique', "`type` in ('sprint','stage', 'kanban') and `project` = $sprintProject and `deleted` = '0'")
|
||||
->checkIF(!empty($sprint->name), 'name', 'unique', "`type` in ('sprint','stage', 'kanban') and `project` = $sprintProject and `deleted` = '0'")
|
||||
->checkIF(!empty($sprint->code), 'code', 'unique', "`type` in ('sprint','stage', 'kanban') and `deleted` = '0'")
|
||||
->checkIF($sprint->begin != '', 'begin', 'date')
|
||||
->checkIF($sprint->end != '', 'end', 'date')
|
||||
@@ -551,7 +551,7 @@ class executionModel extends model
|
||||
->checkIF($execution->begin != '', 'begin', 'date')
|
||||
->checkIF($execution->end != '', 'end', 'date')
|
||||
->checkIF($execution->end != '', 'end', 'ge', $execution->begin)
|
||||
->checkIF((!empty($execution->name) and $this->config->systemMode == 'new'), 'name', 'unique', "id != $executionID and type in ('sprint','stage', 'kanban') and `project` = $executionProject and `deleted` = '0'")
|
||||
->checkIF(!empty($execution->name), 'name', 'unique', "id != $executionID and type in ('sprint','stage', 'kanban') and `project` = $executionProject and `deleted` = '0'")
|
||||
->checkIF(!empty($execution->code), 'code', 'unique', "id != $executionID and type in ('sprint','stage', 'kanban') and `deleted` = '0'")
|
||||
->checkFlow()
|
||||
->where('id')->eq($executionID)
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<small><?php echo $lang->arrow . ' ' . $lang->execution->edit;?></small>
|
||||
</h2>
|
||||
</div>
|
||||
<?php echo html::hidden('project', $project->id);?>
|
||||
<?php if($config->systemMode == 'new') echo html::hidden('project', $project->id);?>
|
||||
<form class='load-indicator main-form form-ajax' method='post' target='hiddenwin' id='dataform'>
|
||||
<table class='table table-form'>
|
||||
<?php if($config->systemMode == 'new' and isset($project)):?>
|
||||
|
||||
@@ -114,7 +114,6 @@
|
||||
data: postData,
|
||||
success: function(data)
|
||||
{
|
||||
console.log(data['title']);
|
||||
$('#fileTitle' + fileID).html("<i class='icon icon-file-text'></i> " + data['title']);
|
||||
$('#renameFile' + fileID).closest('li').removeClass('hidden');
|
||||
$('#renameBox' + fileID).addClass('hidden');
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
.group-item {display: block; width: 100px; float: left; margin-bottom: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: default;}
|
||||
.group-item .checkbox-primary>input {cursor: pointer;}
|
||||
.group-item .checkbox-primary > input {cursor: pointer;}
|
||||
.group-item .checkbox-primary > label {width: 100px; text-overflow: ellipsis; white-space: nowrap; overflow: hidden;}
|
||||
.table th {vertical-align: top;}
|
||||
.main-table tbody>tr>td {border-bottom: 0px;}
|
||||
.main-table tbody > tr > td {border-bottom: 0px;}
|
||||
|
||||
@@ -1632,6 +1632,7 @@ $lang->resource->admin->sso = 'ssoAction';
|
||||
$lang->resource->admin->register = 'register';
|
||||
$lang->resource->admin->ztCompany = 'ztCompany';
|
||||
$lang->resource->admin->resetPWDSetting = 'resetPWDSetting';
|
||||
$lang->resource->admin->tableEngine = 'tableEngine';
|
||||
|
||||
$lang->admin->methodOrder[0] = 'index';
|
||||
$lang->admin->methodOrder[5] = 'checkDB';
|
||||
@@ -1641,6 +1642,7 @@ $lang->admin->methodOrder[20] = 'sso';
|
||||
$lang->admin->methodOrder[25] = 'register';
|
||||
$lang->admin->methodOrder[30] = 'ztCompany';
|
||||
$lang->admin->methodOrder[35] = 'resetPWDSetting';
|
||||
$lang->admin->methodOrder[40] = 'tableEngine';
|
||||
|
||||
/* Extension. */
|
||||
$lang->resource->extension = new stdclass();
|
||||
|
||||
@@ -464,7 +464,6 @@
|
||||
|
||||
if(!notTriggerEvent) app.$app.trigger('reloadapp', app);
|
||||
|
||||
if(url) $(iframe.contentWindow.document.body).hide(); // Code for task #59703.
|
||||
if(!isSameUrl) app.$app.addClass('loading');
|
||||
if(app._loadTimer) clearTimeout(app._loadTimer);
|
||||
app._loadTimer = setTimeout(function()
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
<?php $spaceDescTitle = empty($space->desc) ? $lang->kanban->emptyDesc : str_replace("\n", '', strip_tags($space->desc));?>
|
||||
<?php $pattern = '/<br[^>]*>|<img[^>]*>/';?>
|
||||
<?php $spaceDesc = empty($space->desc) ? $lang->kanban->emptyDesc : preg_replace($pattern, '', $space->desc);?>
|
||||
<p><div><span class="text-limit hidden" data-limit-size="20"><?php echo $spaceDesc;?></span><a class="text-primary text-limit-toggle small" data-text-expand="<?php echo $lang->expand;?>" data-text-collapse="<?php echo $lang->collapse;?>"></a></div></p>
|
||||
<p><div><span class="text-limit hidden" data-limit-size="120"><?php echo $spaceDesc;?></span><a class="text-primary text-limit-toggle small" data-text-expand="<?php echo $lang->expand;?>" data-text-collapse="<?php echo $lang->collapse;?>"></a></div></p>
|
||||
</div>
|
||||
<div class='spaceActions pull-right'>
|
||||
<?php $class = $space->status == 'closed' ? 'disabled' : '';?>
|
||||
|
||||
@@ -187,7 +187,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['17.5'][] = array('title' => "Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Optimize gantt chart, the copy project of max version can copy the task and more information. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.5'][] = array('title' => "Provide efficient visual statistical tools. Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.4'][] = array('title' => "Optimization of details Page visualization and jumping page logic. Improvement of Kanban function. Optimization of document creating and editing pages. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.3'][] = array('title' => "UI optimization of the modules such as statistics and background, the use case library will synchronize the function optimization information. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.2'][] = array('title' => "Adjust the display of agile project block; optimize the UI of programs, projects and tests; optimize the detailed experience. Fix bugs.", 'desc' => '');
|
||||
|
||||
@@ -187,7 +187,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['17.5'][] = array('title' => "Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Optimize gantt chart, the copy project of max version can copy the task and more information. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.5'][] = array('title' => "Provide efficient visual statistical tools. Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.4'][] = array('title' => "Optimization of details Page visualization and jumping page logic. Improvement of Kanban function. Optimization of document creating and editing pages. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.3'][] = array('title' => "UI optimization of the modules such as statistics and background, the use case library will synchronize the function optimization information. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.2'][] = array('title' => "Adjust the display of agile project block; optimize the UI of programs, projects and tests; optimize the detailed experience. Fix bugs.", 'desc' => '');
|
||||
|
||||
@@ -187,7 +187,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['17.5'][] = array('title' => "Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Optimize gantt chart, the copy project of max version can copy the task and more information. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.5'][] = array('title' => "Provide efficient visual statistical tools. Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.4'][] = array('title' => "Optimization of details Page visualization and jumping page logic. Improvement of Kanban function. Optimization of document creating and editing pages. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.3'][] = array('title' => "UI optimization of the modules such as statistics and background, the use case library will synchronize the function optimization information. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.2'][] = array('title' => "Adjust the display of agile project block; optimize the UI of programs, projects and tests; optimize the detailed experience. Fix bugs.", 'desc' => '');
|
||||
|
||||
@@ -187,7 +187,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['17.5'][] = array('title' => '优化禅道性能,数据库引擎从MyISAM调整为InnoDB。甘特图优化升级,旗舰版的复制项目可以复制任务等更多信息。修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['17.5'][] = array('title' => '提供高效的可视化统计工具。优化禅道性能,数据库引擎从MyISAM调整为InnoDB。甘特图优化升级,旗舰版的复制项目可以复制任务等更多信息。修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['17.4'][] = array('title' => '详情页面的视觉优化和部分页面跳转逻辑优化。看板功能完善。文档创建和编辑页面优化。修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['17.3'][] = array('title' => '统计、后台等模块的UI优化,用例库同步用例信息功能优化。修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['17.2'][] = array('title' => '调整敏捷项目区块的展示,项目集、项目和测试相关UI优化,细节体验优化。修复Bug。', 'desc' => '');
|
||||
|
||||
@@ -143,4 +143,19 @@ class miscModel extends model
|
||||
|
||||
return $weakSites;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get table and engine pairs.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getTableEngines()
|
||||
{
|
||||
$tableEngines = array();
|
||||
$stmt = $this->dao->query("SHOW TABLE STATUS WHERE `Engine` is not null");
|
||||
while($table = $stmt->fetch()) $tableEngines[$table->Name] = $table->Engine;
|
||||
|
||||
return $tableEngines;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@ class mr extends control
|
||||
$giteaUsers = $this->gitea->getGiteaListByAccount();
|
||||
foreach($hosts as $hostID => $host)
|
||||
{
|
||||
if($host->type == 'gitLab' and isset($gitlabUsers[$hostID])) continue;
|
||||
if($host->type == 'gitlab' and isset($gitlabUsers[$hostID])) continue;
|
||||
if($host->type == 'gitea' and isset($giteaUsers[$hostID])) continue;
|
||||
|
||||
unset($hosts[$hostID]);
|
||||
@@ -186,10 +186,10 @@ class mr extends control
|
||||
if(!$this->app->user->admin and $scm == 'gitlab')
|
||||
{
|
||||
$groupIDList = array(0 => 0);
|
||||
$groups = $this->scm->apiGetGroups($MR->hostID, 'name_asc', 'developer');
|
||||
$groups = $this->$scm->apiGetGroups($MR->hostID, 'name_asc', 'developer');
|
||||
foreach($groups as $group) $groupIDList[] = $group->id;
|
||||
$sourceProject = $this->scm->apiGetSingleProject($MR->hostID, $MR->sourceProject);
|
||||
$isDeveloper = $this->scm->checkUserAccess($MR->hostID, 0, $sourceProject, $groupIDList, 'developer');
|
||||
$sourceProject = $this->$scm->apiGetSingleProject($MR->hostID, $MR->sourceProject);
|
||||
$isDeveloper = $this->$scm->checkUserAccess($MR->hostID, 0, $sourceProject, $groupIDList, 'developer');
|
||||
|
||||
if(!isset($gitUsers[$this->app->user->account]) or !$isDeveloper) return print(js::alert($this->lang->mr->errorLang[3]) . js::locate($this->createLink('mr', 'browse')));
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ td.delayed {background: #e84e0f !important; color: white;}
|
||||
.table-children {border-left: 2px solid #cbd0db; border-right: 2px solid #cbd0db;}
|
||||
.table tbody > tr.table-children.table-child-top {border-top: 2px solid #cbd0db;}
|
||||
.table tbody > tr.table-children.table-child-bottom {border-bottom: 2px solid #cbd0db;}
|
||||
.table td.has-child > a:not(.task-toggle) {max-width: 90%; max-width: calc(100% - 30px); display: inline-block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
.table td.has-child > a:not(.task-toggle) {max-width: 90%; max-width: calc(100% - 30px); display: inline-block; overflow: hidden; white-space: nowrap;}
|
||||
.table td.has-child > .task-toggle {color: #838a9d; position: relative; top: 1px; line-height: 16px;}
|
||||
.table td.has-child > .task-toggle:hover {color: #006af1; cursor: pointer;}
|
||||
.table td.has-child > .task-toggle > .icon {font-size: 16px; display: inline-block; transition: transform .2s; -ms-transform: rotate(-90deg); -moz-transform: rotate(-90deg); -o-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); transform: rotate(-90deg);}
|
||||
|
||||
@@ -15,9 +15,12 @@ $config->port->initFunction = 'title,control,required,';
|
||||
$config->port->dateFeilds = 'estStarted,realStarted,deadline,openedDate,assignedDate,finishedDate,canceledDate,closedDate,lastEditedDate,';
|
||||
$config->port->datetimeFeilds = '';
|
||||
$config->port->listFields = '';
|
||||
$config->port->sysLangFields = ',pri,status,type,mode,severity,os,browser,resolution,confirmed,source,reviewResult,stage,change';
|
||||
$config->port->sysLangFields = ',pri,status,type,mode,severity,os,browser,resolution,confirmed,source,reviewResult,stage,change,category';
|
||||
$config->port->sysDataFields = 'execution,product,user';
|
||||
$config->port->userFields = 'assignedTo,openedBy,finishedBy,canceledBy,closedBy,lastEditedBy,lastRunner,resolvedBy';
|
||||
$config->port->userFields = 'assignedTo,openedBy,finishedBy,canceledBy,closedBy,lastEditedBy,lastRunner,resolvedBy,reviewedBy';
|
||||
|
||||
$config->port->defaultZeroField = 'severity,pri';
|
||||
$config->port->defaultEmptyField = '';
|
||||
|
||||
$config->port->import = new stdClass();
|
||||
|
||||
|
||||
+13
-9
@@ -104,13 +104,11 @@ class port extends control
|
||||
$file = $this->loadModel('file')->getUpload('file');
|
||||
$file = $file[0];
|
||||
$shortName = $this->file->getSaveName($file['pathname']);
|
||||
if(empty($shortName))
|
||||
{
|
||||
die(js::alert($this->lang->excel->emptyFileName));
|
||||
}
|
||||
$extension = $file['extension'];
|
||||
|
||||
$fileName = $this->file->savePath . $shortName;
|
||||
if(empty($shortName)) die(js::alert($this->lang->excel->emptyFileName));
|
||||
|
||||
$extension = $file['extension'];
|
||||
$fileName = $this->file->savePath . $shortName;
|
||||
|
||||
move_uploaded_file($file['tmpname'], $fileName);
|
||||
|
||||
@@ -146,9 +144,13 @@ class port extends control
|
||||
{
|
||||
$filter = '';
|
||||
if($model == 'task') $filter = 'estimate';
|
||||
if($model == 'story')
|
||||
{
|
||||
if($this->session->storyType) $this->loadModel('story')->replaceUserRequirementLang();
|
||||
}
|
||||
|
||||
$this->loadModel($model);
|
||||
$importFields = $this->config->$model->templateFields;
|
||||
$importFields = !empty($_SESSION[$model . 'TemplateFields']) ? $_SESSION[$model . 'TemplateFields'] : $this->config->$model->templateFields;
|
||||
$fields = $this->port->initFieldList($model, $importFields, false);
|
||||
$formatDatas = $this->port->format($model, $filter);
|
||||
$datas = $this->port->getPageDatas($formatDatas, $pagerID);
|
||||
@@ -184,9 +186,11 @@ class port extends control
|
||||
$fieldList = $this->port->initFieldList($model, $fields, false);
|
||||
|
||||
if(empty($fieldList[$field]['values'])) $fieldList[$field]['values'] = array();
|
||||
if(!isset($fieldList[$field]['values'][''])) $fieldList[$field]['values'][''] = '';
|
||||
|
||||
$multiple = $fieldList[$field]['control'] == 'multiple' ? 'multiple' : '';
|
||||
|
||||
return print(html::select($field . "[$index]", $fieldList[$field]['values'], $value, "class='form-control picker-select' $multiple"));
|
||||
$name = $field . "[$index]";
|
||||
if($multiple == 'multiple') $name .= "[]";
|
||||
return print(html::select($name, $fieldList[$field]['values'], $value, "class='form-control picker-select' data-field='$field' data-index='$index' $multiple"));
|
||||
}
|
||||
}
|
||||
|
||||
+54
-80
@@ -212,6 +212,7 @@ class portModel extends model
|
||||
*/
|
||||
public function initPostFields($model = '')
|
||||
{
|
||||
$this->commonActions($model);
|
||||
$datas = fixer::input('post')->get();
|
||||
$objectData = array();
|
||||
foreach ($datas as $field => $data)
|
||||
@@ -220,7 +221,7 @@ class portModel extends model
|
||||
{
|
||||
foreach($data as $key => $value)
|
||||
{
|
||||
if(is_array($value) and array_key_exists($field, $this->config->$model->fieldList) and $this->config->$model->fieldList[$field]['control'] == 'multiple') $value = implode(',', $value);
|
||||
if(is_array($value)) $value = join(',', $value);
|
||||
$objectData[$key][$field] = $value;
|
||||
}
|
||||
}
|
||||
@@ -258,7 +259,7 @@ class portModel extends model
|
||||
foreach ($portFieldList as $portField => $value)
|
||||
{
|
||||
$funcName = 'init' . ucfirst($portField);
|
||||
if((!array_key_exists($portField, $modelFieldList)) or $portField == 'title')
|
||||
if((!isset($modelFieldList[$portField])) or $portField == 'title')
|
||||
{
|
||||
$modelFieldList[$portField] = $this->portConfig->fieldList[$portField];
|
||||
if(strpos($this->portConfig->initFunction, $portField) !== false) $modelFieldList[$portField] = $this->$funcName($model, $field);
|
||||
@@ -268,7 +269,6 @@ class portModel extends model
|
||||
$modelFieldList['values'] = $this->initValues($model, $field, $modelFieldList, $withKey);
|
||||
$fieldList[$field] = $modelFieldList;
|
||||
}
|
||||
|
||||
return $fieldList;
|
||||
}
|
||||
|
||||
@@ -287,15 +287,15 @@ class portModel extends model
|
||||
$this->commonActions($model);
|
||||
|
||||
if(!empty($this->modelConfig->fieldList[$field]['title'])) return $this->modelLang->{$this->modelConfig->fieldList[$field]['title']};
|
||||
if(array_key_exists($field, $this->lang->$model))
|
||||
if(isset($this->lang->$model->$field))
|
||||
{
|
||||
$title = $this->lang->$model->$field;
|
||||
}
|
||||
elseif(array_key_exists(($field . 'AB'), $this->lang->$model))
|
||||
elseif(isset($this->lang->$model->{$field . 'AB'}))
|
||||
{
|
||||
$title = $this->lang->$model->{$field . 'AB'};
|
||||
}
|
||||
elseif(array_key_exists($field, $this->lang->port->reservedWord))
|
||||
elseif(isset($this->lang->port->reservedWord[$field]))
|
||||
{
|
||||
$title = $this->lang->port->reservedWord[$field];
|
||||
}
|
||||
@@ -313,7 +313,10 @@ class portModel extends model
|
||||
*/
|
||||
public function initControl($model, $field)
|
||||
{
|
||||
if(isset($this->modelLang->{$field.'List'})) return 'select';
|
||||
if(isset($this->modelFieldList[$field]['control'])) return $this->modelFieldList[$field]['control'];
|
||||
if(isset($this->modelLang->{$field.'List'})) return 'select';
|
||||
if(isset($this->modelFieldList[$field]['dataSource'])) return 'select';
|
||||
|
||||
if(strpos($this->portConfig->sysDataFields, $field) !== false) return 'select';
|
||||
return $this->portConfig->fieldList['control'];
|
||||
}
|
||||
@@ -399,58 +402,12 @@ class portModel extends model
|
||||
$dataList = array();
|
||||
|
||||
$sysDataFields = explode(',', $this->portConfig->sysDataFields);
|
||||
foreach($sysDataFields as $field)
|
||||
{
|
||||
$dataList[$field] = $this->loadModel($field)->getPairs();
|
||||
}
|
||||
|
||||
foreach($sysDataFields as $field) $dataList[$field] = $this->loadModel($field)->getPairs();
|
||||
|
||||
return $dataList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Init tmpFile.
|
||||
*
|
||||
* @param int $created
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function initTmpFile($created = true)
|
||||
{
|
||||
$taskLang = $this->lang->task;
|
||||
$file = $this->session->fileImportFileName;
|
||||
$tmpPath = $this->loadModel('file')->getPathOfImportedFile();
|
||||
$tmpFile = $tmpPath . DS . md5(basename($file));
|
||||
|
||||
if(file_exists($tmpFile)) return $tmpFile;
|
||||
|
||||
$rows = $this->file->getRowsFromExcel($file);
|
||||
|
||||
/* Check empty.*/
|
||||
if(is_string($rows))
|
||||
{
|
||||
if(file_exists($this->session->fileImportFileName)) unlink($this->session->fileImportFileName);
|
||||
unset($_SESSION['fileImportFileName']);
|
||||
unset($_SESSION['fileImportExtension']);
|
||||
$response['result'] = 'fail';
|
||||
$response['message'] = $rows;
|
||||
return $response;
|
||||
}
|
||||
|
||||
$fields = $this->config->task->templateFields;
|
||||
array_unshift($fields, 'id');
|
||||
|
||||
foreach($fields as $key => $fieldName)
|
||||
{
|
||||
$fieldName = trim($fieldName);
|
||||
$fields[$fieldName] = isset($taskLang->$fieldName) ? $taskLang->$fieldName : $fieldName;
|
||||
unset($fields[$key]);
|
||||
}
|
||||
|
||||
if($created) $this->createTmpFile($tmpFile, $objectDatas);
|
||||
|
||||
return $objectDatas;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get showImport datas.
|
||||
*
|
||||
@@ -520,7 +477,7 @@ class portModel extends model
|
||||
*/
|
||||
public function getSourceByModuleMethod($model, $module, $method, $params = '', $pairs = '')
|
||||
{
|
||||
$getParams = $this->session->{$model.'PortParams'};
|
||||
$getParams = $this->session->{$model . 'PortParams'};
|
||||
|
||||
if($params)
|
||||
{
|
||||
@@ -565,8 +522,7 @@ class portModel extends model
|
||||
*/
|
||||
public function getSourceByLang($lang)
|
||||
{
|
||||
$lang = isset($this->modelLang->$lang) ? $this->modelLang->$lang : '';
|
||||
return $lang;
|
||||
return isset($this->modelLang->$lang) ? $this->modelLang->$lang : '';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -594,7 +550,7 @@ class portModel extends model
|
||||
|
||||
if(empty($rows)) return $exportDatas;
|
||||
|
||||
$exportDatas['user'] = $this->loadModel('user')->getPairs('devfirst|noclosed|nodeleted');
|
||||
$exportDatas['user'] = $this->loadModel('user')->getPairs('noclosed|nodeleted|noletter');
|
||||
|
||||
foreach ($rows as $id => $values)
|
||||
{
|
||||
@@ -760,7 +716,7 @@ class portModel extends model
|
||||
{
|
||||
$modelDatas = $this->getQueryDatas($model);
|
||||
|
||||
if(array_key_exists('files', $fieldList))
|
||||
if(isset($fieldList['files']) or property_exists($fieldList, 'files'))
|
||||
{
|
||||
$modelDatas = $this->getFiles($model, $modelDatas);
|
||||
}
|
||||
@@ -775,10 +731,7 @@ class portModel extends model
|
||||
}
|
||||
|
||||
/* Deal children datas and multiple tasks .*/
|
||||
if($modelDatas)
|
||||
{
|
||||
$modelDatas = $this->updateChildDatas($modelDatas);
|
||||
}
|
||||
if($modelDatas) $modelDatas = $this->updateChildDatas($modelDatas);
|
||||
|
||||
return $modelDatas;
|
||||
}
|
||||
@@ -807,7 +760,11 @@ class portModel extends model
|
||||
}
|
||||
elseif($queryCondition)
|
||||
{
|
||||
$stmt = $this->dbh->query($queryCondition . ($this->post->exportType == 'selected' ? " AND t1.id IN({$this->cookie->checkedItem})" : ''));
|
||||
$selectKey = 'id';
|
||||
if(strpos($queryCondition, "FROM `{$this->config->db->prefix}_$model` AS t1") == false) $selectKey = 't1.id';
|
||||
if(strpos($queryCondition, "FROM `{$this->config->db->prefix}_$model` AS t2") == false) $selectKey = 't2.id';
|
||||
|
||||
$stmt = $this->dbh->query($queryCondition . ($this->post->exportType == 'selected' ? " AND $selectKey IN({$this->cookie->checkedItem})" : ''));
|
||||
while($row = $stmt->fetch()) $modelDatas[$row->id] = $row;
|
||||
}
|
||||
|
||||
@@ -832,10 +789,7 @@ class portModel extends model
|
||||
$relatedObjectIdList = array();
|
||||
$relatedObjects = array();
|
||||
|
||||
foreach($datas as $data)
|
||||
{
|
||||
$relatedObjectIdList[$data->$object] = $data->$object;
|
||||
}
|
||||
foreach($datas as $data) $relatedObjectIdList[$data->$object] = $data->$object;
|
||||
|
||||
if($object == 'openedBuild') $object = 'build';
|
||||
|
||||
@@ -864,6 +818,7 @@ class portModel extends model
|
||||
{
|
||||
foreach($data as $field => $cellValue)
|
||||
{
|
||||
if(strpos($this->portConfig->dateFeilds, $field) !== false and helper::isZeroDate($cellValue)) $datas[$key]->$field = '';
|
||||
if(strpos($filter, $field) !== false) continue;
|
||||
if(is_array($cellValue)) continue;
|
||||
if(strrpos($cellValue, '(#') === false)
|
||||
@@ -882,6 +837,17 @@ class portModel extends model
|
||||
{
|
||||
$id = trim(substr($cellValue, strrpos($cellValue,'(#') + 2), ')');
|
||||
$datas[$key]->$field = $id;
|
||||
$control = !empty($this->modelFieldList[$field]['control']) ? $this->modelFieldList[$field]['control'] : '';
|
||||
if($control == 'multiple')
|
||||
{
|
||||
$cellValue = explode("\n", $cellValue);
|
||||
foreach($cellValue as &$value)
|
||||
{
|
||||
$value = trim(substr($value, strrpos($value,'(#') + 2), ')');
|
||||
}
|
||||
$cellValue = array_filter($cellValue, function($v) {return (empty($v) && $v == '0') || !empty($v);});
|
||||
$datas[$key]->$field = join(',', $cellValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -930,11 +896,16 @@ class portModel extends model
|
||||
$datas = array_slice($datas, ($pagerID - 1) * $maxImport, $maxImport, true);
|
||||
}
|
||||
|
||||
if(!$maxImport) $this->maxImport = $result->allCount;
|
||||
if(!$maxImport) $this->maxImport = $result->allCount;
|
||||
$result->maxImport = $maxImport;
|
||||
$result->isEndPage = $pagerID >= $result->allPager;
|
||||
$result->datas = $datas;
|
||||
|
||||
foreach($datas as $data)
|
||||
{
|
||||
if(isset($data->id)) $this->session->set('insert', false);
|
||||
}
|
||||
|
||||
if(empty($datas)) die(js::locate('back'));
|
||||
return $result;
|
||||
}
|
||||
@@ -1231,7 +1202,7 @@ class portModel extends model
|
||||
|
||||
$suhosinInfo = $this->checkSuhosinInfo($datas->datas);
|
||||
|
||||
$importFields = $this->config->$model->templateFields;
|
||||
$importFields = !empty($_SESSION[$model . 'TemplateFields']) ? $_SESSION[$model . 'TemplateFields'] : $this->config->$model->templateFields;
|
||||
|
||||
$this->getWorkFlowFields($model);
|
||||
|
||||
@@ -1264,7 +1235,7 @@ class portModel extends model
|
||||
$html = '';
|
||||
$key = key($list);
|
||||
$addID = 1;
|
||||
$members = $this->loadModel('user')->getTeamMemberPairs($this->session->taskPortParams['executionID'], 'execution');
|
||||
if($model == 'task') $members = $this->loadModel('user')->getTeamMemberPairs($this->session->taskPortParams['executionID'], 'execution');
|
||||
|
||||
$appendFields = $this->session->appendFields;
|
||||
$showImportCount = $this->config->port->lazyLoading ? $this->config->port->showImportCount : $this->maxImport;
|
||||
@@ -1284,7 +1255,6 @@ class portModel extends model
|
||||
if(!empty($object->id))
|
||||
{
|
||||
$html .= $object->id . html::hidden("id[$row]", $object->id);
|
||||
$this->session->set('insert', false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1300,17 +1270,21 @@ class portModel extends model
|
||||
$values = $value['values'];
|
||||
$name = "{$field}[$row]";
|
||||
$selected = !empty($object->$field) ? $object->$field : '';
|
||||
|
||||
$options = array();
|
||||
if($control == 'select' or $control == 'multiple')
|
||||
if($model)
|
||||
{
|
||||
if(!empty($values[$selected])) $options = array($selected => $values[$selected]);
|
||||
if(!empty($values[$selected]) and isset($values[0])) $options = array_slice($values, 0, 1);
|
||||
if($control == 'hidden' and isset($this->session->{$model.'PortParams'}[$field. 'ID'])) $selected = $this->session->{$model . 'PortParams'}[$field. 'ID'];
|
||||
}
|
||||
|
||||
if($control == 'select') $html .= '<td>' . html::select("$name", $options, $selected, "class='form-control picker-select nopicker' data-field='{$field}'") . '</td>';
|
||||
$options = array();
|
||||
if($control == 'select')
|
||||
{
|
||||
if(!empty($values[$selected])) $options = array($selected => $values[$selected]);
|
||||
if(empty($options) and is_array($values)) $options = array_slice($values, 0, 1);
|
||||
}
|
||||
|
||||
elseif($control == 'multiple') $html .= '<td>' . html::select($name . "[]", $options, $selected, "multiple class='form-control picker-select nopicker' data-field='{$field}'") . '</td>';
|
||||
if($control == 'select') $html .= '<td>' . html::select("$name", $options, $selected, "class='form-control picker-select nopicker' data-field='{$field}' data-index='{$row}'") . '</td>';
|
||||
|
||||
elseif($control == 'multiple') $html .= '<td>' . html::select($name . "[]", $values, $selected, "multiple class='form-control picker-select nopicker' data-field='{$field}' data-index='{$row}'") . '</td>';
|
||||
|
||||
elseif($control == 'date') $html .= '<td>' . html::input("$name", $selected, "class='form-control form-date' autocomplete='off'") . '</td>';
|
||||
|
||||
|
||||
@@ -13,14 +13,14 @@ $model = $datas->model;
|
||||
$datas = $datas->datas;
|
||||
$appendFields = $this->session->appendFields;
|
||||
$notEmptyRule = $this->session->notEmptyRule;
|
||||
$insert = $this->session->insert;
|
||||
?>
|
||||
<style>
|
||||
form{overflow-x: scroll}
|
||||
#maxImport:focus {outline: none;}
|
||||
.pointorNone{pointer-events:none;}
|
||||
.c-pri{width:100px}
|
||||
#showData > thead > tr > th{min-width:150px !important;}
|
||||
.c-story{width:150px;}
|
||||
#showData > thead > tr > th{width:150px;}
|
||||
.c-id{width:50px}
|
||||
.c-team {width:100px; padding:0px 0px 8px 0px !important;}
|
||||
.c-estimate-1 {width:50px;padding:0px 0px 8px 8px !important;}
|
||||
</style>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<?php include $app->getModuleRoot() . 'port/view/tfoot.html.php';?>
|
||||
</tfoot>
|
||||
</table>
|
||||
<?php if(!$insert and $dataInsert === '') include $app->getModuleRoot() . 'common/view/noticeimport.html.php';?>
|
||||
<?php if(!$this->session->insert); include $app->getModuleRoot() . 'common/view/noticeimport.html.php';?>
|
||||
</form>
|
||||
</div>
|
||||
<?php include $app->getModuleRoot() . 'port/view/footer.html.php';?>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<?php
|
||||
$submitText = $isEndPage ? $this->lang->save : $this->lang->file->saveAndNext;
|
||||
$isStartPage = $pagerID == 1 ? true : false;
|
||||
if(!$insert and $dataInsert === '')
|
||||
if(!$this->session->insert)
|
||||
{
|
||||
echo "<button type='button' data-toggle='modal' data-target='#importNoticeModal' class='btn btn-primary btn-wide'>{$submitText}</button>";
|
||||
}
|
||||
|
||||
@@ -153,4 +153,4 @@ $config->product->statisticFields['bugs'] = array('unResolvedBugs', 'clo
|
||||
$config->product->statisticFields['plans'] = array('plans');
|
||||
$config->product->statisticFields['releases'] = array('releases');
|
||||
|
||||
$config->product->skipRedirectMethod = ',create,index,showerrornone,ajaxgetdropmenu,kanban,all,manageline,export,';
|
||||
$config->product->skipRedirectMethod = ',create,index,showerrornone,ajaxgetdropmenu,kanban,all,manageline,export,ajaxgetplans,';
|
||||
|
||||
@@ -680,7 +680,7 @@ class productModel extends model
|
||||
$programID = isset($product->program) ? $product->program : 0;
|
||||
$this->dao->insert(TABLE_PRODUCT)->data($product)->autoCheck()
|
||||
->batchCheck($this->config->product->create->requiredFields, 'notempty')
|
||||
->checkIF((!empty($product->name) and $this->config->systemMode == 'new'), 'name', 'unique', "`program` = $programID and `deleted` = '0'")
|
||||
->checkIF(!empty($product->name), 'name', 'unique', "`program` = $programID and `deleted` = '0'")
|
||||
->checkIF(!empty($product->code), 'code', 'unique', "`deleted` = '0'")
|
||||
->checkFlow()
|
||||
->exec();
|
||||
@@ -770,10 +770,10 @@ class productModel extends model
|
||||
|
||||
$this->lang->error->unique = $this->lang->error->repeat;
|
||||
$product = $this->loadModel('file')->processImgURL($product, $this->config->product->editor->edit['id'], $this->post->uid);
|
||||
$programID = isset($product->program) ? $product->program : '';
|
||||
$programID = isset($product->program) ? $product->program : 0;
|
||||
$this->dao->update(TABLE_PRODUCT)->data($product)->autoCheck()
|
||||
->batchCheck($this->config->product->edit->requiredFields, 'notempty')
|
||||
->checkIF((!empty($product->name) and $this->config->systemMode == 'new'), 'name', 'unique', "id != $productID and `program` = $programID and `deleted` = '0'")
|
||||
->checkIF(!empty($product->name), 'name', 'unique', "id != $productID and `program` = $programID and `deleted` = '0'")
|
||||
->checkIF(!empty($product->code), 'code', 'unique', "id != $productID and `deleted` = '0'")
|
||||
->checkFlow()
|
||||
->where('id')->eq($productID)
|
||||
|
||||
@@ -275,7 +275,7 @@ class programplan extends control
|
||||
|
||||
$this->loadModel('task')->updateEsDateByGantt($objectID, $_POST['type']);
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
// $this->loadModel('action')->create('task', $objectID, 'ganttDrag', '', $this->app->user->account);
|
||||
|
||||
return $this->send(array('result' => 'success'));
|
||||
}
|
||||
}
|
||||
@@ -296,8 +296,7 @@ class programplan extends control
|
||||
|
||||
$this->loadModel('task')->updateOrderByGantt();
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
$this->loadModel('action')->create('task', $taskID, 'ganttMove', '', $this->app->user->account);
|
||||
|
||||
$this->loadModel('action')->create('task', $taskID, 'ganttMove');
|
||||
return $this->send(array('result' => 'success'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,12 +70,17 @@ form {display: block; margin-top: 0em; margin-block-end: 1em;}
|
||||
<?php js::set('module', $app->rawModule);?>
|
||||
<?php js::set('method', $app->rawMethod);?>
|
||||
<?php js::set('ganttType', $ganttType);?>
|
||||
<?php js::set('showFields', $showFields);?>
|
||||
<?php js::set('showFields', $this->config->programplan->ganttCustom->ganttFields);?>
|
||||
<?php js::set('canGanttEdit', common::hasPriv('programplan', 'ganttEdit'));?>
|
||||
<div id='mainContent' class='main-content load-indicator' data-loading='<?php echo $lang->programplan->exporting;?>'>
|
||||
<div class="pull-right btn-toolbar">
|
||||
<?php $customLink = $this->createLink('custom', 'ajaxSaveCustomFields', 'module=programplan§ion=ganttCustom&key=ganttFields')?>
|
||||
<?php include '../../common/view/customfield.html.php';?>
|
||||
<?php
|
||||
if($this->app->getModuleName() == 'programplan')
|
||||
{
|
||||
$customLink = $this->createLink('custom', 'ajaxSaveCustomFields', 'module=programplan§ion=ganttCustom&key=ganttFields');
|
||||
include '../../common/view/customfield.html.php';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<form class="main-form form-ajax not-watch">
|
||||
<div class="example">
|
||||
@@ -475,12 +480,15 @@ $(function()
|
||||
|
||||
<?php
|
||||
$userList = array();
|
||||
foreach($users as $account => $realname)
|
||||
if(!empty($users))
|
||||
{
|
||||
$user = array();
|
||||
$user['key'] = $account;
|
||||
$user['label'] = $realname;
|
||||
$userList[] = $user;
|
||||
foreach($users as $account => $realname)
|
||||
{
|
||||
$user = array();
|
||||
$user['key'] = $account;
|
||||
$user['label'] = $realname;
|
||||
$userList[] = $user;
|
||||
}
|
||||
}
|
||||
?>
|
||||
gantt.serverList("userList", <?php echo json_encode($userList);?>);
|
||||
|
||||
@@ -240,7 +240,7 @@ class project extends control
|
||||
{
|
||||
$object = $objectType == 'project' ? $this->project->getByID($objectID) : $this->loadModel('program')->getByID($objectID);
|
||||
|
||||
if(isset($availableBudget)) $availableBudget = $object->parent == $selectedProgramID ? $availableBudget + $object->budget : $availableBudget;
|
||||
if(isset($availableBudget)) $availableBudget = $object->parent == $selectedProgramID ? $availableBudget + (int)$object->budget : $availableBudget;
|
||||
|
||||
if($objectType == 'program')
|
||||
{
|
||||
|
||||
@@ -2618,9 +2618,10 @@ class projectModel extends model
|
||||
public function setMenu($objectID)
|
||||
{
|
||||
global $lang;
|
||||
$project = $this->getByID($objectID);
|
||||
|
||||
$model = 'scrum';
|
||||
$model = 'scrum';
|
||||
$objectID = (empty($objectID) and $this->session->project) ? $this->session->project : $objectID;
|
||||
$project = $this->getByID($objectID);
|
||||
if($project and $project->model == 'waterfall') $model = $project->model;
|
||||
if($project and $project->model == 'kanban')
|
||||
{
|
||||
@@ -2657,7 +2658,6 @@ class projectModel extends model
|
||||
$this->lang->switcherMenu = $this->getSwitcher($objectID, $moduleName, $methodName);
|
||||
|
||||
$this->saveState($objectID, $this->getPairsByProgram());
|
||||
$project = $this->getById($objectID);
|
||||
|
||||
if(isset($project->acl) and $project->acl == 'open') unset($this->lang->project->menu->settings['subMenu']->whitelist);
|
||||
|
||||
|
||||
@@ -231,18 +231,12 @@ class search extends control
|
||||
$pager = new pager(0, $this->config->search->recPerPage, $pageID);
|
||||
$results = $this->search->getList($words, $type, $pager);
|
||||
|
||||
if($words)
|
||||
$typeCount = $this->search->getListCount();
|
||||
$typeList = array('all' => $this->lang->search->modules['all']);
|
||||
foreach($typeCount as $objectType => $count)
|
||||
{
|
||||
$typeCount = $this->search->getListCount($words);
|
||||
$typeList = array('all' => $this->lang->search->modules['all']);
|
||||
foreach($typeCount as $objectType => $count)
|
||||
{
|
||||
$typeList[$objectType] = $this->lang->search->modules[$objectType];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$typeList = $this->lang->search->modules;
|
||||
if(!isset($this->lang->search->modules[$objectType])) continue;
|
||||
$typeList[$objectType] = $this->lang->search->modules[$objectType];
|
||||
}
|
||||
|
||||
/* Set session. */
|
||||
|
||||
@@ -612,7 +612,7 @@ class searchModel extends model
|
||||
|
||||
$likeCondition = '';
|
||||
/* Assisted lookup by like condition when only one word. */
|
||||
if(count($words) == 1 and strpos($words[0], ' ') === false) $likeCondition = "OR title like '%{$words[0]}%' OR content like '%{$words[0]}%'";
|
||||
if(count($words) == 1 and strpos($words[0], ' ') === false and !is_numeric($words[0])) $likeCondition = "OR title like '%{$words[0]}%' OR content like '%{$words[0]}%'";
|
||||
|
||||
$words = str_replace('"', '', $against);
|
||||
$words = str_pad($words, 5, '_');
|
||||
@@ -647,7 +647,7 @@ class searchModel extends model
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getListCount($keywords, $type = 'all')
|
||||
public function getListCount($keywords = '', $type = 'all')
|
||||
{
|
||||
list($words, $againstCond, $likeCondition, $allowedObject) = $this->getSqlParams($keywords, $type);
|
||||
|
||||
|
||||
+18
-6
@@ -88,17 +88,19 @@ $config->story->datatable->fieldList['title']['width'] = 'auto';
|
||||
$config->story->datatable->fieldList['title']['required'] = 'yes';
|
||||
|
||||
$config->story->datatable->fieldList['product']['title'] = 'product';
|
||||
$config->story->datatable->fieldList['product']['control'] = 'hidden';
|
||||
$config->story->datatable->fieldList['product']['dataSource'] = array('module' => 'port', 'method' => 'getRelatedObjects', 'params' => 'story&product&id,name');
|
||||
|
||||
$config->story->datatable->fieldList['branch']['title'] = 'branch';
|
||||
$config->story->datatable->fieldList['branch']['fixed'] = 'no';
|
||||
$config->story->datatable->fieldList['branch']['width'] = '100';
|
||||
$config->story->datatable->fieldList['branch']['required'] = 'no';
|
||||
$config->story->datatable->fieldList['branch']['control'] = 'multiple';
|
||||
$config->story->datatable->fieldList['branch']['dataSource'] = array('module' => 'story', 'method' => 'getRelatedObjects', 'params' => 'branch&id,name');
|
||||
|
||||
$config->story->datatable->fieldList['module']['title'] = 'module';
|
||||
$config->story->datatable->fieldList['module']['control'] = 'select';
|
||||
$config->story->datatable->fieldList['module']['dataSource'] = array('module' => 'tree', 'method' => 'getAllModulePairs', 'params' => 'story');
|
||||
$config->story->datatable->fieldList['module']['dataSource'] = array('module' => 'tree', 'method' => 'getOptionMenu', 'params' => '$productID&story&0&all');
|
||||
|
||||
$config->story->datatable->fieldList['keywords']['title'] = 'keywords';
|
||||
$config->story->datatable->fieldList['keywords']['fixed'] = 'no';
|
||||
@@ -110,7 +112,7 @@ $config->story->datatable->fieldList['plan']['fixed'] = 'no';
|
||||
$config->story->datatable->fieldList['plan']['width'] = '90';
|
||||
$config->story->datatable->fieldList['plan']['required'] = 'no';
|
||||
$config->story->datatable->fieldList['plan']['control'] = 'select';
|
||||
$config->story->datatable->fieldList['plan']['dataSource'] = array('module' => 'story', 'method' => 'getRelatedObjects', 'params' => 'plan&id,title');
|
||||
$config->story->datatable->fieldList['plan']['dataSource'] = array('module' => 'productplan', 'method' => 'getPairs', 'params' => '$productID');
|
||||
|
||||
$config->story->datatable->fieldList['source']['title'] = 'source';
|
||||
$config->story->datatable->fieldList['source']['fixed'] = 'no';
|
||||
@@ -162,16 +164,26 @@ $config->story->datatable->fieldList['assignedDate']['fixed'] = 'no';
|
||||
$config->story->datatable->fieldList['assignedDate']['width'] = '90';
|
||||
$config->story->datatable->fieldList['assignedDate']['required'] = 'no';
|
||||
|
||||
$config->story->datatable->fieldList['reviewedBy']['title'] = 'reviewedBy';
|
||||
$config->story->datatable->fieldList['reviewedBy']['fixed'] = 'no';
|
||||
$config->story->datatable->fieldList['reviewedBy']['width'] = '80';
|
||||
$config->story->datatable->fieldList['reviewedBy']['required'] = 'no';
|
||||
$config->story->datatable->fieldList['reviewedBy']['title'] = 'reviewedBy';
|
||||
$config->story->datatable->fieldList['reviewedBy']['fixed'] = 'no';
|
||||
$config->story->datatable->fieldList['reviewedBy']['width'] = '80';
|
||||
$config->story->datatable->fieldList['reviewedBy']['required'] = 'no';
|
||||
$config->story->datatable->fieldList['reviewedBy']['control'] = 'multiple';
|
||||
$config->story->datatable->fieldList['reviewedBy']['dataSource'] = array('module' => 'story', 'method' => 'getStoriesReviewer', 'params' => '$productID');
|
||||
|
||||
$config->story->datatable->fieldList['reviewer']['title'] = 'reviewedBy';
|
||||
$config->story->datatable->fieldList['reviewer']['control'] = 'multiple';
|
||||
$config->story->datatable->fieldList['reviewer']['dataSource'] = array('module' => 'story', 'method' => 'getStoriesReviewer', 'params' => '$productID');
|
||||
|
||||
$config->story->datatable->fieldList['reviewedDate']['title'] = 'reviewedDate';
|
||||
$config->story->datatable->fieldList['reviewedDate']['fixed'] = 'no';
|
||||
$config->story->datatable->fieldList['reviewedDate']['width'] = '90';
|
||||
$config->story->datatable->fieldList['reviewedDate']['required'] = 'no';
|
||||
|
||||
$config->story->datatable->fieldList['needReview']['title'] = 'needReview';
|
||||
$config->story->datatable->fieldList['needReview']['control'] = 'select';
|
||||
$config->story->datatable->fieldList['needReview']['dataSource'] = array('lang' => 'reviewList');
|
||||
|
||||
$config->story->datatable->fieldList['closedBy']['title'] = 'closedBy';
|
||||
$config->story->datatable->fieldList['closedBy']['fixed'] = 'no';
|
||||
$config->story->datatable->fieldList['closedBy']['width'] = '80';
|
||||
|
||||
@@ -114,6 +114,8 @@ class story extends control
|
||||
$this->view->$fromObjectName = $fromObject;
|
||||
}
|
||||
|
||||
$copyStoryID = $storyID;
|
||||
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$response['result'] = 'success';
|
||||
@@ -237,7 +239,19 @@ class story extends control
|
||||
setcookie('storyModule', 0, 0, $this->config->webRoot, '', $this->config->cookieSecure, false);
|
||||
$branchID = $this->post->branch ? $this->post->branch : $branch;
|
||||
$response['locate'] = $this->createLink('product', 'browse', "productID=$productID&branch=$branchID&browseType=¶m=0&type=$type&orderBy=id_desc");
|
||||
if($this->session->storyList) $response['locate'] = $this->session->storyList;
|
||||
if($this->session->storyList)
|
||||
{
|
||||
/* When copying story in the product plan, return to different pages for story#32949. */
|
||||
if($copyStoryID and strpos($this->session->storyList, 'productplan') !== false)
|
||||
{
|
||||
$storyInfo = $this->story->getByList(array($storyID, $copyStoryID));
|
||||
if($storyInfo[$storyID]->plan == $storyInfo[$copyStoryID]->plan or $storyInfo[$storyID]->product != $storyInfo[$copyStoryID]->product) $response['locate'] = $this->session->storyList;
|
||||
}
|
||||
else
|
||||
{
|
||||
$response['locate'] = $this->session->storyList;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -271,6 +271,7 @@ function addRow(obj)
|
||||
$row.find('div[id$=_chosen]').remove();
|
||||
$row.find('.picker').remove();
|
||||
$row.find('.chosen').chosen();
|
||||
$row.find('.picker-select').picker();
|
||||
|
||||
var begin = parseInt($(obj).parent().siblings('.c-id').text()) + 1;
|
||||
var count = $('#tableBody tbody > tr').length;
|
||||
|
||||
+17
-4
@@ -5525,8 +5525,7 @@ class storyModel extends model
|
||||
*/
|
||||
public function getRelatedObjects($object, $pairs = '')
|
||||
{
|
||||
/* Get bugs. */
|
||||
$storys = $this->dao->select('*')->from(TABLE_STORY)->where($this->session->storyQueryCondition)->fetchAll('id');
|
||||
$storys = $this->loadModel('port')->getQueryDatas('story');
|
||||
|
||||
/* Get related objects id lists. */
|
||||
$relatedObjectIdList = array();
|
||||
@@ -5636,8 +5635,8 @@ class storyModel extends model
|
||||
$storyCases = $this->loadModel('testcase')->getStoryCaseCounts($relatedStoryIds);
|
||||
|
||||
/* Get related objects title or names. */
|
||||
$relatedSpecs = $this->dao->select('*')->from(TABLE_STORYSPEC)->where('`story`')->in($storyIdList)->orderBy('version desc')->fetchGroup('story');
|
||||
|
||||
$relatedSpecs = $this->dao->select('*')->from(TABLE_STORYSPEC)->where('`story`')->in($storyIdList)->orderBy('version desc')->fetchGroup('story');
|
||||
$relatedFiles = $this->dao->select('id, objectID, pathname, title')->from(TABLE_FILE)->where('objectType')->eq('story')->andWhere('objectID')->in($storyIdList)->andWhere('extra')->ne('editor')->fetchGroup('objectID');
|
||||
foreach($stories as $story)
|
||||
{
|
||||
$story->spec = '';
|
||||
@@ -5731,4 +5730,18 @@ class storyModel extends model
|
||||
|
||||
return $stories;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get reviewer pairs for story .
|
||||
*
|
||||
* @param int $productID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getStoriesReviewer($productID = 0)
|
||||
{
|
||||
$product = $this->loadModel('product')->getByID($productID);
|
||||
$reviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', '', '');
|
||||
return $this->user->getPairs('noclosed|nodeleted', '', 0, $reviewers);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<?php echo html::a('javascript:;', "<i class='icon icon-product'></i><div class='product-name'>{$projectProducts[$productID]->name}</div><span class='caret'></span>", '', 'class="dropdown-toggle" data-toggle="dropdown"');?>
|
||||
<ul class="dropdown-menu">
|
||||
<?php foreach($projectProducts as $product): ?>
|
||||
<li><?php echo html::a($this->createLink('projectstory', 'track', "projectID={$this->session->project}&productID=$product->id"), $product->name);?></li>
|
||||
<li class= "<?php if($productID == $product->id) echo 'active';?>"><?php echo html::a($this->createLink('projectstory', 'track', "projectID={$this->session->project}&productID=$product->id"), $product->name);?></li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -438,10 +438,16 @@ class task extends control
|
||||
$customFields[$field] = $this->lang->task->$field;
|
||||
}
|
||||
|
||||
if($execution->lifetime == 'ops' or $execution->attribute == 'request' or $execution->attribute == 'review') unset($customFields['story']);
|
||||
$showFields = $this->config->task->custom->batchCreateFields;
|
||||
if($execution->lifetime == 'ops' or $execution->attribute == 'request' or $execution->attribute == 'review')
|
||||
{
|
||||
unset($customFields['story']);
|
||||
$showFields = str_replace(',story,', ',', ",$showFields,");
|
||||
$showFields = trim($showFields, ',');
|
||||
}
|
||||
|
||||
$this->view->customFields = $customFields;
|
||||
$this->view->showFields = $this->config->task->custom->batchCreateFields;
|
||||
$this->view->showFields = $showFields;
|
||||
|
||||
if($execution->type == 'kanban')
|
||||
{
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
.c-id {width: 50px;}
|
||||
.c-name {width: 150px;}
|
||||
.c-pri, .c-record, .c-left {width: 70px;}
|
||||
.c-reason {width: 100px;}
|
||||
.c-module, .c-assigned {width: 150px;}
|
||||
|
||||
+108
-70
@@ -3936,90 +3936,128 @@ class taskModel extends model
|
||||
$this->app->loadLang('project');
|
||||
$post = fixer::input('post')->get();
|
||||
$post->endDate = date('Y-m-d', strtotime('-1 day', strtotime($post->endDate)));
|
||||
$changeTable = $objectType == 'task' ? TABLE_TASK : TABLE_PROJECT;
|
||||
$actionType = $objectType == 'task' ? 'task' : 'execution';
|
||||
$oldObject = $this->dao->select('*')->from($changeTable)->where('id')->eq($objectID)->fetch();
|
||||
if($objectType == 'task')
|
||||
{
|
||||
$objectData = $this->dao->select('*')->from(TABLE_TASK)->where('id')->eq($objectID)->fetch();
|
||||
$parent = $objectData->parent;
|
||||
$project = $objectData->project;
|
||||
$execution = $objectData->execution;
|
||||
$stage = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($execution)->andWhere('project')->eq($project)->fetch();
|
||||
|
||||
if($parent <= 0)
|
||||
{
|
||||
$parentData = $stage;
|
||||
|
||||
$start = $parentData->begin;
|
||||
$end = $parentData->end;
|
||||
}
|
||||
else
|
||||
{
|
||||
$parentData = $this->dao->select('*')->from(TABLE_TASK)->where('id')->eq($parent)->fetch();
|
||||
|
||||
$start = helper::isZeroDate($parentData->estStarted) ? '' : $parentData->estStarted;
|
||||
$end = helper::isZeroDate($parentData->deadline) ? '' : $parentData->deadline;
|
||||
}
|
||||
|
||||
if(helper::diffDate($start, $post->startDate) > 0)
|
||||
{
|
||||
$arg = !empty($parent) ? $this->lang->task->parent : $this->lang->project->stage;
|
||||
return dao::$errors = sprintf($this->lang->task->overEsStartDate, $arg, $arg);
|
||||
}
|
||||
|
||||
if(helper::diffDate($end, $post->endDate) < 0)
|
||||
{
|
||||
$arg = !empty($parent) ? $this->lang->task->parent : $this->lang->project->stage;
|
||||
return dao::$errors = sprintf($this->lang->task->overEsEndDate, $arg, $arg);
|
||||
}
|
||||
|
||||
$this->dao->update(TABLE_TASK)
|
||||
->set('estStarted')->eq($post->startDate)
|
||||
->set('deadline')->eq($post->endDate)
|
||||
->set('lastEditedBy')->eq($this->app->user->account)
|
||||
->where('id')->eq($objectID)
|
||||
->exec();
|
||||
$this->updateTaskEsDateByGantt($objectID, $objectType, $post);
|
||||
}
|
||||
elseif($objectType == 'plan')
|
||||
{
|
||||
$objectData = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($objectID)->fetch();
|
||||
$parent = $objectData->parent;
|
||||
$project = $objectData->project;
|
||||
$this->updateExecutionEsDateByGantt($objectID, $objectType, $post);
|
||||
}
|
||||
|
||||
if(dao::isError()) return false;
|
||||
|
||||
$newObject = $this->dao->select('*')->from($changeTable)->where('id')->eq($objectID)->fetch();
|
||||
$changes = common::createChanges($oldObject, $newObject);
|
||||
$actionID = $this->loadModel('action')->create($actionType, $objectID, 'edited');
|
||||
if(!empty($changes)) $this->loadModel('action')->logHistory($actionID, $changes);
|
||||
|
||||
if(empty($parent))
|
||||
{
|
||||
$parentData = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($project)->fetch();
|
||||
}
|
||||
else
|
||||
{
|
||||
$parentData = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($parent)->fetch();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
$start = helper::isZeroDate($parentData->begin) ? '' : $parentData->begin;
|
||||
$end = helper::isZeroDate($parentData->end) ? '' : $parentData->end;
|
||||
/**
|
||||
* Update Task estimate date by gantt.
|
||||
*
|
||||
* @param int $objectID
|
||||
* @param string $objectType
|
||||
* @param object $postData
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
private function updateTaskEsDateByGantt($objectID, $objectType, $postData)
|
||||
{
|
||||
$objectData = $this->dao->select('*')->from(TABLE_TASK)->where('id')->eq($objectID)->fetch();
|
||||
$parent = $objectData->parent;
|
||||
$project = $objectData->project;
|
||||
$execution = $objectData->execution;
|
||||
$stage = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($execution)->andWhere('project')->eq($project)->fetch();
|
||||
|
||||
if(helper::diffDate($start, $post->startDate) > 0)
|
||||
{
|
||||
$arg = !empty($parent) ? $this->lang->programplan->parent : $this->lang->project->common;
|
||||
return dao::$errors = sprintf($this->lang->task->overEsStartDate, $arg, $arg);
|
||||
}
|
||||
if($parent <= 0)
|
||||
{
|
||||
$parentData = $stage;
|
||||
|
||||
if(helper::diffDate($end, $post->endDate) < 0)
|
||||
{
|
||||
$arg = !empty($parent) ? $this->lang->programplan->parent : $this->lang->project->common;
|
||||
return dao::$errors = sprintf($this->lang->task->overEsEndDate, $arg, $arg);
|
||||
}
|
||||
|
||||
$this->dao->update(TABLE_PROJECT)
|
||||
->set('begin')->eq($post->startDate)
|
||||
->set('end')->eq($post->endDate)
|
||||
->set('lastEditedBy')->eq($this->app->user->account)
|
||||
->where('id')->eq($objectID)
|
||||
->exec();
|
||||
$start = $parentData->begin;
|
||||
$end = $parentData->end;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
$parentData = $this->dao->select('*')->from(TABLE_TASK)->where('id')->eq($parent)->fetch();
|
||||
|
||||
$start = helper::isZeroDate($parentData->estStarted) ? '' : $parentData->estStarted;
|
||||
$end = helper::isZeroDate($parentData->deadline) ? '' : $parentData->deadline;
|
||||
}
|
||||
|
||||
if(helper::diffDate($start, $postData->startDate) > 0)
|
||||
{
|
||||
$arg = !empty($parent) ? $this->lang->task->parent : $this->lang->project->stage;
|
||||
return dao::$errors = sprintf($this->lang->task->overEsStartDate, $arg, $arg);
|
||||
}
|
||||
|
||||
if(helper::diffDate($end, $postData->endDate) < 0)
|
||||
{
|
||||
$arg = !empty($parent) ? $this->lang->task->parent : $this->lang->project->stage;
|
||||
return dao::$errors = sprintf($this->lang->task->overEsEndDate, $arg, $arg);
|
||||
}
|
||||
|
||||
$this->dao->update(TABLE_TASK)
|
||||
->set('estStarted')->eq($postData->startDate)
|
||||
->set('deadline')->eq($postData->endDate)
|
||||
->set('lastEditedBy')->eq($this->app->user->account)
|
||||
->where('id')->eq($objectID)
|
||||
->exec();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update Execution estimate date by gantt.
|
||||
*
|
||||
* @param int $objectID
|
||||
* @param string $objectType
|
||||
* @param object $postData
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
private function updateExecutionEsDateByGantt($objectID, $objectType, $postData)
|
||||
{
|
||||
$objectData = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($objectID)->fetch();
|
||||
$parent = $objectData->parent;
|
||||
$project = $objectData->project;
|
||||
|
||||
if(empty($parent))
|
||||
{
|
||||
$parentData = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($project)->fetch();
|
||||
}
|
||||
else
|
||||
{
|
||||
$parentData = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($parent)->fetch();
|
||||
}
|
||||
|
||||
$start = helper::isZeroDate($parentData->begin) ? '' : $parentData->begin;
|
||||
$end = helper::isZeroDate($parentData->end) ? '' : $parentData->end;
|
||||
|
||||
if(helper::diffDate($start, $postData->startDate) > 0)
|
||||
{
|
||||
$arg = !empty($parent) ? $this->lang->programplan->parent : $this->lang->project->common;
|
||||
return dao::$errors = sprintf($this->lang->task->overEsStartDate, $arg, $arg);
|
||||
}
|
||||
|
||||
if(helper::diffDate($end, $postData->endDate) < 0)
|
||||
{
|
||||
$arg = !empty($parent) ? $this->lang->programplan->parent : $this->lang->project->common;
|
||||
return dao::$errors = sprintf($this->lang->task->overEsEndDate, $arg, $arg);
|
||||
}
|
||||
|
||||
$this->dao->update(TABLE_PROJECT)
|
||||
->set('begin')->eq($postData->startDate)
|
||||
->set('end')->eq($postData->endDate)
|
||||
->set('lastEditedBy')->eq($this->app->user->account)
|
||||
->where('id')->eq($objectID)
|
||||
->exec();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -218,6 +218,7 @@ $config->testcase->datatable->fieldList['results']['width'] = '32';
|
||||
$config->testcase->datatable->fieldList['results']['required'] = 'no';
|
||||
$config->testcase->datatable->fieldList['results']['sort'] = 'no';
|
||||
$config->testcase->datatable->fieldList['results']['name'] = $lang->testcase->results;
|
||||
$config->testcase->datatable->fieldList['results']['dataSource'] = array('lang' => 'resultList');
|
||||
|
||||
$config->testcase->datatable->fieldList['stepNumber']['title'] = 'S';
|
||||
$config->testcase->datatable->fieldList['stepNumber']['fixed'] = 'no';
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<?php include $app->getModuleRoot() . 'port/view/tfoot.html.php';?>
|
||||
</tfoot>
|
||||
</table>
|
||||
<?php if(!$insert and $dataInsert === '') include $app->getModuleRoot() . 'common/view/noticeimport.html.php';?>
|
||||
<?php if(!$this->session->insert) include $app->getModuleRoot() . 'common/view/noticeimport.html.php';?>
|
||||
</form>
|
||||
</div>
|
||||
<?php include $app->getModuleRoot() . 'port/view/footer.html.php';?>
|
||||
|
||||
@@ -906,83 +906,6 @@ class upgrade extends control
|
||||
echo $this->dao->select('status')->from(TABLE_PROGRAM)->where('id')->eq($programID)->fetch('status');
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax change table engine.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxChangeTableEngine()
|
||||
{
|
||||
$response = array();
|
||||
$response['result'] = 'continue';
|
||||
$response['message'] = '';
|
||||
$response['nextMessage'] = '';
|
||||
|
||||
$stmt = $this->dao->query("SHOW TABLE STATUS WHERE `Engine` is not null AND `Engine` = 'MyISAM'");
|
||||
$table = $stmt->fetch();
|
||||
if(empty($table))
|
||||
{
|
||||
$response['result'] = 'finished';
|
||||
$response['message'] = $this->lang->upgrade->finishedChange;
|
||||
return print(json_encode($response));
|
||||
}
|
||||
|
||||
$nextTable = $stmt->fetch();
|
||||
if($nextTable and stripos($nextTable->Name, 'searchindex') !== false)
|
||||
{
|
||||
$mysqlVersion = $this->loadModel('install')->getMysqlVersion();
|
||||
if($mysqlVersion < 5.6) $nextTable = $stmt->fetch();
|
||||
}
|
||||
|
||||
$tableName = $table->Name;
|
||||
|
||||
$response['table'] = $tableName;
|
||||
|
||||
/* Check process this table or not. */
|
||||
$dbProcesses = $this->dao->query("SHOW PROCESSLIST")->fetchAll();
|
||||
foreach($dbProcesses as $dbProcess)
|
||||
{
|
||||
if($dbProcess->db != $this->config->db->name) continue;
|
||||
if(strpos($dbProcess->Info, " `{$tableName}` "))
|
||||
{
|
||||
$response['message'] = sprintf($this->lang->upgrade->changingTable, $response['table']);
|
||||
return print(json_encode($response));
|
||||
}
|
||||
}
|
||||
|
||||
if($nextTable)
|
||||
{
|
||||
$response['next'] = $nextTable->Name;
|
||||
if($response['next']) $response['nextMessage'] = sprintf($this->lang->upgrade->changingTable, $response['next']);
|
||||
}
|
||||
|
||||
if(stripos($tableName, 'searchindex') !== false)
|
||||
{
|
||||
/* Change fulltext index. */
|
||||
$stmt = $this->dao->query("show index from `$tableName`");
|
||||
$indexes = array();
|
||||
while($index = $stmt->fetch())
|
||||
{
|
||||
if($index->Index_type != 'FULLTEXT') continue;
|
||||
$indexes[$index->Key_name] = $index->Key_name;
|
||||
}
|
||||
|
||||
if(!isset($indexes['title_content'])) $this->dao->exec( "ALTER TABLE `{$tableName}` ADD FULLTEXT `title_content` (`title`, `content`)");
|
||||
if(isset($indexes['title'])) $this->dao->exec( "ALTER TABLE `{$tableName}` DROP INDEX `title`");
|
||||
if(isset($indexes['content'])) $this->dao->exec( "ALTER TABLE `{$tableName}` DROP INDEX `content`");
|
||||
|
||||
$mysqlVersion = $this->loadModel('install')->getMysqlVersion();
|
||||
if($mysqlVersion < 5.6) return print(json_encode($response));
|
||||
}
|
||||
|
||||
$sql = "ALTER TABLE `$tableName` ENGINE='InnoDB'";
|
||||
$this->dao->exec($sql);
|
||||
|
||||
$response['message'] = sprintf($this->lang->upgrade->finishedTable, $tableName);
|
||||
return print(json_encode($response));
|
||||
}
|
||||
|
||||
/**
|
||||
* Move Extent files.
|
||||
*
|
||||
|
||||
@@ -51,10 +51,6 @@ $lang->upgrade->sureExecute = 'Ausführen';
|
||||
$lang->upgrade->upgradingTips = 'The upgrade is in progress, please be patient. Do not refresh the page, blackout, or turn off your computer!';
|
||||
$lang->upgrade->forbiddenExt = 'Die Erweiterung ist nicht kompatibel mit der Upgradeversion. Sie wurde deaktiviert:';
|
||||
$lang->upgrade->updateFile = 'Updateinformation wurden hinzugefügt.';
|
||||
$lang->upgrade->changeEngine = 'The database engine needs to be modified.';
|
||||
$lang->upgrade->changingTable = 'Replacing data table %s engine...';
|
||||
$lang->upgrade->finishedTable = 'The data table %s engine has been changed to InnoDB.';
|
||||
$lang->upgrade->finishedChange = 'The replacement of the database engine is completed.';
|
||||
$lang->upgrade->noticeSQL = 'Your database is inconsistent with the standard and it failed to fix it. Please run the following SQL and refresh.';
|
||||
$lang->upgrade->afterDeleted = 'File is not deleted. Please refresh after you delete it.';
|
||||
$lang->upgrade->mergeProgram = 'Data Merge';
|
||||
@@ -134,6 +130,7 @@ $lang->upgrade->mergeByProject = "Independent {$lang->projectCommon}: You ca
|
||||
$lang->upgrade->mergeByMoreLink = "{$lang->projectCommon} that relates multiple {$lang->productCommon}: You can select several {$lang->projectCommon} and merge them into one large project, or merge them independently.";
|
||||
$lang->upgrade->mergeRepoTips = "Merge the selected version library under the selected product.";
|
||||
$lang->upgrade->needBuild4Add = 'Full text retrieval has been added in this upgrad. Please create an index.';
|
||||
$lang->upgrade->needChangeEngine = 'The table engine needs to be replaced in this upgrade, Please go [Admin->System->TableEngine] page to replace engine.';
|
||||
$lang->upgrade->errorEngineInnodb = 'Your MySQL version is too low to support InnoDB data table engine. Please modify it to MyISAM and try again.';
|
||||
$lang->upgrade->duplicateProject = "Project name in the same program cannot be duplicate. Please adjust the duplicate names.";
|
||||
$lang->upgrade->upgradeTips = "Historically deleted data cannot be upgraded, and restoration is not supported after the upgrade. Please be aware.";
|
||||
|
||||
@@ -51,10 +51,6 @@ $lang->upgrade->sureExecute = 'Execute';
|
||||
$lang->upgrade->upgradingTips = 'The upgrade is in progress, please be patient. Do not refresh the page, blackout, or turn off your computer!';
|
||||
$lang->upgrade->forbiddenExt = 'The extension is incompatible with the version. It has been deactivated:';
|
||||
$lang->upgrade->updateFile = 'File information has to be updated.';
|
||||
$lang->upgrade->changeEngine = 'The database engine needs to be modified.';
|
||||
$lang->upgrade->changingTable = 'Replacing data table %s engine...';
|
||||
$lang->upgrade->finishedTable = 'The data table %s engine has been changed to InnoDB.';
|
||||
$lang->upgrade->finishedChange = 'The replacement of the database engine is completed.';
|
||||
$lang->upgrade->noticeSQL = 'Your database is inconsistent with the standard and it failed to fix it. Please run the following SQL and refresh.';
|
||||
$lang->upgrade->afterDeleted = 'Please execute commands to delete the files. Please refresh after you delete them.';
|
||||
$lang->upgrade->mergeProgram = 'Data Merge';
|
||||
@@ -134,6 +130,7 @@ $lang->upgrade->mergeByProject = "Independent {$lang->projectCommon}: You ca
|
||||
$lang->upgrade->mergeByMoreLink = "{$lang->projectCommon} that relates multiple {$lang->productCommon}: You can select several {$lang->projectCommon} and merge them into one large project, or merge them independently.";
|
||||
$lang->upgrade->mergeRepoTips = "Merge the selected version library under the selected product.";
|
||||
$lang->upgrade->needBuild4Add = 'Full text retrieval has been added in this upgrade. Need create index. Please go [Admin->System->BuildIndex] page to build index.';
|
||||
$lang->upgrade->needChangeEngine = 'The table engine needs to be replaced in this upgrade, Please go [Admin->System->TableEngine] page to replace engine.';
|
||||
$lang->upgrade->errorEngineInnodb = 'Your MySQL does not support InnoDB data table engine. Please modify it to MyISAM and try again.';
|
||||
$lang->upgrade->duplicateProject = "Project name in the same program cannot be duplicate. Please adjust the duplicate names.";
|
||||
$lang->upgrade->upgradeTips = "Historically deleted data cannot be upgraded, and restoration is not supported after the upgrade. Please be aware.";
|
||||
|
||||
@@ -51,10 +51,6 @@ $lang->upgrade->sureExecute = 'Executez';
|
||||
$lang->upgrade->upgradingTips = 'La mise à jour est en cours, veuillez être patient. Ne pas actualiser la page ou éteindre votre ordinateur!';
|
||||
$lang->upgrade->forbiddenExt = 'Cette extension est incompatible avec la version. Elle a été désactivée :';
|
||||
$lang->upgrade->updateFile = "Le fichier information a besoin d'une mise à jour.";
|
||||
$lang->upgrade->changeEngine = 'The database engine needs to be modified.';
|
||||
$lang->upgrade->changingTable = 'Replacing data table %s engine...';
|
||||
$lang->upgrade->finishedTable = 'The data table %s engine has been changed to InnoDB.';
|
||||
$lang->upgrade->finishedChange = 'The replacement of the database engine is completed.';
|
||||
$lang->upgrade->noticeSQL = 'Votre base de donnée est inconsistente avec le standard et il y a eu un échec pour la corriger. Exécutez la commande SQL suivante et rafraichissez.';
|
||||
$lang->upgrade->afterDeleted = "Le fichier n'est pas supprimé. Recommencez après l'avoir supprimé.";
|
||||
$lang->upgrade->mergeProgram = 'Data Merge';
|
||||
@@ -134,6 +130,7 @@ $lang->upgrade->mergeByProject = "Independent {$lang->projectCommon}: You ca
|
||||
$lang->upgrade->mergeByMoreLink = "{$lang->projectCommon} that relates multiple {$lang->productCommon}: You can select several {$lang->projectCommon} and merge them into one large project, or merge them independently.";
|
||||
$lang->upgrade->mergeRepoTips = "Merge the selected version library under the selected product.";
|
||||
$lang->upgrade->needBuild4Add = 'Full text retrieval has been added in this upgrade. Need create index. Please go [Admin->System->BuildIndex] page to build index.';
|
||||
$lang->upgrade->needChangeEngine = 'The table engine needs to be replaced in this upgrade, Please go [Admin->System->TableEngine] page to replace engine.';
|
||||
$lang->upgrade->errorEngineInnodb = 'Your MySQL does not support InnoDB data table engine. Please modify it to MyISAM and try again.';
|
||||
$lang->upgrade->duplicateProject = "Project name in the same program cannot be duplicate. Please adjust the duplicate names.";
|
||||
$lang->upgrade->upgradeTips = "Historically deleted data cannot be upgraded, and restoration is not supported after the upgrade. Please be aware.";
|
||||
|
||||
@@ -51,10 +51,6 @@ $lang->upgrade->sureExecute = '确认执行';
|
||||
$lang->upgrade->upgradingTips = '正在升级中,请耐心等待,切勿刷新页面、断电、关机!';
|
||||
$lang->upgrade->forbiddenExt = '以下插件与新版本不兼容,已经自动禁用:';
|
||||
$lang->upgrade->updateFile = '需要更新附件信息。';
|
||||
$lang->upgrade->changeEngine = '需要修改数据库引擎。';
|
||||
$lang->upgrade->changingTable = '正在更换数据表%s引擎...';
|
||||
$lang->upgrade->finishedTable = '已经更换数据表%s引擎为InnoDB。';
|
||||
$lang->upgrade->finishedChange = '更换数据库引擎结束。';
|
||||
$lang->upgrade->noticeSQL = '检查到你的数据库跟标准不一致,尝试修复失败。请执行以下SQL语句,再刷新页面检查。';
|
||||
$lang->upgrade->afterDeleted = '请执行上面命令删除文件, 删除后刷新!';
|
||||
$lang->upgrade->mergeProgram = '数据迁移';
|
||||
@@ -134,6 +130,7 @@ $lang->upgrade->mergeByProject = "独立的{$lang->projectCommon}:可以
|
||||
$lang->upgrade->mergeByMoreLink = "关联多个{$lang->productCommon}的{$lang->projectCommon}:选择一个或多个{$lang->projectCommon}归并到一个项目集和项目中。";
|
||||
$lang->upgrade->mergeRepoTips = "将选中的版本库归并到所选产品下。";
|
||||
$lang->upgrade->needBuild4Add = '本次升级需要创建索引。请到 [后台->系统->重建索引] 页面,重新创建索引。';
|
||||
$lang->upgrade->needChangeEngine = '本次升级需要更换表引擎, [后台->系统->表引擎] 页面更换引擎。';
|
||||
$lang->upgrade->errorEngineInnodb = '您当前的数据库不支持使用InnoDB数据表引擎,请修改为MyISAM后重试。';
|
||||
$lang->upgrade->duplicateProject = "同一个项目集内项目名称不能重复,请调整重名的项目名称";
|
||||
$lang->upgrade->upgradeTips = "历史删除数据不参与升级,升级后将不支持还原,请知悉";
|
||||
|
||||
+144
-14
@@ -534,8 +534,17 @@ class upgradeModel extends model
|
||||
$this->processCreatedInfo();
|
||||
$this->processCreatedBy();
|
||||
$this->updateApproval();
|
||||
$this->recordOSAndBrowserOfBug();
|
||||
$this->rebuildFULLTEXT();
|
||||
$this->updateSearchIndex();
|
||||
if(!$executedXuanxuan)
|
||||
{
|
||||
$table = $this->config->db->prefix . 'im_chat';
|
||||
$exists = $this->checkFieldsExists($table, 'adminInvite');
|
||||
if(!$exists)
|
||||
{
|
||||
$this->dbh->query("ALTER TABLE $table ADD `adminInvite` enum('0','1') NOT NULL DEFAULT '0' AFTER `mergedChats`");
|
||||
}
|
||||
}
|
||||
break;
|
||||
case '17_5':
|
||||
$this->recordOSAndBrowserOfBug();
|
||||
@@ -685,9 +694,13 @@ class upgradeModel extends model
|
||||
$this->processFlowPosition();
|
||||
break;
|
||||
case 'biz7.4':
|
||||
$this->processCreatedInfo();
|
||||
$this->processCreatedBy();
|
||||
$this->updateApproval();
|
||||
$this->addDefaultRuleToWorkflow();
|
||||
$this->addFlowActions('biz7.3');
|
||||
$this->processReviewLinkages();
|
||||
$this->addFlowActions('biz7.4');
|
||||
$this->addFlowFields('biz7.4');
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3201,25 +3214,25 @@ class upgradeModel extends model
|
||||
{
|
||||
$fromVersion = $this->config->installedVersion;
|
||||
$needProcess = array();
|
||||
if(strpos($fromVersion, 'max') === false and strpos($fromVersion, 'biz') === false and (strpos($fromVersion, 'pro') === false ? version_compare($fromVersion, '8.3', '<') : version_compare($fromVersion, 'pro5.4', '<'))) $needProcess['updateFile'] = true;
|
||||
if(strpos($fromVersion, 'max') === false and strpos($fromVersion, 'biz') === false and (strpos($fromVersion, 'pro') === false ? version_compare($fromVersion, '8.3', '<') : version_compare($fromVersion, 'pro5.4', '<'))) $needProcess['updateFile'] = 'process';
|
||||
if(strpos($fromVersion, 'max') === false and $this->config->systemMode == 'new')
|
||||
{
|
||||
if(strpos($fromVersion, 'pro') !== false)
|
||||
{
|
||||
if(version_compare($fromVersion, 'pro10.0', '<')) $needProcess['search'] = true;
|
||||
if(version_compare($fromVersion, 'pro10.0', '<')) $needProcess['search'] = 'notice';
|
||||
}
|
||||
elseif(strpos($fromVersion, 'biz') !== false)
|
||||
{
|
||||
if(version_compare($fromVersion, 'biz5.0', '<')) $needProcess['search'] = true;
|
||||
if(version_compare($fromVersion, 'biz5.0', '<')) $needProcess['search'] = 'notice';
|
||||
}
|
||||
elseif(version_compare($fromVersion, '15.0.rc1', '<'))
|
||||
{
|
||||
$needProcess['search'] = true;
|
||||
$needProcess['search'] = 'notice';
|
||||
}
|
||||
}
|
||||
|
||||
$openVersion = $this->getOpenVersion($fromVersion);
|
||||
if(version_compare($openVersion, '17_4', '<=')) $needProcess['changeEngine'] = true;
|
||||
if(version_compare($openVersion, '17_4', '<=')) $needProcess['changeEngine'] = 'notice';
|
||||
|
||||
return $needProcess;
|
||||
}
|
||||
@@ -4927,17 +4940,17 @@ class upgradeModel extends model
|
||||
|
||||
if(!$projectID) return print(js::alert($this->lang->upgrade->projectEmpty));
|
||||
|
||||
$this->dao->update(TABLE_BUG)->set('project')->eq($projectID)->where('product')->in($productIdList)->exec();
|
||||
$this->dao->update(TABLE_TESTREPORT)->set('project')->eq($projectID)->where('product')->in($productIdList)->exec();
|
||||
$this->dao->update(TABLE_TESTSUITE)->set('project')->eq($projectID)->where('product')->in($productIdList)->exec();
|
||||
$this->dao->update(TABLE_BUG)->set('project')->eq($projectID)->where('product')->in($productIdList)->andWhere('project')->eq(0)->exec();
|
||||
$this->dao->update(TABLE_TESTREPORT)->set('project')->eq($projectID)->where('product')->in($productIdList)->andWhere('project')->eq(0)->exec();
|
||||
$this->dao->update(TABLE_TESTSUITE)->set('project')->eq($projectID)->where('product')->in($productIdList)->andWhere('project')->eq(0)->exec();
|
||||
|
||||
/* Project linked objects. */
|
||||
$this->dao->update(TABLE_TASK)->set('project')->eq($projectID)->where('execution')->in($sprintIdList)->exec();
|
||||
$this->dao->update(TABLE_TASK)->set('project')->eq($projectID)->where('execution')->in($sprintIdList)->andWhere('project')->eq(0)->exec();
|
||||
$this->dao->update(TABLE_BUILD)->set('project')->eq($projectID)->where('execution')->in($sprintIdList)->andWhere('project')->eq(0)->exec();
|
||||
$this->dao->update(TABLE_BUG)->set('project')->eq($projectID)->where('execution')->in($sprintIdList)->exec();
|
||||
$this->dao->update(TABLE_DOC)->set('project')->eq($projectID)->set('type')->eq('execution')->where("lib IN(SELECT id from " . TABLE_DOCLIB . " WHERE type = 'project' and execution " . helper::dbIN($sprintIdList) . ')')->exec();
|
||||
$this->dao->update(TABLE_DOCLIB)->set('project')->eq($projectID)->where('type')->eq('execution')->andWhere('execution')->in($sprintIdList)->exec();
|
||||
$this->dao->update(TABLE_TESTTASK)->set('project')->eq($projectID)->where('execution')->in($sprintIdList)->exec();
|
||||
$this->dao->update(TABLE_DOC)->set('project')->eq($projectID)->set('type')->eq('execution')->where("lib IN(SELECT id from " . TABLE_DOCLIB . " WHERE type = 'project' and execution " . helper::dbIN($sprintIdList) . ')')->andWhere('project')->eq(0)->exec();
|
||||
$this->dao->update(TABLE_DOCLIB)->set('project')->eq($projectID)->where('type')->eq('execution')->andWhere('execution')->in($sprintIdList)->andWhere('project')->eq(0)->exec();
|
||||
$this->dao->update(TABLE_TESTTASK)->set('project')->eq($projectID)->where('execution')->in($sprintIdList)->andWhere('project')->eq(0)->exec();
|
||||
|
||||
/* Put sprint stories into project story mdoule. */
|
||||
$sprintStories = $this->dao->select('*')->from(TABLE_PROJECTSTORY)
|
||||
@@ -6988,4 +7001,121 @@ class upgradeModel extends model
|
||||
}
|
||||
return !dao::isError();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add flow fields.
|
||||
*
|
||||
* @param int $version
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function addFlowFields($version)
|
||||
{
|
||||
$this->loadModel('workflowfield');
|
||||
|
||||
$upgradeLang = $this->lang->workflowfield->upgrade[$version];
|
||||
$upgradeConfig = $this->config->workflowfield->upgrade[$version];
|
||||
|
||||
$now = helper::now();
|
||||
foreach($upgradeLang as $module => $fields)
|
||||
{
|
||||
$field = new stdclass();
|
||||
$field->buildin = '1';
|
||||
$field->role = 'buildin';
|
||||
$field->module = $module;
|
||||
$field->createdBy = $this->app->user->account;
|
||||
$field->createdDate = $now;
|
||||
|
||||
foreach($fields as $code => $name)
|
||||
{
|
||||
$field->field = $code;
|
||||
$field->name = $name;
|
||||
|
||||
$fieldConfig = isset($upgradeConfig[$module][$code]) ? $upgradeConfig[$module][$code] : array();
|
||||
foreach($fieldConfig as $key => $value) $field->$key = $value;
|
||||
|
||||
$this->dao->insert(TABLE_WORKFLOWFIELD)->data($field)->autoCheck()->exec();
|
||||
}
|
||||
}
|
||||
|
||||
return !dao::isError();
|
||||
}
|
||||
|
||||
/**
|
||||
* Process review linkages of approval.
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function processReviewLinkages()
|
||||
{
|
||||
$linkagePairs = $this->dao->select('id, linkages')->from(TABLE_WORKFLOWACTION)->where('action')->eq('approvalreview')->andWhere('role')->eq('approval')->fetchPairs();
|
||||
|
||||
$oldLinkages = array();
|
||||
$oldLinkages[0]['sources'][0]['field'] = 'reviewResult';
|
||||
$oldLinkages[0]['sources'][0]['operator'] = '==';
|
||||
$oldLinkages[0]['sources'][0]['value'] = 'reject';
|
||||
$oldLinkages[0]['targets'][0]['field'] = 'reviewOpinion';
|
||||
$oldLinkages[0]['targets'][0]['status'] = 'show';
|
||||
|
||||
$newLinkages = array();
|
||||
$newLinkages[0]['sources'][0]['field'] = 'reviewResult';
|
||||
$newLinkages[0]['sources'][0]['operator'] = '==';
|
||||
$newLinkages[0]['sources'][0]['value'] = 'pass';
|
||||
$newLinkages[0]['targets'][0]['field'] = 'reviewOpinion';
|
||||
$newLinkages[0]['targets'][0]['status'] = 'hide';
|
||||
|
||||
foreach($linkagePairs as $id => $linkages)
|
||||
{
|
||||
if(helper::jsonEncode($oldLinkages) == $linkages)
|
||||
{
|
||||
$this->dao->update(TABLE_WORKFLOWACTION)->set('linkages')->eq(helper::jsonEncode($newLinkages))->where('id')->eq($id)->exec();
|
||||
}
|
||||
}
|
||||
|
||||
return !dao::isError();
|
||||
}
|
||||
|
||||
/**
|
||||
* Change FULLTEXT index for searchindex table.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function rebuildFULLTEXT()
|
||||
{
|
||||
try
|
||||
{
|
||||
$table = TABLE_SEARCHINDEX;
|
||||
$stmt = $this->dao->query("show index from $table");
|
||||
$indexes = array();
|
||||
while($index = $stmt->fetch())
|
||||
{
|
||||
if($index->Index_type != 'FULLTEXT') continue;
|
||||
$indexes[$index->Key_name] = $index->Key_name;
|
||||
}
|
||||
|
||||
if(!isset($indexes['title_content'])) $this->dao->exec( "ALTER TABLE {$table} ADD FULLTEXT `title_content` (`title`, `content`)");
|
||||
if(isset($indexes['title'])) $this->dao->exec( "ALTER TABLE {$table} DROP INDEX `title`");
|
||||
if(isset($indexes['content'])) $this->dao->exec( "ALTER TABLE {$table} DROP INDEX `content`");
|
||||
}
|
||||
catch(PDOException $e){}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether the field exists.
|
||||
*
|
||||
* @param string $table
|
||||
* @param string $field
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function checkFieldsExists($table, $field)
|
||||
{
|
||||
$result = $this->dbh->query("show columns from `$table` like '$field'");
|
||||
|
||||
return $result->rowCount() > 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,10 +35,10 @@ $(function()
|
||||
finishedShow();
|
||||
})
|
||||
<?php
|
||||
foreach($needProcess as $processKey => $value)
|
||||
foreach($needProcess as $processKey => $processType)
|
||||
{
|
||||
$value = $processKey == 'search' ? 'true' : 'false';
|
||||
echo 'var ' . $processKey . "Finish = $value;\n";
|
||||
if($processType == 'notice') continue;
|
||||
echo 'var ' . $processKey . "Finish = false;\n";
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -52,9 +52,9 @@ function initHideHome()
|
||||
{
|
||||
var hide = false;
|
||||
<?php
|
||||
foreach($needProcess as $processKey => $value)
|
||||
foreach($needProcess as $processKey => $processType)
|
||||
{
|
||||
if($processKey == 'search') continue;
|
||||
if($processType == 'notice') continue;
|
||||
echo "hide = true;\n";
|
||||
break;
|
||||
}
|
||||
@@ -76,8 +76,9 @@ function finishedShow()
|
||||
{
|
||||
var show = true;
|
||||
<?php
|
||||
foreach($needProcess as $processKey => $value)
|
||||
foreach($needProcess as $processKey => $processType)
|
||||
{
|
||||
if($processType == 'notice') continue;
|
||||
echo "if({$processKey}Finish == false) show = false;\n";
|
||||
}
|
||||
?>
|
||||
@@ -91,45 +92,8 @@ function finishedShow()
|
||||
<?php if(isset($needProcess['changeEngine'])):?>
|
||||
$(function()
|
||||
{
|
||||
$('.col-md-6:first').append("<div id='changeEngineBox' class='alert alert-info'><p><?php echo $lang->upgrade->changeEngine;?></p><div class='info'></div></div>");
|
||||
changeEngine();
|
||||
$('.col-md-6:first').append("<div class='alert alert-info'><p><?php echo $lang->upgrade->needChangeEngine;?></p></div>");
|
||||
})
|
||||
function changeEngine()
|
||||
{
|
||||
var link = '<?php echo inlink('ajaxChangeTableEngine')?>';
|
||||
var $infoBox = $('#changeEngineBox .info');
|
||||
$.ajax(
|
||||
{
|
||||
type: "GET",
|
||||
url: link,
|
||||
success: function(response)
|
||||
{
|
||||
response = JSON.parse(response);
|
||||
if(response == null)
|
||||
{
|
||||
changeEngineFinish = true;
|
||||
finishedShow();
|
||||
}
|
||||
else if(response.result == 'finished')
|
||||
{
|
||||
changeEngineFinish = true;
|
||||
$infoBox.prepend("<div class='text-success'>" + response.message + "</div>");
|
||||
finishedShow();
|
||||
}
|
||||
else
|
||||
{
|
||||
if($infoBox.find('.' + response.table).length == 0) $infoBox.prepend("<div class='text-success " + response.table + "'></div>");
|
||||
$infoBox.find('.' + response.table).html(response.message);
|
||||
if(response.next) $infoBox.prepend("<div class='text-success " + response.next + "'>" + response.nextMessage + "</div>");
|
||||
changeEngine();
|
||||
}
|
||||
},
|
||||
error: function()
|
||||
{
|
||||
changeEngine();
|
||||
}
|
||||
})
|
||||
}
|
||||
<?php endif;?>
|
||||
<?php if(isset($needProcess['updateFile'])):?>
|
||||
$(function()
|
||||
|
||||
@@ -796,6 +796,7 @@ class userModel extends model
|
||||
}
|
||||
|
||||
$this->dao->update(TABLE_USER)->data($user)->autoCheck()->where('id')->eq((int)$userID)->exec();
|
||||
$_SESSION['user']->password = $user->password;
|
||||
$this->app->user->password = $user->password;
|
||||
$this->app->user->modifyPassword = false;
|
||||
if(!dao::isError())
|
||||
|
||||
+149
-25
@@ -52,6 +52,23 @@ class actionTest
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the unread actions.
|
||||
*
|
||||
* @param int $actionID
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function getUnreadActionsTest($actionID = 0)
|
||||
{
|
||||
$objects = $this->objectModel->getUnreadActions($actionID);
|
||||
$objects = json_decode($objects);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test get product, project, execution of the object.
|
||||
*
|
||||
@@ -89,6 +106,8 @@ class actionTest
|
||||
|
||||
$objects[$objectID]->extra = str_replace($dirname, '', $objects[$objectID]->extra);
|
||||
$objects[$objectID]->extra = trim($objects[$objectID]->extra, "\n");
|
||||
if(strpos($objects[$objectID]->extra, 'href') !== false) $objects[$objectID]->extra = 'a';
|
||||
|
||||
return $objects[$objectID];
|
||||
}
|
||||
|
||||
@@ -128,6 +147,26 @@ class actionTest
|
||||
return $object;
|
||||
}
|
||||
|
||||
/**
|
||||
* getTrashesBySearchTest
|
||||
*
|
||||
* @param string $objectType
|
||||
* @param string $type all|hidden
|
||||
* @param int $queryID
|
||||
* @param string $orderBy
|
||||
* @param object $pager
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getTrashesBySearchTest($objectType, $type, $queryID, $orderBy, $pager = null)
|
||||
{
|
||||
$objects = $this->objectModel->getTrashesBySearch($objectType, $type, $queryID, $orderBy, $pager);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test get deleted objects.
|
||||
*
|
||||
@@ -198,6 +237,44 @@ class actionTest
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get dynamic show action.
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getActionConditionTest()
|
||||
{
|
||||
$objects = $this->objectModel->getActionCondition();
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get dynamic by search.
|
||||
*
|
||||
* @param array $products
|
||||
* @param array $projects
|
||||
* @param array $executions
|
||||
* @param int $queryID
|
||||
* @param string $orderBy
|
||||
* @param object $pager
|
||||
* @param string $date
|
||||
* @param string $direction
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getDynamicBySearchTest($products, $projects, $executions, $queryID, $orderBy = 'date_desc', $pager = null, $date = '', $direction = 'next')
|
||||
{
|
||||
$objects = $this->objectModel->getDynamicBySearch($products, $projects, $executions, $queryID, $orderBy, $pager, $date, $direction);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test get actions as dynamic.
|
||||
*
|
||||
@@ -297,31 +374,6 @@ class actionTest
|
||||
return $object;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test set objectLink.
|
||||
*
|
||||
* @param int $actionID
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function setObjectLinkTest($actionID)
|
||||
{
|
||||
global $tester;
|
||||
$deptUsers = isset($tester->app->user->dept) ? $tester->loadModel('dept')->getDeptUserPairs($tester->app->user->dept, 'id') : '';
|
||||
|
||||
$action = $this->objectModel->getByID($actionID);
|
||||
$action->objectLabel = $this->objectModel->getObjectLabel($action->objectType, $action->objectID, $action->action, array('25' => '25'));
|
||||
|
||||
$object = $this->objectModel->setObjectLink($action, $deptUsers);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
$dirname = dirname(__DIR__) . DS;
|
||||
|
||||
$object->objectLink = str_replace($dirname, '', $object->objectLink);
|
||||
return $object;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test compute the begin date and end date of a period.
|
||||
*
|
||||
@@ -351,6 +403,25 @@ class actionTest
|
||||
if($period == 'lastweek') return $date['begin'] == $begin and $date['end'] == $end . ' 23:59:59';
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete action by objectType.
|
||||
*
|
||||
* @param string $objectType
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function deleteByTypeTest($objectType)
|
||||
{
|
||||
$this->objectModel->deleteByType($objectType);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
global $tester;
|
||||
$objects = $tester->dao->select('*')->from(TABLE_ACTION)->where('objectType')->eq($objectType)->fetchAll();
|
||||
|
||||
return empty($objects);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test undelete a record.
|
||||
*
|
||||
@@ -423,6 +494,59 @@ class actionTest
|
||||
return $object;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Has pre or next.
|
||||
*
|
||||
* @param string $date
|
||||
* @param string $direction
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function hasPreOrNextTest($date, $direction = 'next')
|
||||
{
|
||||
global $tester;
|
||||
$tester->session->set('actionQueryCondition', '1=1');
|
||||
$result = $this->objectModel->hasPreOrNext($date, $direction);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save global search object index information.
|
||||
*
|
||||
* @param string $objectType
|
||||
* @param int $objectID
|
||||
* @param string $actionType
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function saveIndexTest($objectType, $objectID, $actionType)
|
||||
{
|
||||
$result = $this->objectModel->saveIndex($objectType, $objectID, $actionType);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process dynamic for API.
|
||||
*
|
||||
* @param array $dynamics
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function processDynamicForAPITest($dynamics)
|
||||
{
|
||||
$objects = $this->objectModel->processDynamicForAPI($dynamics);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return empty($objects) ? $objects : $objects[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test build date group by actions.
|
||||
*
|
||||
|
||||
@@ -213,13 +213,12 @@ class apiTest
|
||||
public function getReleaseListByApiTest($libID, $id = 0, $confirm = true)
|
||||
{
|
||||
$objects = $this->objectModel->getReleaseListByApi($libID);
|
||||
a($objects);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
if($confirm) $this->objectModel->deleteRelease($objects[$id]->id);
|
||||
|
||||
return $objects;
|
||||
return $objects[$id];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+107
-36
@@ -158,7 +158,7 @@ class blockTest
|
||||
$object->blockversion = $tester->loadModel('setting')->getItem("owner=$account&module=$module§ion=block&key=initVersion");
|
||||
|
||||
$blockData = $this->objectModel->getBlockList($module, $type);
|
||||
$object->blockData = current($blockData);
|
||||
$object->blockData = empty($module) ? 0 : current($blockData);
|
||||
|
||||
return $object;
|
||||
}
|
||||
@@ -311,6 +311,12 @@ class blockTest
|
||||
return $objects->count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get project params.
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getProjectParamsTest()
|
||||
{
|
||||
$objects = $this->objectModel->getProjectParams();
|
||||
@@ -320,6 +326,12 @@ class blockTest
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get project team params.
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getProjectTeamParamsTest()
|
||||
{
|
||||
$objects = $this->objectModel->getProjectTeamParams();
|
||||
@@ -364,13 +376,37 @@ class blockTest
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get product params.
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getProductParamsTest()
|
||||
{
|
||||
$objects = $this->objectModel->getProductParams();
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
$return = '';
|
||||
$objects = json_decode($objects);
|
||||
foreach($objects as $type => $params)
|
||||
{
|
||||
$return .= "$type:{";
|
||||
foreach($params as $param => $paramValue)
|
||||
{
|
||||
if(is_object($paramValue))
|
||||
{
|
||||
foreach($paramValue as $key => $value) $return .= "$key=>$value,";
|
||||
}
|
||||
else
|
||||
{
|
||||
$return .= "$param:$paramValue,";
|
||||
}
|
||||
}
|
||||
$return = trim($return, ',');
|
||||
$return .= '};';
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -389,13 +425,37 @@ class blockTest
|
||||
return json_encode(json_decode($objects), JSON_UNESCAPED_UNICODE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get product statistic params.
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getProductStatisticParamsTest()
|
||||
{
|
||||
$objects = $this->objectModel->getProductStatisticParams();
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
$return = '';
|
||||
$objects = json_decode($objects);
|
||||
foreach($objects as $type => $params)
|
||||
{
|
||||
$return .= "$type:{";
|
||||
foreach($params as $param => $paramValue)
|
||||
{
|
||||
if(is_object($paramValue))
|
||||
{
|
||||
foreach($paramValue as $key => $value) $return .= "$key=>$value,";
|
||||
}
|
||||
else
|
||||
{
|
||||
$return .= "$param:$paramValue,";
|
||||
}
|
||||
}
|
||||
$return = trim($return, ',');
|
||||
$return .= '};';
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -428,6 +488,12 @@ class blockTest
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get qa statistic params.
|
||||
*
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function getQaStatisticParamsTest()
|
||||
{
|
||||
$object = $this->objectModel->getQaStatisticParams();
|
||||
@@ -437,15 +503,6 @@ class blockTest
|
||||
return json_decode($object);
|
||||
}
|
||||
|
||||
public function getRecentProjectParamsTest()
|
||||
{
|
||||
$objects = $this->objectModel->getRecentProjectParams();
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test get waterfall issue param.
|
||||
*
|
||||
@@ -578,6 +635,13 @@ class blockTest
|
||||
return $bool ? 1 : 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check API for ranzhi.
|
||||
*
|
||||
* @param string $hash
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function checkAPITest($hash)
|
||||
{
|
||||
$objects = $this->objectModel->checkAPI($hash);
|
||||
@@ -602,6 +666,13 @@ class blockTest
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get scrum project list params.
|
||||
*
|
||||
* @param string $module
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getScrumListParamsTest($module = '')
|
||||
{
|
||||
$objects = $this->objectModel->getScrumListParams($module = '');
|
||||
@@ -613,15 +684,6 @@ class blockTest
|
||||
return $objects->type;
|
||||
}
|
||||
|
||||
public function getScrumOverviewParamsTest($module = '')
|
||||
{
|
||||
$objects = $this->objectModel->getScrumOverviewParams($module = '');
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get scrum roadmap list params.
|
||||
*
|
||||
@@ -652,22 +714,31 @@ class blockTest
|
||||
return $objects;
|
||||
}
|
||||
|
||||
public function getProjectDynamicParamsTest($module = '')
|
||||
public function getProjectDynamicParamsTest()
|
||||
{
|
||||
$objects = $this->objectModel->getProjectDynamicParams($module = '');
|
||||
|
||||
$objects = $this->objectModel->getProjectDynamicParams();
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
}
|
||||
|
||||
public function getSprintParamsTest($module = '')
|
||||
{
|
||||
$objects = $this->objectModel->getSprintParams($module = '');
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
$return = '';
|
||||
$objects = json_decode($objects);
|
||||
foreach($objects as $type => $params)
|
||||
{
|
||||
$return .= "$type:{";
|
||||
foreach($params as $param => $paramValue)
|
||||
{
|
||||
if(is_object($paramValue))
|
||||
{
|
||||
foreach($paramValue as $key => $value) $return .= "$key=>$value,";
|
||||
}
|
||||
else
|
||||
{
|
||||
$return .= "$param:$paramValue,";
|
||||
}
|
||||
}
|
||||
$return = trim($return, ',');
|
||||
$return .= '};';
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -318,6 +318,24 @@ class branchTest
|
||||
return $objects ? 1 : 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test check branch data.
|
||||
*
|
||||
* @param int $branchID
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
public function setDefaultTest($productID, $branchID)
|
||||
{
|
||||
$this->objectModel->setDefault($productID, $branchID);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
$object = $this->objectModel->getById($branchID, $productID, '');
|
||||
|
||||
return $object;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test get branches of product which linked project.
|
||||
*
|
||||
|
||||
@@ -7,28 +7,11 @@ class caselibTest
|
||||
$this->objectModel = $tester->loadModel('caselib');
|
||||
}
|
||||
|
||||
/**
|
||||
* Set lib menu test.
|
||||
*
|
||||
* @param mixed $libraries
|
||||
* @param mixed $libID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function setLibMenuTest($libraries, $libID)
|
||||
{
|
||||
$objects = $this->objectModel->setLibMenu($libraries, $libID);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save lib state test.
|
||||
*
|
||||
* @param int $libID
|
||||
* @param array $libraries
|
||||
*
|
||||
* @param int $libID
|
||||
* @param array $libraries
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -43,9 +26,9 @@ class caselibTest
|
||||
|
||||
/**
|
||||
* Get by ID test.
|
||||
*
|
||||
* @param mixed $libID
|
||||
* @param mixed $setImgSize
|
||||
*
|
||||
* @param mixed $libID
|
||||
* @param mixed $setImgSize
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -60,8 +43,8 @@ class caselibTest
|
||||
|
||||
/**
|
||||
* Update test.
|
||||
*
|
||||
* @param mixed $libID
|
||||
*
|
||||
* @param mixed $libID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -78,9 +61,9 @@ class caselibTest
|
||||
|
||||
/**
|
||||
* Delete test.
|
||||
*
|
||||
* @param mixed $libID
|
||||
* @param string $table
|
||||
*
|
||||
* @param mixed $libID
|
||||
* @param string $table
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -97,7 +80,7 @@ class caselibTest
|
||||
|
||||
/**
|
||||
* Get libraries test.
|
||||
*
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -112,9 +95,9 @@ class caselibTest
|
||||
|
||||
/**
|
||||
* Get list test.
|
||||
*
|
||||
* @param string $orderBy
|
||||
* @param mixed $pager
|
||||
*
|
||||
* @param string $orderBy
|
||||
* @param mixed $pager
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -129,8 +112,8 @@ class caselibTest
|
||||
|
||||
/**
|
||||
* Create test.
|
||||
*
|
||||
* @param mixed $param
|
||||
*
|
||||
* @param mixed $param
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -149,13 +132,13 @@ class caselibTest
|
||||
|
||||
/**
|
||||
* Get libcases test.
|
||||
*
|
||||
* @param mixed $libID
|
||||
* @param mixed $browseType
|
||||
* @param int $queryID
|
||||
* @param int $moduleID
|
||||
* @param string $sort
|
||||
* @param mixed $pager
|
||||
*
|
||||
* @param mixed $libID
|
||||
* @param mixed $browseType
|
||||
* @param int $queryID
|
||||
* @param int $moduleID
|
||||
* @param string $sort
|
||||
* @param mixed $pager
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -168,47 +151,10 @@ class caselibTest
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build searchform test.
|
||||
*
|
||||
* @param mixed $libID
|
||||
* @param mixed $libraries
|
||||
* @param mixed $queryID
|
||||
* @param mixed $actionURL
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function buildSearchFormTest($libID, $libraries, $queryID, $actionURL)
|
||||
{
|
||||
$objects = $this->objectModel->buildSearchForm($libID, $libraries, $queryID, $actionURL);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get liblink test.
|
||||
*
|
||||
* @param mixed $module
|
||||
* @param mixed $method
|
||||
* @param mixed $extra
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getLibLinkTest($module, $method, $extra)
|
||||
{
|
||||
$objects = $this->objectModel->getLibLink($module, $method, $extra);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create from import test.
|
||||
*
|
||||
* @param mixed $libID
|
||||
*
|
||||
* @param mixed $libID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -223,8 +169,8 @@ class caselibTest
|
||||
|
||||
/**
|
||||
* Batch create case test.
|
||||
*
|
||||
* @param mixed $libID
|
||||
*
|
||||
* @param mixed $libID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
|
||||
@@ -34,4 +34,5 @@ INSERT INTO `zt_config` (`id`, `vision`, `owner`, `module`, `section`, `key`, `v
|
||||
(33, 'rnd', 'system', 'common', 'global', 'skipIntroduction', ',admin'),
|
||||
(34, 'rnd', 'system', 'common', 'global', 'skipTutorial', ',admin'),
|
||||
(35, 'rnd', 'system', 'common', 'global', 'skipYoungBlueTheme', ',admin'),
|
||||
(36, 'rnd', 'system', 'common', 'global', ' scoreStatus', '1');
|
||||
(36, 'rnd', 'system', 'common', 'global', 'scoreStatus', '1'),
|
||||
(37, 'rnd', 'system', 'sso', '' , 'key', '858640a724c2c981983935eb2bbc4ad8');
|
||||
|
||||
@@ -33,6 +33,5 @@ r($action->createTest($objectTypeList[1], $objectIDList[1], $actionTypeList[1]))
|
||||
r($action->createTest($objectTypeList[2], $objectIDList[0], $actionTypeList[2])) && p('objectType,objectId,action,comment') && e('user,,login,'); // 测试创建user 1 login动态
|
||||
r($action->createTest($objectTypeList[3], $objectIDList[0], $actionTypeList[3])) && p('objectType,objectId,action,comment') && e('bug,,closed,'); // 测试创建bug 1 closed动态
|
||||
r($action->createTest($objectTypeList[4], $objectIDList[0], $actionTypeList[4], $comment)) && p('objectType,objectId,action,comment') && e('story,,comments,测试备注'); // 测试创建story 1 comment动态
|
||||
r($action->createTest($objectTypeList[4], $objectIDList[0], $actionTypeList[4])) && p() && e(''); // 测试创建story 1 comment动态 不填写备注
|
||||
r($action->createTest($objectTypeList[2], $objectIDList[0], $actionTypeList[5], '', '', $actor)) && p() && e('0'); // 测试创建游客 logout动态
|
||||
$db->restoreDB();
|
||||
$db->restoreDB();
|
||||
|
||||
Executable
+25
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
$db->switchDB();
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试 actionModel->deleteByType();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
测试删除object为空动态 >> 1
|
||||
测试删除objectType为story的动态 >> 1
|
||||
测试删除objectType为不存在的test的动态 >> 1
|
||||
|
||||
*/
|
||||
|
||||
$action = new actionTest();
|
||||
|
||||
r($action->deleteByTypeTest('')) && p() && e('1'); // 测试删除object为空动态
|
||||
r($action->deleteByTypeTest('story')) && p() && e('1'); // 测试删除objectType为story的动态
|
||||
r($action->deleteByTypeTest('test')) && p() && e('1'); // 测试删除objectType为不存在的test的动态
|
||||
$db->restoreDB();
|
||||
Executable
+19
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试 actionModel->getActionCondition();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
获取用户可以看到的动态的条件 >> 0
|
||||
|
||||
*/
|
||||
|
||||
$action = new actionTest();
|
||||
|
||||
r($action->getActionConditionTest()) && p() && e('0'); // 获取用户可以看到的动态的条件
|
||||
@@ -10,23 +10,23 @@ title=测试 actionModel->getDynamic();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
查找全部动态 >> 100
|
||||
查找用户admin动态 >> 34
|
||||
查找用户dev17动态 >> 33
|
||||
查找用户test18动态 >> 33
|
||||
查找全部动态 >> 90
|
||||
查找用户admin动态 >> 30
|
||||
查找用户dev17动态 >> 30
|
||||
查找用户test18动态 >> 30
|
||||
查找今天的动态 >> 3
|
||||
查找昨天的动态 >> 3
|
||||
查找上周的动态 >> 21
|
||||
查找产品1的动态 >> 1
|
||||
查找产品2的动态 >> 1
|
||||
查找产品3的动态 >> 1
|
||||
查找项目1的动态 >> 1
|
||||
查找项目2的动态 >> 1
|
||||
查找项目3的动态 >> 1
|
||||
查找产品1的动态 >> 0
|
||||
查找产品2的动态 >> 0
|
||||
查找产品3的动态 >> 0
|
||||
查找项目1的动态 >> 0
|
||||
查找项目2的动态 >> 0
|
||||
查找项目3的动态 >> 0
|
||||
查找执行1的动态 >> 0
|
||||
查找执行2的动态 >> 0
|
||||
查找执行3的动态 >> 0
|
||||
查找今天的动态 >> 97
|
||||
查找今天的动态 >> 87
|
||||
|
||||
*/
|
||||
|
||||
@@ -39,20 +39,20 @@ $dateList = array('', 'today');
|
||||
|
||||
$action = new actionTest();
|
||||
|
||||
r($action->getDynamicTest()) && p() && e('100'); // 查找全部动态
|
||||
r($action->getDynamicTest($accountList[1])) && p() && e('34'); // 查找用户admin动态
|
||||
r($action->getDynamicTest($accountList[2])) && p() && e('33'); // 查找用户dev17动态
|
||||
r($action->getDynamicTest($accountList[3])) && p() && e('33'); // 查找用户test18动态
|
||||
r($action->getDynamicTest()) && p() && e('90'); // 查找全部动态
|
||||
r($action->getDynamicTest($accountList[1])) && p() && e('30'); // 查找用户admin动态
|
||||
r($action->getDynamicTest($accountList[2])) && p() && e('30'); // 查找用户dev17动态
|
||||
r($action->getDynamicTest($accountList[3])) && p() && e('30'); // 查找用户test18动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[1])) && p() && e('3'); // 查找今天的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[2])) && p() && e('3'); // 查找昨天的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[3])) && p() && e('21'); // 查找上周的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[1])) && p() && e('1'); // 查找产品1的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[2])) && p() && e('1'); // 查找产品2的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[3])) && p() && e('1'); // 查找产品3的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[1])) && p() && e('1'); // 查找项目1的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[2])) && p() && e('1'); // 查找项目2的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[3])) && p() && e('1'); // 查找项目3的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[1])) && p() && e('0'); // 查找产品1的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[2])) && p() && e('0'); // 查找产品2的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[3])) && p() && e('0'); // 查找产品3的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[1])) && p() && e('0'); // 查找项目1的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[2])) && p() && e('0'); // 查找项目2的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[3])) && p() && e('0'); // 查找项目3的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[0], $executionIDList[1])) && p() && e('0'); // 查找执行1的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[0], $executionIDList[2])) && p() && e('0'); // 查找执行2的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[0], $executionIDList[3])) && p() && e('0'); // 查找执行3的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[0], $executionIDList[0], $dateList[1])) && p() && e('97'); // 查找今天的动态
|
||||
r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[0], $executionIDList[0], $dateList[1])) && p() && e('87'); // 查找今天的动态
|
||||
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试 actionModel->getDynamicBySearch();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
获取product all, project all, execution all排序为date倒序的所有动态 >> 64,testsuite
|
||||
获取product all, project all, execution all排序为date正序的所有动态 >> 33,case
|
||||
获取product 1, project all, execution all排序为date倒序的所有动态 >> 64,testsuite
|
||||
获取product 1, project all, execution all排序为date正序的所有动态 >> 33,case
|
||||
获取product all, project 1, execution all排序为date倒序的所有动态 >> 64,testsuite
|
||||
获取product all, project 1, execution all排序为date正序的所有动态 >> 33,case
|
||||
获取product all, project all, execution 1排序为date倒序的所有动态 >> 64,testsuite
|
||||
获取product all, project all, execution 1排序为date正序的所有动态 >> 33,case
|
||||
获取product all, project all, execution all排序为date倒序的今天之前的动态 >> 33,case
|
||||
获取product all, project all, execution all排序为date倒序的今天之后的动态 >> 0
|
||||
|
||||
*/
|
||||
|
||||
$products = array('all', 1, 2, 3);
|
||||
$projects = array('all', 1, 2, 3);
|
||||
$executions = array('all', 1, 2, 3);
|
||||
$queryID = 0;
|
||||
$orderByList = array('date_desc', 'date_asc');
|
||||
$pager = null;
|
||||
$dateList = array('', 'today');
|
||||
$directionList = array('next', 'pre');
|
||||
|
||||
$action = new actionTest();
|
||||
|
||||
r($action->getDynamicBySearchTest($products[0], $projects[0], $executions[0], $queryID, $orderByList[0], $pager, $dateList[0], $directionList[0])) && p('1:id,objectType') && e('64,testsuite'); // 获取product all, project all, execution all排序为date倒序的所有动态
|
||||
r($action->getDynamicBySearchTest($products[0], $projects[0], $executions[0], $queryID, $orderByList[1], $pager, $dateList[0], $directionList[0])) && p('1:id,objectType') && e('33,case'); // 获取product all, project all, execution all排序为date正序的所有动态
|
||||
r($action->getDynamicBySearchTest($products[1], $projects[0], $executions[0], $queryID, $orderByList[0], $pager, $dateList[0], $directionList[0])) && p('1:id,objectType') && e('64,testsuite'); // 获取product 1, project all, execution all排序为date倒序的所有动态
|
||||
r($action->getDynamicBySearchTest($products[1], $projects[0], $executions[0], $queryID, $orderByList[1], $pager, $dateList[0], $directionList[0])) && p('1:id,objectType') && e('33,case'); // 获取product 1, project all, execution all排序为date正序的所有动态
|
||||
r($action->getDynamicBySearchTest($products[0], $projects[1], $executions[0], $queryID, $orderByList[0], $pager, $dateList[0], $directionList[0])) && p('1:id,objectType') && e('64,testsuite'); // 获取product all, project 1, execution all排序为date倒序的所有动态
|
||||
r($action->getDynamicBySearchTest($products[0], $projects[1], $executions[0], $queryID, $orderByList[1], $pager, $dateList[0], $directionList[0])) && p('1:id,objectType') && e('33,case'); // 获取product all, project 1, execution all排序为date正序的所有动态
|
||||
r($action->getDynamicBySearchTest($products[0], $projects[0], $executions[1], $queryID, $orderByList[0], $pager, $dateList[0], $directionList[0])) && p('1:id,objectType') && e('64,testsuite'); // 获取product all, project all, execution 1排序为date倒序的所有动态
|
||||
r($action->getDynamicBySearchTest($products[0], $projects[0], $executions[1], $queryID, $orderByList[1], $pager, $dateList[0], $directionList[0])) && p('1:id,objectType') && e('33,case'); // 获取product all, project all, execution 1排序为date正序的所有动态
|
||||
r($action->getDynamicBySearchTest($products[0], $projects[0], $executions[0], $queryID, $orderByList[1], $pager, $dateList[1], $directionList[0])) && p('1:id,objectType') && e('33,case'); // 获取product all, project all, execution all排序为date倒序的今天之前的动态
|
||||
r($action->getDynamicBySearchTest($products[0], $projects[0], $executions[0], $queryID, $orderByList[1], $pager, $dateList[1], $directionList[1])) && p() && e('0'); // 获取product all, project all, execution all排序为date倒序的今天之后的动态
|
||||
@@ -27,11 +27,11 @@ pid=1
|
||||
测试获取objectType todo objectId 15的动态信息 >> 15,test18,1
|
||||
测试获取objectType branch objectId 16的动态信息 >> 16,admin,1
|
||||
测试获取objectType module objectId 17的动态信息 >> 17,dev17,1
|
||||
测试获取objectType testsuite objectId 18的动态信息 >> 18,test18,<a href='model/action/execution-task-1.' >#1 项目集1</a>
|
||||
测试获取objectType testsuite objectId 18的动态信息 >> 18,test18,a
|
||||
测试获取objectType caselib objectId 19的动态信息 >> 19,admin,1
|
||||
测试获取objectType testreport objectId 20的动态信息 >> 20,dev17,1
|
||||
测试获取objectType entry objectId 21的动态信息 >> 21,test18,1
|
||||
测试获取objectType webhook objectId 22的动态信息 >> 22,admin,<a href='model/action/bug-view-1.' >1</a>
|
||||
测试获取objectType webhook objectId 22的动态信息 >> 22,admin,a
|
||||
测试获取objectType review objectId 23的动态信息 >> 23,dev17,1
|
||||
测试获取objectType product objectId 24的动态信息 >> 24,test18,1
|
||||
测试获取objectType story objectId 25的动态信息 >> 25,admin,1
|
||||
@@ -48,7 +48,7 @@ pid=1
|
||||
测试获取objectType doc objectId 36的动态信息 >> 36,test18,1
|
||||
测试获取objectType doclib objectId 37的动态信息 >> 37,admin,1
|
||||
测试获取objectType todo objectId 38的动态信息 >> 38,dev17,1
|
||||
测试获取objectType branch objectId 39的动态信息 >> 39,test18,<a href='model/action/build-view-1-branch.' >项目版本版本1</a>
|
||||
测试获取objectType branch objectId 39的动态信息 >> 39,test18,a
|
||||
|
||||
*/
|
||||
|
||||
@@ -57,42 +57,42 @@ $objectId = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,
|
||||
|
||||
$action = new actionTest();
|
||||
|
||||
r($action->getListTest($objectType[0], $objectId[0])) && p('id,actor,extra') && e("1,admin,1"); // 测试获取objectType product objectId 1的动态信息
|
||||
r($action->getListTest($objectType[1], $objectId[1])) && p('id,actor,extra') && e("2,dev17,1"); // 测试获取objectType story objectId 2的动态信息
|
||||
r($action->getListTest($objectType[2], $objectId[2])) && p('id,actor,extra') && e("3,test18,1"); // 测试获取objectType productplan objectId 3的动态信息
|
||||
r($action->getListTest($objectType[3], $objectId[3])) && p('id,actor,extra') && e("4,admin,1"); // 测试获取objectType release objectId 4的动态信息
|
||||
r($action->getListTest($objectType[4], $objectId[4])) && p('id,actor,extra') && e("5,dev17,11"); // 测试获取objectType project objectId 5的动态信息
|
||||
r($action->getListTest($objectType[5], $objectId[5])) && p('id,actor,extra') && e("6,test18,1"); // 测试获取objectType task objectId 6的动态信息
|
||||
r($action->getListTest($objectType[6], $objectId[6])) && p('id,actor,extra') && e("7,admin,1"); // 测试获取objectType build objectId 7的动态信息
|
||||
r($action->getListTest($objectType[7], $objectId[7])) && p('id,actor,extra') && e("8,dev17,1"); // 测试获取objectType bug objectId 8的动态信息
|
||||
r($action->getListTest($objectType[8], $objectId[8])) && p('id,actor,extra') && e("9,test18,2"); // 测试获取objectType testcase objectId 9的动态信息
|
||||
r($action->getListTest($objectType[9], $objectId[9])) && p('id,actor,extra') && e("10,admin,1"); // 测试获取objectType case objectId 10的动态信息
|
||||
r($action->getListTest($objectType[10], $objectId[10])) && p('id,actor,extra') && e("11,dev17,1"); // 测试获取objectType testtask objectId 11的动态信息
|
||||
r($action->getListTest($objectType[11], $objectId[11])) && p('id,actor,extra') && e("12,test18,1"); // 测试获取objectType user objectId 12的动态信息
|
||||
r($action->getListTest($objectType[12], $objectId[12])) && p('id,actor,extra') && e("13,admin,1"); // 测试获取objectType doc objectId 13的动态信息
|
||||
r($action->getListTest($objectType[13], $objectId[13])) && p('id,actor,extra') && e("14,dev17,1"); // 测试获取objectType doclib objectId 14的动态信息
|
||||
r($action->getListTest($objectType[14], $objectId[14])) && p('id,actor,extra') && e("15,test18,1"); // 测试获取objectType todo objectId 15的动态信息
|
||||
r($action->getListTest($objectType[15], $objectId[15])) && p('id,actor,extra') && e("16,admin,1"); // 测试获取objectType branch objectId 16的动态信息
|
||||
r($action->getListTest($objectType[16], $objectId[16])) && p('id,actor,extra') && e("17,dev17,1"); // 测试获取objectType module objectId 17的动态信息
|
||||
r($action->getListTest($objectType[17], $objectId[17])) && p('id,actor,extra') && e("18,test18,<a href='model/action/execution-task-1.' >#1 项目集1</a>"); // 测试获取objectType testsuite objectId 18的动态信息
|
||||
r($action->getListTest($objectType[18], $objectId[18])) && p('id,actor,extra') && e("19,admin,1"); // 测试获取objectType caselib objectId 19的动态信息
|
||||
r($action->getListTest($objectType[19], $objectId[19])) && p('id,actor,extra') && e("20,dev17,1"); // 测试获取objectType testreport objectId 20的动态信息
|
||||
r($action->getListTest($objectType[20], $objectId[20])) && p('id,actor,extra') && e("21,test18,1"); // 测试获取objectType entry objectId 21的动态信息
|
||||
r($action->getListTest($objectType[21], $objectId[21])) && p('id,actor,extra') && e("22,admin,<a href='model/action/bug-view-1.' >1</a>"); // 测试获取objectType webhook objectId 22的动态信息
|
||||
r($action->getListTest($objectType[22], $objectId[22])) && p('id,actor,extra') && e("23,dev17,1"); // 测试获取objectType review objectId 23的动态信息
|
||||
r($action->getListTest($objectType[0], $objectId[23])) && p('id,actor,extra') && e("24,test18,1"); // 测试获取objectType product objectId 24的动态信息
|
||||
r($action->getListTest($objectType[1], $objectId[24])) && p('id,actor,extra') && e("25,admin,1"); // 测试获取objectType story objectId 25的动态信息
|
||||
r($action->getListTest($objectType[2], $objectId[25])) && p('id,actor,extra') && e("26,dev17,1"); // 测试获取objectType productplan objectId 26的动态信息
|
||||
r($action->getListTest($objectType[3], $objectId[26])) && p('id,actor,extra') && e("27,test18,1"); // 测试获取objectType release objectId 27的动态信息
|
||||
r($action->getListTest($objectType[4], $objectId[27])) && p('id,actor,extra') && e("28,admin,33"); // 测试获取objectType project objectId 28的动态信息
|
||||
r($action->getListTest($objectType[5], $objectId[28])) && p('id,actor,extra') && e("29,dev17,1"); // 测试获取objectType task objectId 29的动态信息
|
||||
r($action->getListTest($objectType[6], $objectId[29])) && p('id,actor,extra') && e("30,test18,1"); // 测试获取objectType build objectId 30的动态信息
|
||||
r($action->getListTest($objectType[7], $objectId[30])) && p('id,actor,extra') && e("31,admin,1"); // 测试获取objectType bug objectId 31的动态信息
|
||||
r($action->getListTest($objectType[8], $objectId[31])) && p('id,actor,extra') && e("32,项目经理17,1"); // 测试获取objectType testcase objectId 32的动态信息
|
||||
r($action->getListTest($objectType[9], $objectId[32])) && p('id,actor,extra') && e("33,test18,1"); // 测试获取objectType case objectId 33的动态信息
|
||||
r($action->getListTest($objectType[10], $objectId[33])) && p('id,actor,extra') && e("34,admin,1"); // 测试获取objectType testtask objectId 34的动态信息
|
||||
r($action->getListTest($objectType[11], $objectId[34])) && p('id,actor,extra') && e("35,dev17,1"); // 测试获取objectType user objectId 35的动态信息
|
||||
r($action->getListTest($objectType[12], $objectId[35])) && p('id,actor,extra') && e("36,test18,1"); // 测试获取objectType doc objectId 36的动态信息
|
||||
r($action->getListTest($objectType[13], $objectId[36])) && p('id,actor,extra') && e("37,admin,1"); // 测试获取objectType doclib objectId 37的动态信息
|
||||
r($action->getListTest($objectType[14], $objectId[37])) && p('id,actor,extra') && e("38,dev17,1"); // 测试获取objectType todo objectId 38的动态信息
|
||||
r($action->getListTest($objectType[15], $objectId[38])) && p('id,actor,extra') && e("39,test18,<a href='model/action/build-view-1-branch.' >项目版本版本1</a>"); // 测试获取objectType branch objectId 39的动态信息
|
||||
r($action->getListTest($objectType[0], $objectId[0])) && p('id,actor,extra') && e("1,admin,1"); // 测试获取objectType product objectId 1的动态信息
|
||||
r($action->getListTest($objectType[1], $objectId[1])) && p('id,actor,extra') && e("2,dev17,1"); // 测试获取objectType story objectId 2的动态信息
|
||||
r($action->getListTest($objectType[2], $objectId[2])) && p('id,actor,extra') && e("3,test18,1"); // 测试获取objectType productplan objectId 3的动态信息
|
||||
r($action->getListTest($objectType[3], $objectId[3])) && p('id,actor,extra') && e("4,admin,1"); // 测试获取objectType release objectId 4的动态信息
|
||||
r($action->getListTest($objectType[4], $objectId[4])) && p('id,actor,extra') && e("5,dev17,11"); // 测试获取objectType project objectId 5的动态信息
|
||||
r($action->getListTest($objectType[5], $objectId[5])) && p('id,actor,extra') && e("6,test18,1"); // 测试获取objectType task objectId 6的动态信息
|
||||
r($action->getListTest($objectType[6], $objectId[6])) && p('id,actor,extra') && e("7,admin,1"); // 测试获取objectType build objectId 7的动态信息
|
||||
r($action->getListTest($objectType[7], $objectId[7])) && p('id,actor,extra') && e("8,dev17,1"); // 测试获取objectType bug objectId 8的动态信息
|
||||
r($action->getListTest($objectType[8], $objectId[8])) && p('id,actor,extra') && e("9,test18,2"); // 测试获取objectType testcase objectId 9的动态信息
|
||||
r($action->getListTest($objectType[9], $objectId[9])) && p('id,actor,extra') && e("10,admin,1"); // 测试获取objectType case objectId 10的动态信息
|
||||
r($action->getListTest($objectType[10], $objectId[10])) && p('id,actor,extra') && e("11,dev17,1"); // 测试获取objectType testtask objectId 11的动态信息
|
||||
r($action->getListTest($objectType[11], $objectId[11])) && p('id,actor,extra') && e("12,test18,1"); // 测试获取objectType user objectId 12的动态信息
|
||||
r($action->getListTest($objectType[12], $objectId[12])) && p('id,actor,extra') && e("13,admin,1"); // 测试获取objectType doc objectId 13的动态信息
|
||||
r($action->getListTest($objectType[13], $objectId[13])) && p('id,actor,extra') && e("14,dev17,1"); // 测试获取objectType doclib objectId 14的动态信息
|
||||
r($action->getListTest($objectType[14], $objectId[14])) && p('id,actor,extra') && e("15,test18,1"); // 测试获取objectType todo objectId 15的动态信息
|
||||
r($action->getListTest($objectType[15], $objectId[15])) && p('id,actor,extra') && e("16,admin,1"); // 测试获取objectType branch objectId 16的动态信息
|
||||
r($action->getListTest($objectType[16], $objectId[16])) && p('id,actor,extra') && e("17,dev17,1"); // 测试获取objectType module objectId 17的动态信息
|
||||
r($action->getListTest($objectType[17], $objectId[17])) && p('id,actor,extra') && e("18,test18,a"); // 测试获取objectType testsuite objectId 18的动态信息
|
||||
r($action->getListTest($objectType[18], $objectId[18])) && p('id,actor,extra') && e("19,admin,1"); // 测试获取objectType caselib objectId 19的动态信息
|
||||
r($action->getListTest($objectType[19], $objectId[19])) && p('id,actor,extra') && e("20,dev17,1"); // 测试获取objectType testreport objectId 20的动态信息
|
||||
r($action->getListTest($objectType[20], $objectId[20])) && p('id,actor,extra') && e("21,test18,1"); // 测试获取objectType entry objectId 21的动态信息
|
||||
r($action->getListTest($objectType[21], $objectId[21])) && p('id,actor,extra') && e("22,admin,a"); // 测试获取objectType webhook objectId 22的动态信息
|
||||
r($action->getListTest($objectType[22], $objectId[22])) && p('id,actor,extra') && e("23,dev17,1"); // 测试获取objectType review objectId 23的动态信息
|
||||
r($action->getListTest($objectType[0], $objectId[23])) && p('id,actor,extra') && e("24,test18,1"); // 测试获取objectType product objectId 24的动态信息
|
||||
r($action->getListTest($objectType[1], $objectId[24])) && p('id,actor,extra') && e("25,admin,1"); // 测试获取objectType story objectId 25的动态信息
|
||||
r($action->getListTest($objectType[2], $objectId[25])) && p('id,actor,extra') && e("26,dev17,1"); // 测试获取objectType productplan objectId 26的动态信息
|
||||
r($action->getListTest($objectType[3], $objectId[26])) && p('id,actor,extra') && e("27,test18,1"); // 测试获取objectType release objectId 27的动态信息
|
||||
r($action->getListTest($objectType[4], $objectId[27])) && p('id,actor,extra') && e("28,admin,33"); // 测试获取objectType project objectId 28的动态信息
|
||||
r($action->getListTest($objectType[5], $objectId[28])) && p('id,actor,extra') && e("29,dev17,1"); // 测试获取objectType task objectId 29的动态信息
|
||||
r($action->getListTest($objectType[6], $objectId[29])) && p('id,actor,extra') && e("30,test18,1"); // 测试获取objectType build objectId 30的动态信息
|
||||
r($action->getListTest($objectType[7], $objectId[30])) && p('id,actor,extra') && e("31,admin,1"); // 测试获取objectType bug objectId 31的动态信息
|
||||
r($action->getListTest($objectType[8], $objectId[31])) && p('id,actor,extra') && e("32,项目经理17,1"); // 测试获取objectType testcase objectId 32的动态信息
|
||||
r($action->getListTest($objectType[9], $objectId[32])) && p('id,actor,extra') && e("33,test18,1"); // 测试获取objectType case objectId 33的动态信息
|
||||
r($action->getListTest($objectType[10], $objectId[33])) && p('id,actor,extra') && e("34,admin,1"); // 测试获取objectType testtask objectId 34的动态信息
|
||||
r($action->getListTest($objectType[11], $objectId[34])) && p('id,actor,extra') && e("35,dev17,1"); // 测试获取objectType user objectId 35的动态信息
|
||||
r($action->getListTest($objectType[12], $objectId[35])) && p('id,actor,extra') && e("36,test18,1"); // 测试获取objectType doc objectId 36的动态信息
|
||||
r($action->getListTest($objectType[13], $objectId[36])) && p('id,actor,extra') && e("37,admin,1"); // 测试获取objectType doclib objectId 37的动态信息
|
||||
r($action->getListTest($objectType[14], $objectId[37])) && p('id,actor,extra') && e("38,dev17,1"); // 测试获取objectType todo objectId 38的动态信息
|
||||
r($action->getListTest($objectType[15], $objectId[38])) && p('id,actor,extra') && e("39,test18,a"); // 测试获取objectType branch objectId 39的动态信息
|
||||
|
||||
@@ -25,7 +25,7 @@ pid=1
|
||||
测试获取objectType doclib objectId 14的动态信息 >> 文档库|doc|tablecontents|type=%s&objectID=%s&libID=%s
|
||||
测试获取objectType todo objectId 15的动态信息 >> 待办|todo|view|todoID=%s
|
||||
测试获取objectType branch objectId 16的动态信息 >> branch
|
||||
测试获取objectType module objectId 17的动态信息 >> module
|
||||
测试获取objectType module objectId 17的动态信息 >> 模块|tree|browse|productid=%s&type=story¤tModuleID=0&branch=all
|
||||
测试获取objectType testsuite objectId 18的动态信息 >> 测试套件|testsuite|view|suiteID=%s
|
||||
测试获取objectType caselib objectId 19的动态信息 >> 用例库|caselib|view|libID=%s
|
||||
测试获取objectType testreport objectId 20的动态信息 >> 报告|testreport|view|report=%s
|
||||
@@ -43,26 +43,26 @@ $requirements = array('25' => '25');
|
||||
|
||||
$action = new actionTest();
|
||||
|
||||
r($action->getObjectLabelTest($objectType[0], $objectId[0], $actionType[0], $requirements)) && p() && e('产品|product|view|productID=%s'); // 测试获取objectType product objectId 1的动态信息
|
||||
r($action->getObjectLabelTest($objectType[1], $objectId[1], $actionType[1], $requirements)) && p() && e('研发需求|story|view|storyID=%s'); // 测试获取objectType story objectId 2的动态信息
|
||||
r($action->getObjectLabelTest($objectType[2], $objectId[2], $actionType[2], $requirements)) && p() && e('计划|productplan|view|productID=%s'); // 测试获取objectType productplan objectId 3的动态信息
|
||||
r($action->getObjectLabelTest($objectType[3], $objectId[3], $actionType[3], $requirements)) && p() && e('发布|release|view|productID=%s'); // 测试获取objectType release objectId 4的动态信息
|
||||
r($action->getObjectLabelTest($objectType[4], $objectId[4], $actionType[4], $requirements)) && p() && e('项目|project|index|projectID=%s'); // 测试获取objectType project objectId 5的动态信息
|
||||
r($action->getObjectLabelTest($objectType[5], $objectId[5], $actionType[5], $requirements)) && p() && e('任务|task|view|taskID=%s'); // 测试获取objectType task objectId 6的动态信息
|
||||
r($action->getObjectLabelTest($objectType[6], $objectId[6], $actionType[6], $requirements)) && p() && e('版本|build|view|buildID=%s'); // 测试获取objectType build objectId 7的动态信息
|
||||
r($action->getObjectLabelTest($objectType[7], $objectId[7], $actionType[7], $requirements)) && p() && e('Bug|bug|view|bugID=%s'); // 测试获取objectType bug objectId 8的动态信息
|
||||
r($action->getObjectLabelTest($objectType[8], $objectId[8], $actionType[8], $requirements)) && p() && e('testcase'); // 测试获取objectType testcase objectId 9的动态信息
|
||||
r($action->getObjectLabelTest($objectType[9], $objectId[9], $actionType[9], $requirements)) && p() && e('用例|testcase|view|caseID=%s'); // 测试获取objectType case objectId 10的动态信息
|
||||
r($action->getObjectLabelTest($objectType[10], $objectId[10], $actionType[10], $requirements)) && p() && e('测试单|testtask|view|caseID=%s'); // 测试获取objectType testtask objectId 11的动态信息
|
||||
r($action->getObjectLabelTest($objectType[11], $objectId[11], $actionType[11], $requirements)) && p() && e('用户|user|view|account=%s'); // 测试获取objectType user objectId 12的动态信息
|
||||
r($action->getObjectLabelTest($objectType[13], $objectId[13], $actionType[13], $requirements)) && p() && e('文档库|doc|tablecontents|type=%s&objectID=%s&libID=%s'); // 测试获取objectType doclib objectId 14的动态信息
|
||||
r($action->getObjectLabelTest($objectType[14], $objectId[14], $actionType[14], $requirements)) && p() && e('待办|todo|view|todoID=%s'); // 测试获取objectType todo objectId 15的动态信息
|
||||
r($action->getObjectLabelTest($objectType[15], $objectId[15], $actionType[15], $requirements)) && p() && e('branch'); // 测试获取objectType branch objectId 16的动态信息
|
||||
r($action->getObjectLabelTest($objectType[16], $objectId[16], $actionType[16], $requirements)) && p() && e('module'); // 测试获取objectType module objectId 17的动态信息
|
||||
r($action->getObjectLabelTest($objectType[17], $objectId[17], $actionType[17], $requirements)) && p() && e('测试套件|testsuite|view|suiteID=%s'); // 测试获取objectType testsuite objectId 18的动态信息
|
||||
r($action->getObjectLabelTest($objectType[18], $objectId[18], $actionType[18], $requirements)) && p() && e('用例库|caselib|view|libID=%s'); // 测试获取objectType caselib objectId 19的动态信息
|
||||
r($action->getObjectLabelTest($objectType[19], $objectId[19], $actionType[19], $requirements)) && p() && e('报告|testreport|view|report=%s'); // 测试获取objectType testreport objectId 20的动态信息
|
||||
r($action->getObjectLabelTest($objectType[20], $objectId[20], $actionType[20], $requirements)) && p() && e('应用|entry|browse|'); // 测试获取objectType entry objectId 21的动态信息
|
||||
r($action->getObjectLabelTest($objectType[21], $objectId[21], $actionType[21], $requirements)) && p() && e('Webhook|webhook|browse|'); // 测试获取objectType webhook objectId 22的动态信息
|
||||
r($action->getObjectLabelTest($objectType[22], $objectId[22], $actionType[22], $requirements)) && p() && e('review'); // 测试获取objectType review objectId 23的动态信息
|
||||
r($action->getObjectLabelTest($objectType[1], $objectId[23], $actionType[23], $requirements)) && p() && e('用户需求|story|view|storyID=%s'); // 测试获取objectType story objectId 25的动态信息
|
||||
r($action->getObjectLabelTest($objectType[0], $objectId[0], $actionType[0], $requirements)) && p() && e('产品|product|view|productID=%s'); // 测试获取objectType product objectId 1的动态信息
|
||||
r($action->getObjectLabelTest($objectType[1], $objectId[1], $actionType[1], $requirements)) && p() && e('研发需求|story|view|storyID=%s'); // 测试获取objectType story objectId 2的动态信息
|
||||
r($action->getObjectLabelTest($objectType[2], $objectId[2], $actionType[2], $requirements)) && p() && e('计划|productplan|view|productID=%s'); // 测试获取objectType productplan objectId 3的动态信息
|
||||
r($action->getObjectLabelTest($objectType[3], $objectId[3], $actionType[3], $requirements)) && p() && e('发布|release|view|productID=%s'); // 测试获取objectType release objectId 4的动态信息
|
||||
r($action->getObjectLabelTest($objectType[4], $objectId[4], $actionType[4], $requirements)) && p() && e('项目|project|index|projectID=%s'); // 测试获取objectType project objectId 5的动态信息
|
||||
r($action->getObjectLabelTest($objectType[5], $objectId[5], $actionType[5], $requirements)) && p() && e('任务|task|view|taskID=%s'); // 测试获取objectType task objectId 6的动态信息
|
||||
r($action->getObjectLabelTest($objectType[6], $objectId[6], $actionType[6], $requirements)) && p() && e('版本|build|view|buildID=%s'); // 测试获取objectType build objectId 7的动态信息
|
||||
r($action->getObjectLabelTest($objectType[7], $objectId[7], $actionType[7], $requirements)) && p() && e('Bug|bug|view|bugID=%s'); // 测试获取objectType bug objectId 8的动态信息
|
||||
r($action->getObjectLabelTest($objectType[8], $objectId[8], $actionType[8], $requirements)) && p() && e('testcase'); // 测试获取objectType testcase objectId 9的动态信息
|
||||
r($action->getObjectLabelTest($objectType[9], $objectId[9], $actionType[9], $requirements)) && p() && e('用例|testcase|view|caseID=%s'); // 测试获取objectType case objectId 10的动态信息
|
||||
r($action->getObjectLabelTest($objectType[10], $objectId[10], $actionType[10], $requirements)) && p() && e('测试单|testtask|view|caseID=%s'); // 测试获取objectType testtask objectId 11的动态信息
|
||||
r($action->getObjectLabelTest($objectType[11], $objectId[11], $actionType[11], $requirements)) && p() && e('用户|user|view|account=%s'); // 测试获取objectType user objectId 12的动态信息
|
||||
r($action->getObjectLabelTest($objectType[13], $objectId[13], $actionType[13], $requirements)) && p() && e('文档库|doc|tablecontents|type=%s&objectID=%s&libID=%s'); // 测试获取objectType doclib objectId 14的动态信息
|
||||
r($action->getObjectLabelTest($objectType[14], $objectId[14], $actionType[14], $requirements)) && p() && e('待办|todo|view|todoID=%s'); // 测试获取objectType todo objectId 15的动态信息
|
||||
r($action->getObjectLabelTest($objectType[15], $objectId[15], $actionType[15], $requirements)) && p() && e('branch'); // 测试获取objectType branch objectId 16的动态信息
|
||||
r($action->getObjectLabelTest($objectType[16], $objectId[16], $actionType[16], $requirements)) && p() && e('模块|tree|browse|productid=%s&type=story¤tModuleID=0&branch=all'); // 测试获取objectType module objectId 17的动态信息
|
||||
r($action->getObjectLabelTest($objectType[17], $objectId[17], $actionType[17], $requirements)) && p() && e('测试套件|testsuite|view|suiteID=%s'); // 测试获取objectType testsuite objectId 18的动态信息
|
||||
r($action->getObjectLabelTest($objectType[18], $objectId[18], $actionType[18], $requirements)) && p() && e('用例库|caselib|view|libID=%s'); // 测试获取objectType caselib objectId 19的动态信息
|
||||
r($action->getObjectLabelTest($objectType[19], $objectId[19], $actionType[19], $requirements)) && p() && e('报告|testreport|view|report=%s'); // 测试获取objectType testreport objectId 20的动态信息
|
||||
r($action->getObjectLabelTest($objectType[20], $objectId[20], $actionType[20], $requirements)) && p() && e('应用|entry|browse|'); // 测试获取objectType entry objectId 21的动态信息
|
||||
r($action->getObjectLabelTest($objectType[21], $objectId[21], $actionType[21], $requirements)) && p() && e('Webhook|webhook|browse|'); // 测试获取objectType webhook objectId 22的动态信息
|
||||
r($action->getObjectLabelTest($objectType[22], $objectId[22], $actionType[22], $requirements)) && p() && e('review'); // 测试获取objectType review objectId 23的动态信息
|
||||
r($action->getObjectLabelTest($objectType[1], $objectId[23], $actionType[23], $requirements)) && p() && e('用户需求|story|view|storyID=%s'); // 测试获取objectType story objectId 25的动态信息
|
||||
|
||||
@@ -18,7 +18,7 @@ pid=1
|
||||
测试获取objectType task objectId 6 actionType edited extra 1 的动态信息 >> ,6,;16;106
|
||||
测试获取objectType build objectId 7 actionType assigned extra 1 的动态信息 >> ,7,;17;0
|
||||
测试获取objectType bug objectId 8 actionType closed extra 1 的动态信息 >> ,3,;13;103
|
||||
测试获取objectType testcase objectId 9 actionType deleted extra 1 的动态信息 >> ,0,;0;0
|
||||
测试获取objectType testcase objectId 9 actionType deleted extra 1 的动态信息 >> ,3,;13;103
|
||||
测试获取objectType case objectId 10 actionType deletedfile extra 1 的动态信息 >> ,3,;13;103
|
||||
测试获取objectType testtask objectId 1 actionType editfile extra 1 的动态信息 >> ,1,;11;101
|
||||
测试获取objectType user objectId 12 actionType erased extra 1 的动态信息 >> ,0,;0;0
|
||||
@@ -26,7 +26,7 @@ pid=1
|
||||
测试获取objectType doclib objectId 14 actionType hidden extra 1 的动态信息 >> ,14,;0;0
|
||||
测试获取objectType todo objectId 15 actionType commented extra 1 的动态信息 >> ,0,;0;0
|
||||
测试获取objectType branch objectId 16 actionType activated extra 1 的动态信息 >> ,0,;0;0
|
||||
测试获取objectType module objectId 17 actionType blocked extra 1 的动态信息 >> ,0,;0;0
|
||||
测试获取objectType module objectId 17 actionType blocked extra 1 的动态信息 >> ,,0,,;0;0
|
||||
测试获取objectType testsuite objectId 18 actionType moved extra 1 的动态信息 >> ,0,;0;0
|
||||
测试获取objectType caselib objectId 19 actionType confirmed extra 1 的动态信息 >> ,0,;0;0
|
||||
测试获取objectType testreport objectId 20 actionType caseconfirmed extra 1 的动态信息 >> ,,;0;0
|
||||
@@ -41,7 +41,7 @@ pid=1
|
||||
测试获取objectType task objectId 29 actionType deleteestimate extra 1 的动态信息 >> ,29,;39;129
|
||||
测试获取objectType build objectId 1 actionType canceled extra 1 的动态信息 >> ,1,;11;0
|
||||
测试获取objectType bug objectId 31 actionType svncommited extra 1 的动态信息 >> ,11,;21;111
|
||||
测试获取objectType testcase objectId 32 actionType gitcommited extra 1 的动态信息 >> ,0,;0;0
|
||||
测试获取objectType testcase objectId 32 actionType gitcommited extra 1 的动态信息 >> ,8,;18;108
|
||||
测试获取objectType case objectId 33 actionType finished extra 1 的动态信息 >> ,9,;19;109
|
||||
测试获取objectType testtask objectId 1 actionType paused extra 1 的动态信息 >> ,1,;11;101
|
||||
测试获取objectType user objectId 35 actionType verified extra 1 的动态信息 >> ,0,;0;0
|
||||
@@ -66,7 +66,7 @@ r($action->getRelatedFieldsTest($objectType[4], $objectId[4], $actionType[4],
|
||||
r($action->getRelatedFieldsTest($objectType[5], $objectId[5], $actionType[5], $extra[5])) && p('product;project;execution') && e(',6,;16;106'); // 测试获取objectType task objectId 6 actionType edited extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[6], $objectId[6], $actionType[6], $extra[6])) && p('product;project;execution') && e(',7,;17;0'); // 测试获取objectType build objectId 7 actionType assigned extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[7], $objectId[7], $actionType[7], $extra[7])) && p('product;project;execution') && e(',3,;13;103'); // 测试获取objectType bug objectId 8 actionType closed extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[8], $objectId[8], $actionType[8], $extra[8])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType testcase objectId 9 actionType deleted extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[8], $objectId[8], $actionType[8], $extra[8])) && p('product;project;execution') && e(',3,;13;103'); // 测试获取objectType testcase objectId 9 actionType deleted extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[9], $objectId[9], $actionType[9], $extra[9])) && p('product;project;execution') && e(',3,;13;103'); // 测试获取objectType case objectId 10 actionType deletedfile extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[10], $objectId[10], $actionType[10], $extra[10])) && p('product;project;execution') && e(',1,;11;101'); // 测试获取objectType testtask objectId 1 actionType editfile extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[11], $objectId[11], $actionType[11], $extra[11])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType user objectId 12 actionType erased extra 1 的动态信息
|
||||
@@ -74,7 +74,7 @@ r($action->getRelatedFieldsTest($objectType[12], $objectId[12], $actionType[12],
|
||||
r($action->getRelatedFieldsTest($objectType[13], $objectId[13], $actionType[13], $extra[13])) && p('product;project;execution') && e(',14,;0;0'); // 测试获取objectType doclib objectId 14 actionType hidden extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[14], $objectId[14], $actionType[14], $extra[14])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType todo objectId 15 actionType commented extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[15], $objectId[15], $actionType[15], $extra[15])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType branch objectId 16 actionType activated extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[16], $objectId[16], $actionType[16], $extra[16])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType module objectId 17 actionType blocked extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[16], $objectId[16], $actionType[16], $extra[16])) && p('product;project;execution') && e(',,0,,;0;0'); // 测试获取objectType module objectId 17 actionType blocked extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[17], $objectId[17], $actionType[17], $extra[17])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType testsuite objectId 18 actionType moved extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[18], $objectId[18], $actionType[18], $extra[18])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType caselib objectId 19 actionType confirmed extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[19], $objectId[19], $actionType[19], $extra[19])) && p('product;project;execution') && e(',,;0;0'); // 测试获取objectType testreport objectId 20 actionType caseconfirmed extra 1 的动态信息
|
||||
@@ -89,11 +89,11 @@ r($action->getRelatedFieldsTest($objectType[4], $objectId[27], $actionType[27],
|
||||
r($action->getRelatedFieldsTest($objectType[5], $objectId[28], $actionType[28], $extra[28])) && p('product;project;execution') && e(',29,;39;129'); // 测试获取objectType task objectId 29 actionType deleteestimate extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[6], $objectId[29], $actionType[29], $extra[29])) && p('product;project;execution') && e(',1,;11;0'); // 测试获取objectType build objectId 1 actionType canceled extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[7], $objectId[30], $actionType[30], $extra[30])) && p('product;project;execution') && e(',11,;21;111'); // 测试获取objectType bug objectId 31 actionType svncommited extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[8], $objectId[31], $actionType[31], $extra[31])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType testcase objectId 32 actionType gitcommited extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[8], $objectId[31], $actionType[31], $extra[31])) && p('product;project;execution') && e(',8,;18;108'); // 测试获取objectType testcase objectId 32 actionType gitcommited extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[9], $objectId[32], $actionType[32], $extra[32])) && p('product;project;execution') && e(',9,;19;109'); // 测试获取objectType case objectId 33 actionType finished extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[10], $objectId[33], $actionType[33], $extra[33])) && p('product;project;execution') && e(',1,;11;101'); // 测试获取objectType testtask objectId 1 actionType paused extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[11], $objectId[34], $actionType[34], $extra[34])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType user objectId 35 actionType verified extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[12], $objectId[35], $actionType[35], $extra[35])) && p('product;project;execution') && e(',36,;0;0'); // 测试获取objectType doc objectId 36 actionType diff1 extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[13], $objectId[36], $actionType[36], $extra[36])) && p('product;project;execution') && e(',37,;0;0'); // 测试获取objectType doclib objectId 37 actionType diff2 extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[14], $objectId[37], $actionType[37], $extra[37])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType todo objectId 38 actionType diff3 extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[15], $objectId[38], $actionType[38], $extra[38])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType branch objectId 39 actionType linked2bug extra 1 的动态信息
|
||||
r($action->getRelatedFieldsTest($objectType[15], $objectId[38], $actionType[38], $extra[38])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType branch objectId 39 actionType linked2bug extra 1 的动态信息
|
||||
|
||||
Executable
+32
@@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试 actionModel->getTrashesBySearch();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
搜索objectType all, type all, queryID myQueryID, orderBy id_desc的回收站信息 >> 0
|
||||
搜索objectType story, type all, queryID myQueryID, orderBy id_desc的回收站信息 >> 48,story
|
||||
搜索objectType story, type all, queryID 2, orderBy id_asc的回收站信息 >> 48,story
|
||||
搜索objectType story, type hidden, queryID myQueryID, orderBy id_desc的回收站信息 >> 0
|
||||
搜索objectType testcase, type all, queryID 0, orderBy id_asc的回收站信息 >> 0
|
||||
|
||||
*/
|
||||
|
||||
$objectTypeList = array('all', 'story', 'testcase');
|
||||
$typeList = array('all', 'hidden');
|
||||
$queryIdList = array('myQueryID', '0', '2');
|
||||
$orderBy = array('id_desc', 'id_asc');
|
||||
$pager = null;
|
||||
|
||||
$action = new actionTest();
|
||||
r($action->getTrashesBySearchTest($objectTypeList[0], $typeList[0], $queryIdList[0], $orderBy[0], $pager)) && p() && e('0'); // 搜索objectType all, type all, queryID myQueryID, orderBy id_desc的回收站信息
|
||||
r($action->getTrashesBySearchTest($objectTypeList[1], $typeList[0], $queryIdList[0], $orderBy[0], $pager)) && p('48:id,objectType') && e('48,story'); // 搜索objectType story, type all, queryID myQueryID, orderBy id_desc的回收站信息
|
||||
r($action->getTrashesBySearchTest($objectTypeList[1], $typeList[0], $queryIdList[1], $orderBy[1], $pager)) && p('48:id,objectType') && e('48,story'); // 搜索objectType story, type all, queryID 2, orderBy id_asc的回收站信息
|
||||
r($action->getTrashesBySearchTest($objectTypeList[1], $typeList[1], $queryIdList[0], $orderBy[0], $pager)) && p() && e('0'); // 搜索objectType story, type hidden, queryID myQueryID, orderBy id_desc的回收站信息
|
||||
r($action->getTrashesBySearchTest($objectTypeList[2], $typeList[0], $queryIdList[0], $orderBy[1], $pager)) && p() && e('0'); // 搜索objectType testcase, type all, queryID 0, orderBy id_asc的回收站信息
|
||||
Executable
+29
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试 actionModel->getUnreadActions();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
测试获取ID为空的动态 >> 0
|
||||
测试获取ID为0的动态 >> 0
|
||||
测试获取ID为1的动态 >> 0
|
||||
测试获取ID不存在的动态 >> 0
|
||||
测试获取ID是数组的动态 >> 0
|
||||
|
||||
*/
|
||||
|
||||
$actionIdList = array('', 0, '1', '1000');
|
||||
|
||||
$action = new actionTest();
|
||||
|
||||
r($action->getUnreadActionsTest($actionIdList[0])) && p() && e('0'); // 测试获取ID为空的动态
|
||||
r($action->getUnreadActionsTest($actionIdList[1])) && p() && e('0'); // 测试获取ID为0的动态
|
||||
r($action->getUnreadActionsTest($actionIdList[2])) && p() && e('0'); // 测试获取ID为1的动态
|
||||
r($action->getUnreadActionsTest($actionIdList[3])) && p() && e('0'); // 测试获取ID不存在的动态
|
||||
r($action->getUnreadActionsTest($actionIdList)) && p() && e('0'); // 测试获取ID是数组的动态
|
||||
Executable
+29
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试 actionModel->hasPreOrNext();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
测试传入空参数 >> 1
|
||||
测试空日期之前是否有动态 >> 0
|
||||
测试空日期之后是否有动态 >> 1
|
||||
测试今天之前是否有动态 >> 1
|
||||
测试今天之后是否有动态 >> 0
|
||||
|
||||
*/
|
||||
|
||||
$action = new actionTest();
|
||||
|
||||
$dateList = array('', 'today');
|
||||
$directionList = array('', 'next', 'pre');
|
||||
r($action->hasPreOrNextTest($dateList[0], $directionList[0])) && p() && e('1'); // 测试传入空参数
|
||||
r($action->hasPreOrNextTest($dateList[0], $directionList[1])) && p() && e('0'); // 测试空日期之前是否有动态
|
||||
r($action->hasPreOrNextTest($dateList[0], $directionList[2])) && p() && e('1'); // 测试空日期之后是否有动态
|
||||
r($action->hasPreOrNextTest($dateList[1], $directionList[1])) && p() && e('1'); // 测试今天之前是否有动态
|
||||
r($action->hasPreOrNextTest($dateList[1], $directionList[2])) && p() && e('0'); // 测试今天之后是否有动态
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试 actionModel->processDynamicForAPI();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
测试处理空数据 >> 0
|
||||
处理所有动态 >> admin,admin,/home/z/tmp/1.png
|
||||
|
||||
*/
|
||||
|
||||
$action = new actionTest();
|
||||
|
||||
$dynamics = $tester->dao->select('*')->from(TABLE_ACTION)->fetchAll();
|
||||
|
||||
r($action->processDynamicForAPITest(array())) && p() && e('0'); // 测试处理空数据
|
||||
r($action->processDynamicForAPITest($dynamics)) && p('actor:account,realname,avatar') && e('admin,admin,/home/z/tmp/1.png'); // 处理所有动态
|
||||
Executable
+39
@@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
$db->switchDB();
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试 actionModel->saveIndex();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
测试保存空数据 >> 1
|
||||
测试保存stroyId为0, action为空的数据 >> 1
|
||||
测试保存stroyId为1, action为空的数据 >> 1
|
||||
测试保存stroyId为100000, action为空的数据 >> 1
|
||||
测试保存stroyId为0, action为created的数据 >> 1
|
||||
测试保存stroyId为1, action为created的数据 >> 1
|
||||
测试保存stroyId为100000, action为created的数据 >> 1
|
||||
测试保存不存在类型的数据 >> 1
|
||||
|
||||
*/
|
||||
|
||||
$objectTypeList = array('', 'stroy', 'test');
|
||||
$objectIdList = array(0, 1, 100000);
|
||||
$actionTypeList = array('', 'created', 'tested');
|
||||
|
||||
$action = new actionTest();
|
||||
|
||||
r($action->saveIndexTest($objectTypeList[0], $objectIdList[0], $actionTypeList[0])) && p() && e('1'); // 测试保存空数据
|
||||
r($action->saveIndexTest($objectTypeList[1], $objectIdList[0], $actionTypeList[0])) && p() && e('1'); // 测试保存stroyId为0, action为空的数据
|
||||
r($action->saveIndexTest($objectTypeList[1], $objectIdList[1], $actionTypeList[0])) && p() && e('1'); // 测试保存stroyId为1, action为空的数据
|
||||
r($action->saveIndexTest($objectTypeList[1], $objectIdList[2], $actionTypeList[0])) && p() && e('1'); // 测试保存stroyId为100000, action为空的数据
|
||||
r($action->saveIndexTest($objectTypeList[1], $objectIdList[0], $actionTypeList[1])) && p() && e('1'); // 测试保存stroyId为0, action为created的数据
|
||||
r($action->saveIndexTest($objectTypeList[1], $objectIdList[1], $actionTypeList[1])) && p() && e('1'); // 测试保存stroyId为1, action为created的数据
|
||||
r($action->saveIndexTest($objectTypeList[1], $objectIdList[2], $actionTypeList[1])) && p() && e('1'); // 测试保存stroyId为100000, action为created的数据
|
||||
r($action->saveIndexTest($objectTypeList[2], $objectIdList[2], $actionTypeList[2])) && p() && e('1'); // 测试保存不存在类型的数据
|
||||
$db->restoreDB();
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user