diff --git a/api/v1/entries/product.php b/api/v1/entries/product.php index d387d95f6d..36ef598f11 100644 --- a/api/v1/entries/product.php +++ b/api/v1/entries/product.php @@ -55,7 +55,7 @@ class productEntry extends Entry $product->execution = $this->loadModel('product')->getExecutionPairsByProduct($productID); break; case 'moduleoptionmenu': - $product->moduleOptionMenu = $this->loadModel('tree')->getOptionMenu($productID, 'bug', 0, 'all'); + $product->moduleOptionMenu = $this->loadModel('tree')->getOptionMenu($productID, 'story', 0, 'all'); break; case 'builds': $product->builds = $this->loadModel('build')->getBuildPairs($productID, 'all', 'noempty,noterminate,nodone,withbranch', $this->param('object', 0), $this->param('objectType', 'execution')); diff --git a/api/v1/entries/task.php b/api/v1/entries/task.php index 15cd194d6e..926a337e98 100644 --- a/api/v1/entries/task.php +++ b/api/v1/entries/task.php @@ -102,7 +102,7 @@ class taskEntry extends Entry $oldTask = $this->loadModel('task')->getByID($taskID); /* Set $_POST variables. */ - $fields = 'name,type,desc,assignedTo,pri,estimate,left,consumed,story,parent,execution,module,closedReason,status,estStarted,deadline,team,teamEstimate,multiple,mailto,uid'; + $fields = 'name,type,desc,assignedTo,pri,estimate,left,consumed,story,parent,execution,module,closedReason,status,estStarted,deadline,team,teamEstimate,teamConsumed,teamLeft,multiple,mailto,uid'; $this->batchSetPost($fields, $oldTask); $control = $this->loadController('task', 'edit'); diff --git a/db/zentao.sql b/db/zentao.sql index aefa069dda..892cb37ec5 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -8816,7 +8816,7 @@ ALTER TABLE `zt_story` ADD `fromStory` mediumint(8) unsigned NOT NULL default 0 ALTER TABLE `zt_story` ADD `fromVersion` smallint(6) NOT NULL default 1 after `fromStory`; ALTER TABLE `zt_story` ADD `approvedDate` date NOT NULL after `assignedDate`; -ALTER TABLE `zt_todo` CHANGE `type` `type` char(15) NOT NULL AFTER `feedback`; +ALTER TABLE `zt_todo` CHANGE `type` char(15) NOT NULL AFTER `feedback`; -- DROP TABLE IF EXISTS `zt_durationestimation`; CREATE TABLE IF NOT EXISTS `zt_durationestimation` ( diff --git a/extension/lite/common/ext/lang/en/lite.php b/extension/lite/common/ext/lang/en/lite.php index f8f60da3e7..c0b729fa71 100644 --- a/extension/lite/common/ext/lang/en/lite.php +++ b/extension/lite/common/ext/lang/en/lite.php @@ -202,6 +202,8 @@ $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|"); + +if($config->visions == ',lite,' and $config->edition != 'open') $lang->admin->menu->system['subMenu']->license = array('link' => "License|admin|license'", 'alias' => 'license'); if($config->visions != ',lite,') unset($lang->admin->menu->system['subMenu']->buildIndex); if($config->edition != 'open') diff --git a/extension/lite/common/ext/lang/zh-cn/lite.php b/extension/lite/common/ext/lang/zh-cn/lite.php index c49dd6958c..4771e9f0d1 100644 --- a/extension/lite/common/ext/lang/zh-cn/lite.php +++ b/extension/lite/common/ext/lang/zh-cn/lite.php @@ -202,6 +202,8 @@ $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|"); + +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); if($config->edition != 'open') diff --git a/lib/dingapi/dingapi.class.php b/lib/dingapi/dingapi.class.php index dacf0a52b7..238e1a084c 100644 --- a/lib/dingapi/dingapi.class.php +++ b/lib/dingapi/dingapi.class.php @@ -188,6 +188,7 @@ class dingapi if(isset($response->errcode) and $response->errcode == 0) return $response; if(empty($response)) $this->errors = $errors; + if(isset($response->result) and $response->result == 'fail') $this->errors['curl'] = $response->message; if(isset($response->errcode)) $this->errors[$response->errcode] = "Errcode:{$response->errcode}, Errmsg:{$response->errmsg}"; return false; } diff --git a/lib/feishuapi/feishuapi.class.php b/lib/feishuapi/feishuapi.class.php index d25126517d..3749eb5a99 100644 --- a/lib/feishuapi/feishuapi.class.php +++ b/lib/feishuapi/feishuapi.class.php @@ -9,12 +9,12 @@ class feishuapi private $errors = array(); /** - * Construct - * - * @param string $appKey - * @param string $appSecret - * @param string $agentId - * @param string $apiUrl + * Construct + * + * @param string $appKey + * @param string $appSecret + * @param string $agentId + * @param string $apiUrl * @access public * @return void */ @@ -29,7 +29,7 @@ class feishuapi /** * Get token. - * + * * @access public * @return string */ @@ -47,7 +47,7 @@ class feishuapi /** * Get users. - * + * * @param string $selectedDepts * @access public * @return array @@ -103,7 +103,7 @@ class feishuapi /** * Get depts. - * + * * @access public * @return array */ @@ -146,7 +146,7 @@ class feishuapi /** * Get department tree structure. - * + * * @access public * @return array */ @@ -186,10 +186,10 @@ class feishuapi } /** - * Send message - * - * @param string $userList - * @param string $message + * Send message + * + * @param string $userList + * @param string $message * @access public * @return array */ @@ -207,8 +207,8 @@ class feishuapi /** * Query API. - * - * @param string $url + * + * @param string $url * @access public * @return string */ @@ -225,6 +225,7 @@ class feishuapi if(isset($response->code) and $response->code == 0) return $response; if(empty($response)) $this->errors = $errors; + if(isset($response->result) and $response->result == 'fail') $this->errors['curl'] = $response->message; if(isset($response->code)) $this->errors[$response->code] = "Errcode:{$response->code}, Errmsg:{$response->msg}"; if(!empty($this->errors)) { @@ -236,7 +237,7 @@ class feishuapi /** * Check for errors. - * + * * @access public * @return bool */ @@ -247,7 +248,7 @@ class feishuapi /** * Get errors. - * + * * @access public * @return array */ diff --git a/lib/front/front.class.php b/lib/front/front.class.php index e4da51367d..d9078b82f8 100644 --- a/lib/front/front.class.php +++ b/lib/front/front.class.php @@ -259,7 +259,7 @@ class html extends baseHTML } elseif(is_object($user)) { - $userObj->avatar = $user->avatar; + $userObj->avatar = isset($user->avatar) ? $user->avatar : ''; $userObj->account = $user->account; $userObj->name = isset($user->name) ? $user->name : (isset($user->realname) ? $user->realname : $user->account); $user = $userObj; diff --git a/lib/scm/scm.class.php b/lib/scm/scm.class.php index c16cc4e942..30cb1f9965 100644 --- a/lib/scm/scm.class.php +++ b/lib/scm/scm.class.php @@ -230,7 +230,7 @@ class scm */ public static function checkRevision($revision) { - if(preg_match('/[^a-z0-9\-_\.\^]/i', $revision)) return false; + if(preg_match('/[^a-z0-9\-_\.\^\w][\x{4e00}-\x{9fa5}]/ui', $revision)) return false; return true; } } diff --git a/module/action/control.php b/module/action/control.php index 488ea7763a..7a143d26ba 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -131,6 +131,19 @@ class action extends control */ public function comment($objectType, $objectID) { + if(strtolower($objectType) == 'task') + { + $task = $this->loadModel('task')->getById($objectID); + $executions = explode(',', $this->app->user->view->sprints); + if(!in_array($task->execution, $executions)) return print(js::error($this->lang->error->accessDenied)); + } + elseif(strtolower($objectType) == 'story') + { + $story = $this->loadModel('story')->getById($objectID); + $executions = explode(',', $this->app->user->view->sprints); + if(!array_intersect(array_keys($story->executions), $executions)) return print(js::error($this->lang->error->accessDenied)); + } + $actionID = $this->action->create($objectType, $objectID, 'Commented', $this->post->comment); if(defined('RUN_MODE') && RUN_MODE == 'api') { diff --git a/module/action/model.php b/module/action/model.php index 2b42174155..8a7690b2d9 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -490,7 +490,7 @@ class actionModel extends model $name = $this->dao->select('name')->from(TABLE_TESTSUITE)->where('id')->eq($action->extra)->fetch('name'); if($name) $action->extra = common::hasPriv('caselib', 'browse') ? html::a(helper::createLink('caselib', 'browse', "libID=$action->extra"), $name) : $name; } - elseif(strpos('importfromstorylib,importfromrisklib,importfromissuelib,importfromopportunitylib', $actionName) !== false) + elseif(strpos(',importfromstorylib,importfromrisklib,importfromissuelib,importfromopportunitylib,', ",{$actionName},") !== false and $this->config->edition == 'max') { $name = $this->dao->select('name')->from(TABLE_ASSETLIB)->where('id')->eq($action->extra)->fetch('name'); if($name) $action->extra = common::hasPriv('assetlib', $action->objectType) ? html::a(helper::createLink('assetlib', $action->objectType, "libID=$action->extra"), $name) : $name; diff --git a/module/block/control.php b/module/block/control.php index 1b08f2b03c..e8237a4b99 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -1399,7 +1399,8 @@ class block extends control ->where('deleted')->eq(0) ->beginIF($this->config->vision == 'lite')->andWhere('type')->eq('kanban')->fi() ->beginIF($this->config->vision == 'rnd')->andWhere('type')->eq('sprint')->fi() - ->andWhere('parent')->eq($this->session->project) + ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->sprints)->fi() + ->andWhere('project')->eq($this->session->project) ->groupBy('status') ->fetchPairs(); diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 78c7628741..5b353efe1a 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -388,6 +388,7 @@ $lang->error->noData = 'No data.'; $lang->error->editedByOther = 'This record might have been changed. Please refresh and try to edit again!'; $lang->error->tutorialData = 'No data can be imported in tutorial mode. Please quit tutorial first!'; $lang->error->noCurlExt = 'No Curl module installed'; +$lang->error->loginTimeout = 'Login has timed out, please login again!'; /* Page info. */ $lang->pager = new stdclass(); diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 9df9fbcc1e..91c85e100e 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -389,6 +389,7 @@ $lang->error->noData = '没有数据'; $lang->error->editedByOther = '该记录可能已经被改动。请刷新页面重新编辑!'; $lang->error->tutorialData = '新手模式下不会插入数据,请退出新手模式操作'; $lang->error->noCurlExt = '服务器未安装Curl模块。'; +$lang->error->loginTimeout = '登录已超时,请重新登入!'; /* 分页信息。*/ $lang->pager = new stdclass(); diff --git a/module/common/model.php b/module/common/model.php index 326a822199..5aaa48b24c 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -123,9 +123,15 @@ class commonModel extends model $projectID = $execution->project; $project = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($projectID)->fetch(); + $today = helper::today(); if($project->status == 'wait') { - $this->dao->update(TABLE_PROJECT)->set('status')->eq('doing')->where('id')->eq($projectID)->exec(); + $this->dao->update(TABLE_PROJECT) + ->set('status')->eq('doing') + ->beginIf(helper::isZeroDate($project->realBegan))->set('realBegan')->eq($today)->fi() + ->where('id')->eq($projectID) + ->exec(); + $this->loadModel('action')->create('project', $projectID, 'syncproject'); } return $project; @@ -2245,7 +2251,17 @@ EOD; } else { - $referer = helper::safe64Encode($this->app->getURI(true)); + $uri = $this->app->getURI(true); + if($module == 'message' and $method == 'ajaxgetmessage') + { + $uri = helper::createLink('my'); + } + elseif(helper::isAjaxRequest()) + { + die(json_encode(array('result' => false, 'message' => $this->lang->error->loginTimeout))); // Fix bug #14478. + } + + $referer = helper::safe64Encode($uri); print(js::locate(helper::createLink('user', 'login', "referer=$referer"))); helper::end(); } diff --git a/module/common/view/gantt.html.php b/module/common/view/gantt.html.php index 55d4430146..5a111ad848 100644 --- a/module/common/view/gantt.html.php +++ b/module/common/view/gantt.html.php @@ -18,3 +18,6 @@ js::import($jsRoot . 'dhtmlxgantt/ext/dhtmlxgantt_marker.js'); $currentLang = $app->getClientLang(); if($currentLang != 'en') js::import($jsRoot . 'dhtmlxgantt/lang/' . $currentLang . '.js'); ?> + diff --git a/module/custom/control.php b/module/custom/control.php index 8001a8cdc9..62ad339866 100644 --- a/module/custom/control.php +++ b/module/custom/control.php @@ -172,14 +172,14 @@ class custom extends control } if(!empty($key) and !isset($oldCustoms[$key]) and $key != 'n/a' and !validater::checkREG($key, '/^[a-z_A-Z_0-9]+$/')) return $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->invalidStringKey)); - /* The length of roleList in user module and typeList in todo module is less than 10. check it when saved. */ - if($field == 'roleList' or $module == 'todo' and $field == 'typeList') - { - if(strlen($key) > 10) return $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->invalidStrlen['ten'])); - } + /* The length of roleList in user module is less than 10. check it when saved. */ + if($module == 'user' and $field == 'roleList' and strlen($key) > 10) return $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->invalidStrlen['ten'])); + + /* The length of typeList in todo module is less than 15. check it when saved. */ + if($module == 'todo' and $field == 'typeList' and strlen($key) > 15) return $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->invalidStrlen['fifteen'])); /* The length of sourceList in story module and typeList in task module is less than 20, check it when saved. */ - if($field == 'sourceList' or $module == 'task' and $field == 'typeList') + if(($module == 'story' and $field == 'sourceList') or ($module == 'task' and $field == 'typeList')) { if(strlen($key) > 20) return $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->invalidStrlen['twenty'])); } @@ -188,7 +188,7 @@ class custom extends control if($module == 'testcase' and $field == 'stageList' and strlen($key) > 255) return $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->invalidStrlen['twoHundred'])); /* The length of field that in bug and testcase module and reasonList in story and task module is less than 30, check it when saved. */ - if($module == 'bug' or $field == 'reasonList' or $module == 'testcase') + if(in_array($module, array('bug', 'testcase')) or (in_array($module, array('story', 'task')) and $field == 'reasonList')) { if(strlen($key) > 30) return $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->invalidStrlen['thirty'])); } diff --git a/module/custom/lang/en.php b/module/custom/lang/en.php index efcc7f963f..a9396a720d 100644 --- a/module/custom/lang/en.php +++ b/module/custom/lang/en.php @@ -183,6 +183,7 @@ $lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ has Project Home. Do $lang->custom->notice->indexPage['qa'] = "ZenTao 8.2+ has Test Homepage. Do you want to go to Test Homepage?"; $lang->custom->notice->invalidStrlen['ten'] = 'The key should be <= 10 characters.'; +$lang->custom->notice->invalidStrlen['fifteen'] = 'The key should be <= 15 characters.'; $lang->custom->notice->invalidStrlen['twenty'] = 'The key should be <= 20 characters.'; $lang->custom->notice->invalidStrlen['thirty'] = 'The key should be <= 30 characters.'; $lang->custom->notice->invalidStrlen['twoHundred'] = 'The key should be <= 225 characters.'; diff --git a/module/custom/lang/zh-cn.php b/module/custom/lang/zh-cn.php index 5e77ee1f0e..991319a060 100644 --- a/module/custom/lang/zh-cn.php +++ b/module/custom/lang/zh-cn.php @@ -183,6 +183,7 @@ $lang->custom->notice->indexPage['project'] = "从8.2版本起增加了项目主 $lang->custom->notice->indexPage['qa'] = "从8.2版本起增加了测试主页视图,是否默认进入测试主页?"; $lang->custom->notice->invalidStrlen['ten'] = '键的长度必须小于10个字符!'; +$lang->custom->notice->invalidStrlen['fifteen'] = '键的长度必须小于15个字符!'; $lang->custom->notice->invalidStrlen['twenty'] = '键的长度必须小于20个字符!'; $lang->custom->notice->invalidStrlen['thirty'] = '键的长度必须小于30个字符!'; $lang->custom->notice->invalidStrlen['twoHundred'] = '键的长度必须小于225个字符!'; diff --git a/module/custom/model.php b/module/custom/model.php index 273a093ff9..1b9eed74ad 100644 --- a/module/custom/model.php +++ b/module/custom/model.php @@ -434,7 +434,7 @@ class customModel extends model global $lang, $app, $dbh; if(!isset($lang->$module->featureBar[$method])) return; $queryModule = $module == 'execution' ? 'task' : ($module == 'product' ? 'story' : $module); - $shortcuts = $dbh->query('select id, title from ' . TABLE_USERQUERY . " where `account` = '{$app->user->account}' AND `module` = '{$queryModule}' AND `shortcut` = '1' order by id")->fetchAll(); + $shortcuts = $dbh->query('select id, title from ' . TABLE_USERQUERY . " where (`account` = '{$app->user->account}' or `common` = '1') AND `module` = '{$queryModule}' AND `shortcut` = '1' order by id")->fetchAll(); if($shortcuts) { diff --git a/module/dev/view/header.html.php b/module/dev/view/header.html.php index 090073ba79..9efce6496b 100644 --- a/module/dev/view/header.html.php +++ b/module/dev/view/header.html.php @@ -1,4 +1,4 @@ - +getModuleRoot() . 'common/view/header.html.php';?> diff --git a/module/doc/js/objectlibs.js b/module/doc/js/objectlibs.js index 080e036379..a661bf9b5d 100644 --- a/module/doc/js/objectlibs.js +++ b/module/doc/js/objectlibs.js @@ -87,6 +87,8 @@ function fullScreen() whenFailEnterFullscreen(error); } } + + $('.main-col iframe').css('min-height', $(window).height() + 'px'); } /** @@ -102,6 +104,7 @@ function exitFullScreen() $('#content .actions').removeClass('hidden'); $('#content .file-image .right-icon').removeClass('hidden'); $('#content .detail').eq(1).removeClass('hidden'); + $('.main-col iframe').css('min-height', '380px'); $.cookie('isFullScreen', 0); } diff --git a/module/execution/control.php b/module/execution/control.php index 904db8455a..ed7f16616a 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -3310,10 +3310,22 @@ class execution extends control $this->view->title = $this->lang->execution->allExecutions; $this->view->position[] = $this->lang->execution->allExecutions; - $this->view->executionStats = $this->project->getStats($projectID, $status, $productID, 0, 30, $orderBy, $pager); + $executionStats = $this->project->getStats($projectID, $status, $productID, 0, 30, $orderBy, $pager); + + $parentIdList = array(); + foreach($executionStats as $execution) + { + if($execution->type != 'stage') continue; + if($execution->grade == 2 and $execution->project != $execution->parent) $parentIdList[$execution->parent] = $execution->parent; + } + $parents = array(); + if($parentIdList) $parents = $this->execution->getByIdList($parentIdList); + + $this->view->executionStats = $executionStats; $this->view->productList = $this->loadModel('product')->getProductPairsByProject($projectID); $this->view->productID = $productID; $this->view->projectID = $projectID; + $this->view->parents = $parents; $this->view->projects = array('') + $this->project->getPairsByProgram(); $this->view->pager = $pager; $this->view->orderBy = $orderBy; diff --git a/module/execution/css/all.css b/module/execution/css/all.css index c6d895178a..c1ac7084d4 100644 --- a/module/execution/css/all.css +++ b/module/execution/css/all.css @@ -24,3 +24,5 @@ td.flex span.project-type-label {margin-left: 5px; min-width: 36px;} .c-action {text-align: center;} .c-name > span {margin-right: 2px;} td.flex span.project-type-label {min-width: 40px;} + +.label-children {min-width:22px !important;} diff --git a/module/execution/view/all.html.php b/module/execution/view/all.html.php index 44dfab54d5..3040a6e2b1 100644 --- a/module/execution/view/all.html.php +++ b/module/execution/view/all.html.php @@ -124,12 +124,18 @@ id);?> - flex' title='name?>'> + name; + $onlyChildStage = ($execution->grade == 2 and $execution->project != $execution->parent); + if($onlyChildStage and isset($parents[$execution->parent])) $executionName = $parents[$execution->parent]->name . '/' . $executionName; + ?> + flex' title=''> systemMode == 'new'):?> '>execution->typeList[$execution->type]?> projectModel == 'kanban' ? html::a($this->createLink('execution', 'kanban', 'executionID=' . $execution->id), $execution->name, '', "class='text-ellipsis'") : html::a($this->createLink('execution', 'task', 'execution=' . $execution->id), $execution->name, '', "class='text-ellipsis'"); + $executionLink = $execution->projectModel == 'kanban' ? html::a($this->createLink('execution', 'kanban', 'executionID=' . $execution->id), $executionName, '', "class='text-ellipsis'") : html::a($this->createLink('execution', 'task', 'execution=' . $execution->id), $executionName, '', "class='text-ellipsis'"); + if($onlyChildStage) echo "{$lang->programplan->childrenAB} "; echo !empty($execution->children) ? $execution->name : $executionLink; if(isset($execution->delay)) echo "{$lang->execution->delayed} "; ?> @@ -214,9 +220,9 @@ delay)) echo "{$lang->execution->delayed} "; echo "{$lang->programplan->childrenAB}"; echo html::a($this->createLink('execution', 'task', 'execution=' . $child->id), $child->name); + if(isset($child->delay)) echo "{$lang->execution->delayed} "; ?> PM);?> diff --git a/module/extension/model.php b/module/extension/model.php index 29de175bba..30dbc63ec7 100644 --- a/module/extension/model.php +++ b/module/extension/model.php @@ -456,7 +456,7 @@ class extensionModel extends model if(!is_writable($parentDir) or !@mkdir($path, 0777, true)) { $return->errors .= sprintf($this->lang->extension->errorTargetPathNotExists, $path) . '
'; - $return->mkdirCommands .= "mkdir -p $path
"; + $return->mkdirCommands .= "sudo mkdir -p $path
"; $return->chmodCommands .= "sudo chmod -R 777 $path
"; } $return->dirs2Created[] = $path; diff --git a/module/job/model.php b/module/job/model.php index c1387806d6..00d56de7d3 100644 --- a/module/job/model.php +++ b/module/job/model.php @@ -457,12 +457,12 @@ class jobModel extends model if($job->triggerType == 'tag') { - $lastTag = $this->getLastTagByRepo($repo, $job); - if($lastTag) + $job->lastTag = $this->getLastTagByRepo($repo, $job); + + if($job->lastTag) { - $build->tag = $lastTag; - $job->lastTag = $lastTag; - $this->dao->update(TABLE_JOB)->set('lastTag')->eq($lastTag)->where('id')->eq($job->id)->exec(); + $build->tag = $job->lastTag; + $this->dao->update(TABLE_JOB)->set('lastTag')->eq($job->lastTag)->where('id')->eq($job->id)->exec(); } } diff --git a/module/mr/control.php b/module/mr/control.php index a24ac9d82e..497ba80482 100644 --- a/module/mr/control.php +++ b/module/mr/control.php @@ -422,11 +422,13 @@ class mr extends control } } - $this->view->repo = $this->loadModel('repo')->getRepoByID($MR->repoID); - $this->view->repoID = $MR->repoID; - $this->view->diffs = $diffs; - $this->view->encoding = $encoding; - $this->view->arrange = $arrange; + $this->view->repo = $this->loadModel('repo')->getRepoByID($MR->repoID); + $this->view->repoID = $MR->repoID; + $this->view->diffs = $diffs; + $this->view->encoding = $encoding; + $this->view->arrange = $arrange; + $this->view->sourceBranch = $MR->sourceBranch; + $this->view->targetBranch = $MR->targetBranch; $this->display(); } diff --git a/module/mr/model.php b/module/mr/model.php index 07d84f3532..712740bb74 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -1177,7 +1177,6 @@ class mrModel extends model $bugInfo['content'] = $data->steps; $bugInfo['title'] = $data->title; $bugInfo['objectType'] = 'bug'; - $bugInfo['entry'] = $data->entry; return $bugInfo; } diff --git a/module/mr/view/header.review.html.php b/module/mr/view/header.review.html.php index 1b6201d186..d6e2032306 100644 --- a/module/mr/view/header.review.html.php +++ b/module/mr/view/header.review.html.php @@ -38,7 +38,8 @@ if($repoExecution) } $reviews = $this->mr->getReview($repoID, $MR->id); -$v1 = isset($oldRevision) ? $oldRevision : 0; +$v1 = str_replace('-', '*', $sourceBranch); +$v2 = str_replace('-', '*', $targetBranch); $this->loadModel('repo'); @@ -46,7 +47,7 @@ $taskModuleSelect = html::select('taskModule', $taskModules, $taskRepoModule, $taskUserSelect = html::select('taskAssignedTo', $taskMembers, '', 'class="form-control chosen"'); $taskExecutionSelect = html::select('taskExecution', $taskExecutions, $repoExecution, 'class="form-control chosen" onchange="changeExecution(this)"'); -$reviewUrl = $this->createLink('mr', 'addReview', "repoID=$repoID&mr={$MR->id}&v1=$v1&v2="); +$reviewUrl = $this->createLink('mr', 'addReview', "repoID=$repoID&mr={$MR->id}&v1=$v1&v2=$v2"); $productSelect = html::select('product', $products, $repoProduct, 'class="product form-control chosen" onchange="changeProduct(this)"'); $branches = $this->loadModel('branch')->getPairs($repoProduct); $moduleSelect = html::select('module', $modules, $bugRepoModule, 'class="form-control chosen"'); @@ -153,7 +154,6 @@ js::set('revision', ''); repo->submit, '', 'btn btn-wide btn-primary reviewSubmit');?> cancel, "onclick='hiddenForm()'", 'btn btn-wide');?> - diff --git a/module/my/control.php b/module/my/control.php index 171cef2db3..96593fcdb5 100644 --- a/module/my/control.php +++ b/module/my/control.php @@ -418,8 +418,9 @@ EOF; if($this->config->systemMode == 'new') { $projects = $this->dao->select('t1.id,t1.name,t2.id as execution')->from(TABLE_PROJECT)->alias('t1') - ->leftJoin(TABLE_EXECUTION)->alias('t2')->on('t1.id=t2.parent') + ->leftJoin(TABLE_EXECUTION)->alias('t2')->on('t1.id=t2.project') ->where('t2.id')->in($executionIDList) + ->andWhere('t1.type')->eq('project') ->fetchAll('execution'); } @@ -856,7 +857,7 @@ EOF; $this->view->browseType = $browseType; $this->view->ncs = $ncList; $this->view->users = $this->loadModel('user')->getPairs('noclosed|noletter'); - $this->view->projects = $this->loadModel('project')->getPairsByProgram(0); + $this->view->projects = $this->loadModel('project')->getPairsByProgram(); $this->view->pager = $pager; $this->view->orderBy = $orderBy; $this->view->mode = 'nc'; diff --git a/module/product/model.php b/module/product/model.php index 010ea89847..1222111415 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -1285,6 +1285,7 @@ class productModel extends model ->beginIF($branch)->andWhere('t1.branch')->in($branch)->fi() ->beginIF(!$this->app->user->admin)->andWhere('t2.id')->in($this->app->user->view->sprints)->fi() ->andWhere('t2.deleted')->eq('0') + ->orderBy('id_desc') ->fetchAll('id'); $projectIdList = array(); diff --git a/module/programplan/model.php b/module/programplan/model.php index 61d5044520..86aef7899e 100644 --- a/module/programplan/model.php +++ b/module/programplan/model.php @@ -200,8 +200,8 @@ class programplanModel extends model if($data->start_date) $data->start_date = date('d-m-Y', strtotime($data->start_date)); if($data->start_date == '' or $data->endDate == '') $data->duration = 0; - $datas['data'][] = $data; - $stageIndex[] = array('planID' => $plan->id, 'progress' => array('totalConsumed' => 0, 'totalReal' => 0)); + $datas['data'][] = $data; + $stageIndex[$plan->id] = array('planID' => $plan->id, 'parent' => $plan->parent, 'progress' => array('totalConsumed' => 0, 'totalReal' => 0)); } $taskSign = "[ T ] "; @@ -273,9 +273,15 @@ class programplanModel extends model { $stageIndex[$index]['progress']['totalConsumed'] += $task->consumed; $stageIndex[$index]['progress']['totalReal'] += ($task->left + $task->consumed); + + $stageIndex[$stage['parent']]['progress']['totalConsumed'] += $task->consumed; + $stageIndex[$stage['parent']]['progress']['totalReal'] += ($task->left + $task->consumed); } } } + + /* Ceturns all the values from the stageIndex and indexes the array numerically. */ + $stageIndex = array_values($stageIndex); /* Calculate the progress of the phase. */ foreach($stageIndex as $index => $stage) diff --git a/module/programplan/view/gantt.html.php b/module/programplan/view/gantt.html.php index 64d4306258..aa84cbe895 100644 --- a/module/programplan/view/gantt.html.php +++ b/module/programplan/view/gantt.html.php @@ -22,6 +22,11 @@ .gantt_task_content{display: none;} .checkbox-primary {margin-top: 0px; margin-left: 10px;} form {display: block; margin-top: 0em; margin-block-end: 1em;} + +.gantt_grid .gantt_grid_scale{width:100% !important;} +.gantt_grid .gantt_grid_data{width:100% !important;} +.gantt_grid .gantt_grid_data .gantt_row{width:100% !important;} + createLink('programplan', 'ajaxCustom'));?> @@ -71,7 +76,15 @@ function drawGanttToCanvas(exportType, successCallback, errorCallback) var $ganttDataArea = $ganttView.find('.gantt_data_area'); var $ganttDridData = $ganttView.find('.gantt_grid_data'); var ganttHeight = $ganttView.find('.gantt_task_bg').outerHeight() + $ganttView.find('.gantt_grid_scale').outerHeight() + 1; - var ganttWidth = $ganttDataArea.outerWidth() + $ganttDridData.outerWidth(); + + + var ganttWidth = $ganttDridData.width() - 100; + var ganttHeight = $ganttView.find('.gantt_grid_scale').outerHeight(); + $ganttDridData.find('.gantt_row').each(function() {ganttHeight += $(this).outerHeight();}); + + var ganttWidth = $ganttDataArea.outerWidth() + $ganttDridData.outerWidth(); + var ganttHeight = $ganttView.find('.gantt_task_bg').outerHeight() + $ganttView.find('.gantt_grid_scale').outerHeight() + 1; + $ganttContainer.css( { @@ -202,13 +215,13 @@ function zoomTasks(node) break; case "week": gantt.config.min_column_width = 70; - gantt.config.scales = [{unit: 'week', step: 1, format: "project->gantt->zooming['week'];?> #%W"}, {unit:"day", step:1, date:"%D"}] + gantt.config.scales = [{unit: 'week', step: 1, format: "execution->gantt->zooming['week'];?> #%W"}, {unit:"day", step:1, date:"%D"}] gantt.config.scale_height = 60; break; case "month": gantt.config.min_column_width = 70; gantt.config.scale_height = 60; - gantt.config.scales = [{unit: 'month', step: 1, format: '%M'}, {unit:"week", step:1, date:"project->gantt->zooming['week'];?> #%W"}]; + gantt.config.scales = [{unit: 'month', step: 1, format: '%M'}, {unit:"week", step:1, date:"execution->gantt->zooming['week'];?> #%W"}]; break; } gantt.render(); diff --git a/module/repo/control.php b/module/repo/control.php index c7c3ea7633..5a4779c469 100644 --- a/module/repo/control.php +++ b/module/repo/control.php @@ -272,9 +272,10 @@ class repo extends control $this->commonAction($repoID, $objectID); - $file = $entry; - $repo = $this->repo->getRepoByID($repoID); - $entry = $this->repo->decodePath($entry); + $file = $entry; + $repo = $this->repo->getRepoByID($repoID); + $entry = $this->repo->decodePath($entry); + $revision = str_replace('*', '-', $revision); $this->scm->setEngine($repo); $info = $this->scm->info($entry, $revision); diff --git a/module/search/model.php b/module/search/model.php index 770c90cc3f..5605abff9c 100644 --- a/module/search/model.php +++ b/module/search/model.php @@ -334,7 +334,7 @@ class searchModel extends model * * @param int $queryID * @access public - * @return string + * @return object */ public function getQuery($queryID) { @@ -357,6 +357,20 @@ class searchModel extends model return $query; } + /** + * Get a query. + * + * @param int $queryID + * @access public + * @return object + */ + public function getByID($queryID) + { + $query = $this->dao->findByID($queryID)->from(TABLE_USERQUERY)->fetch(); + if(!$query) return false; + return $query; + } + /** * Save current query to db. * diff --git a/module/search/view/buildform.html.php b/module/search/view/buildform.html.php index 7af76e8e24..52918a87dc 100644 --- a/module/search/view/buildform.html.php +++ b/module/search/view/buildform.html.php @@ -228,7 +228,7 @@ foreach($fieldParams as $fieldName => $param) @@ -363,7 +363,6 @@ $(function() var setDateField = function(query, fieldNO) { var $period = $('#selectPeriod'); - if($period.length) $period.remove(); "; diff --git a/module/story/control.php b/module/story/control.php index dc976c96ee..cfa42bfa95 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1132,8 +1132,6 @@ class story extends control $reviewers = $this->story->getReviewerPairs($storyID, $story->version); $reviewedBy = trim($story->reviewedBy, ','); - $superReviewers = trim(zget($this->config->story, 'superReviewers', ''), ','); - $checkSuperReviewed = empty($reviewedBy) ? false : strpos(",$superReviewers,", ",$reviewedBy,"); $this->executeHooks($storyID); @@ -1165,7 +1163,6 @@ class story extends control $this->view->preAndNext = $this->loadModel('common')->getPreAndNextObject('story', $storyID); $this->view->from = $from; $this->view->param = $param; - $this->view->checkSuperReviewed = $checkSuperReviewed !== false ? true : false; $this->display(); } @@ -1341,6 +1338,7 @@ class story extends control { $changes = $this->story->close($storyID); if(dao::isError()) return print(js::error(dao::getError())); + $this->story->closeParentRequirement($storyID); if($changes) { diff --git a/module/story/model.php b/module/story/model.php index 245ba7a3b5..4240c85c9e 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -2989,6 +2989,25 @@ class storyModel extends model return array(0 => '') + $stories ; } + /** + * Close requirement if all son story for segmentation has been closed. + * + * @param int $storyID + * @access public + * @return void + */ + public function closeParentRequirement($storyID) + { + $parentID = $this->dao->select('BID')->from(TABLE_RELATION)->where('AID')->eq($storyID)->fetch(); + $stories = $this->dao->select('t2.id, t2.status')->from(TABLE_RELATION)->alias('t1') + ->leftJoin(TABLE_STORY)->alias('t2')->on('t2.id=t1.AID') + ->where('t1.BType')->eq('requirement') + ->andWhere('t2.status')->ne('closed') + ->andWhere('t2.type')->eq('story') + ->fetchPairs(); + if(empty($stories)) $this->close($parentID->BID); + } + /** * Get stories of a user. * diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php index f0c8895767..b6967b86c7 100644 --- a/module/story/view/view.html.php +++ b/module/story/view/view.html.php @@ -395,7 +395,6 @@ story->assignedTo;?> assignedTo) echo zget($users, $story->assignedTo) . $lang->at . $story->assignedDate;?> - story->reviewers;?> @@ -410,7 +409,6 @@ ?> - story->reviewedDate;?> reviewedBy) echo $story->reviewedDate;?> diff --git a/module/todo/js/common.js b/module/todo/js/common.js index d0dd53402a..e6f4a994ce 100644 --- a/module/todo/js/common.js +++ b/module/todo/js/common.js @@ -48,7 +48,7 @@ function loadList(type, id, defaultType, idvalue) if(data.length != 0) { $(divClass).html(data).find('select').chosen(); - if(config.currentMethod == 'edit') $(divClass).html(data).find('select').val(idvalue).trigger('chosen:updated'); + if(config.currentMethod == 'edit' || type == 'feedback') $(divClass).html(data).find('select').val(idvalue).trigger('chosen:updated'); } else { diff --git a/module/todo/js/create.js b/module/todo/js/create.js index 46315fd964..bd5ffd5a0e 100644 --- a/module/todo/js/create.js +++ b/module/todo/js/create.js @@ -31,7 +31,7 @@ $(function() }); $('#pri').on('change', function() - { + { var $select = $(this); var $selector = $select.closest('.pri-selector'); var value = $select.val(); diff --git a/module/todo/model.php b/module/todo/model.php index 512756c9d5..d3a569fac3 100644 --- a/module/todo/model.php +++ b/module/todo/model.php @@ -553,7 +553,7 @@ class todoModel extends model if($todo->type == 'risk' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_RISK)->fetch('name'); if($todo->type == 'opportunity' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_OPPORTUNITY)->fetch('name'); if($todo->type == 'review' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_REVIEW)->fetch('title'); - if($todo->type == 'feedback' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_FEEDBACK)->fetch('title'); + if($todo->type == 'feedback' and $this->config->edition != 'open') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_FEEDBACK)->fetch('title'); $todo->begin = date::formatTime($todo->begin); $todo->end = date::formatTime($todo->end); diff --git a/module/todo/view/create.html.php b/module/todo/view/create.html.php index 26e62d13aa..b565b6bdb1 100644 --- a/module/todo/view/create.html.php +++ b/module/todo/view/create.html.php @@ -171,7 +171,7 @@ - createLink('my', 'todo', 'type=all'), $lang->goback, '', "class='btn btn-back btn-wide'");?> + session->todoList, $lang->goback, '', "class='btn btn-back btn-wide'");?> diff --git a/module/tree/lang/en.php b/module/tree/lang/en.php index 04f5afe740..9fb6632a2e 100644 --- a/module/tree/lang/en.php +++ b/module/tree/lang/en.php @@ -18,7 +18,7 @@ $lang->tree->browseTask = 'Manage Task Module'; $lang->tree->manage = 'Manage Module'; $lang->tree->fix = 'Fix Module'; $lang->tree->manageProduct = "Manage {$lang->productCommon} Modules"; -$lang->tree->manageExecution = "Manage {$lang->executionCommon} Modules"; +$lang->tree->manageExecution = "Manage {$lang->execution->common} Modules"; $lang->tree->manageLine = "Manage {$lang->productCommon} Line"; $lang->tree->manageBug = 'Manage Bug'; $lang->tree->manageCase = 'Manage Case'; @@ -32,7 +32,7 @@ $lang->tree->manageLineChild = "Manage {$lang->productCommon} Line"; $lang->tree->manageBugChild = 'Manage Child Modules of Bugs'; $lang->tree->manageCaseChild = 'Manage Child Cases'; $lang->tree->manageCaselibChild = 'Manage Child Libraries'; -$lang->tree->manageTaskChild = "Manage Child {$lang->executionCommon} Modules"; +$lang->tree->manageTaskChild = "Manage Child {$lang->execution->common} Modules"; $lang->tree->syncFromProduct = "Copy from Other {$lang->productCommon}s"; $lang->tree->dragAndSort = "Drag to order"; $lang->tree->sort = "Order"; diff --git a/module/tree/lang/zh-cn.php b/module/tree/lang/zh-cn.php index c2b90998d9..5d6c89c0f1 100644 --- a/module/tree/lang/zh-cn.php +++ b/module/tree/lang/zh-cn.php @@ -18,7 +18,7 @@ $lang->tree->browseTask = '任务模块维护'; $lang->tree->manage = '维护模块'; $lang->tree->fix = '修正数据'; $lang->tree->manageProduct = "维护{$lang->productCommon}视图模块"; -$lang->tree->manageExecution = "维护{$lang->executionCommon}视图模块"; +$lang->tree->manageExecution = "维护{$lang->execution->common}视图模块"; $lang->tree->manageLine = "维护{$lang->productCommon}线"; $lang->tree->manageBug = '维护测试视图模块'; $lang->tree->manageCase = '维护用例视图模块'; @@ -32,7 +32,7 @@ $lang->tree->manageLineChild = "维护{$lang->productCommon}线"; $lang->tree->manageBugChild = '维护Bug子模块'; $lang->tree->manageCaseChild = '维护用例子模块'; $lang->tree->manageCaselibChild = '维护用例库子模块'; -$lang->tree->manageTaskChild = "维护{$lang->executionCommon}子模块"; +$lang->tree->manageTaskChild = "维护{$lang->execution->common}子模块"; $lang->tree->syncFromProduct = '复制模块'; $lang->tree->dragAndSort = "拖放排序"; $lang->tree->sort = "排序"; diff --git a/module/upgrade/model.php b/module/upgrade/model.php index bbfee0a1ef..68ffad56fe 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -495,7 +495,8 @@ class upgradeModel extends model $this->updateGroup4Lite(); break; - case '16.5': + case '16_5': + $this->updateProjectStatus(); $this->updateStoryReviewer(); break; } @@ -6181,4 +6182,35 @@ class upgradeModel extends model $this->dao->insert(TABLE_STORYREVIEW)->data($data)->exec(); } } + + /** + * Update the project status. + * + * @access public + * @return void + */ + public function updateProjectStatus() + { + $projects = $this->dao->select('*')->from(TABLE_PROJECT) + ->where('deleted')->eq('0') + ->andWhere('status')->eq('doing') + ->andWhere('type')->eq('project') + ->andWhere('realBegan')->eq('0000-00-00') + ->fetchAll('id'); + + if(empty($projects)) return; + + $projectIDList = array_keys($projects); + + $executions = $this->dao->select('id,project,min(realBegan) as minBegan')->from(TABLE_EXECUTION) + ->where('status')->eq('doing') + ->andWhere('deleted')->eq('0') + ->andWhere('project')->in($projectIDList) + ->groupBy('project') + ->fetchAll(); + + if(empty($executions)) return; + + foreach ($executions as $execution) $this->dao->update(TABLE_PROJECT)->set('realBegan')->eq($execution->minBegan)->where('id')->eq($execution->project)->exec(); + } } diff --git a/module/user/model.php b/module/user/model.php index 1be9b079b9..4cd28e993e 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -228,7 +228,7 @@ class userModel extends model { $users = $this->dao->select('account, realname, avatar, dept, role')->from(TABLE_USER) ->where('deleted')->eq(0) - ->beginIF($accounts)->andWhere('type')->eq($type)->fi() + ->beginIF($type)->andWhere('type')->eq($type)->fi() ->beginIF($accounts)->andWhere('account')->in($accounts)->fi() ->fetchAll('account'); diff --git a/module/user/view/deny.html.php b/module/user/view/deny.html.php index dc42f44198..ec98a85722 100644 --- a/module/user/view/deny.html.php +++ b/module/user/view/deny.html.php @@ -50,7 +50,7 @@ include '../../common/view/header.lite.html.php'; my->common, ($isOnlybody ? '_parent' : ''), 'class="btn show-in-app" onclick="changeLeftNavigation()"'); + echo html::a($this->createLink('my'), $lang->my->common, ($isOnlybody ? '_parent' : ''), "class='btn show-in-app' data-app='my'"); if($refererBeforeDeny) echo html::a(helper::safe64Decode($refererBeforeDeny), $lang->user->goback, ($isOnlybody ? '_parent' : ''), "class='btn'"); echo html::a($this->createLink('user', 'logout', "referer=" . helper::safe64Encode($denyPage)), $lang->user->relogin, ($isOnlybody ? '_parent' : ''), "class='btn btn-primary'"); ?> @@ -60,20 +60,4 @@ include '../../common/view/header.lite.html.php'; - diff --git a/test/class/admin.class.php b/test/class/admin.class.php new file mode 100644 index 0000000000..2fb907a7f6 --- /dev/null +++ b/test/class/admin.class.php @@ -0,0 +1,198 @@ +objectModel = $tester->loadModel('admin'); + $this->user = $tester->loadModel('user'); + $this->communityConfig = $app->loadConfig('community'); + $this->adminConfig = $config->admin; + } + + /** + * Post data form API. + * + * @param string $url + * @param string $formvars + * @access public + * @return void + */ + public function postAPITest() + { + $apiConfig = $this->objectModel->getApiConfig(); + $apiURL = $this->adminConfig->apiRoot . "/user-apiRegister.json?HTTP_X_REQUESTED_WITH=XMLHttpRequest&{$apiConfig->sessionVar}={$apiConfig->sessionID}"; + + $objects = $this->objectModel->postAPI($apiURL); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + + /** + * Get status of zentaopms. + * @access public + * @return void + */ + + public function getStatOfPMSTest() + { + $objects = $this->objectModel->getStatOfPMS(); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + public function getStatOfCompanyTest($companyID) + { + $objects = $this->objectModel->getStatOfCompany($companyID); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + public function getStatOfSysTest() + { + $objects = $this->objectModel->getStatOfSys(); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + public function registerByAPITest() + { + $objects = $this->objectModel->registerByAPI(); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + /** + * Login zentao by API. + * + * @access public + * @return void + */ + public function bindByAPITest($param) + { + $_POST = $param; + $objects = $this->objectModel->bindByAPI(); + $objects = json_decode($objects); + unset($_POST); + if(dao::isError()) return dao::getError(); + + return $objects; + } + + public function getSecretKeyTest() + { + $objects = $this->objectModel->getSecretKey(); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + public function sendCodeByAPITest($type) + { + $objects = $this->objectModel->sendCodeByAPI($type); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + public function certifyByAPITest($type) + { + $objects = $this->objectModel->certifyByAPI($type); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + public function setCompanyByAPITest() + { + $objects = $this->objectModel->setCompanyByAPI(); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + /** + * Get signature. + * + * @param array $params + * @access public + * @return string + */ + + public function getSignatureTest() + { + $params['u'] = $this->communityConfig; + $params['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequet'; + + $apiConfig = $this->objectModel->getApiConfig(); + $params[$apiConfig->sessionVar] = $apiConfig->sessionID; + + $objects = $this->objectModel->getSignature($params); + + if(dao::isError()) return dao::getError(); + + if($objects){ + return true; + }else{ + return false; + } + } + + + public function getApiConfigTest() + { + $objects = $this->objectModel->getApiConfig(); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + /** + * Get register information. + * + * @access public + * @return object + */ + public function getRegisterInfoTest() + { + $objects = $this->objectModel->getRegisterInfo(); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + /** + * Check weak. + * + * @param object $user + * @access public + * @return bool + */ + + public function checkWeakTest($account) + { + $user = $this->user->getById($account); + $objects = $this->objectModel->checkWeak($user); + + if(dao::isError()) return dao::getError(); + + return $objects; + } +} diff --git a/test/class/personnel.class.php b/test/class/personnel.class.php index 3115b4c9fb..c9aa98481d 100644 --- a/test/class/personnel.class.php +++ b/test/class/personnel.class.php @@ -276,7 +276,7 @@ class personnelTest * * @param string $objectType * @param int $objectID - * @param string mixed $user + * @param array mixed $user * @access public * @return void */ @@ -292,8 +292,20 @@ class personnelTest return $objects; } + /** + * Delete product whitelist Test + * + * @param int mixed $productID + * @param string $account + * @access public + * @return void + */ public function deleteProductWhitelistTest($productID, $account = '') { + global $tester; + $this->addWhitelistTest('product', $productID, array('admin')); + $tester->dao->update(TABLE_ACL)->set('source')->eq('sync')->where('objectID')->eq($productID)->andWhere('objectType')->eq('product')->exec(); + $objects = $this->objectModel->deleteProductWhitelist($productID, $account); if(dao::isError()) return dao::getError(); @@ -301,8 +313,19 @@ class personnelTest return $objects; } - public function deleteProgramWhitelistTest($programID = 0, $account = '') + /** + * Delete program whitelist Test + * + * @param int $programID + * @param string $account + * @access public + * @return void + */ + public function deleteProgramWhitelistTest($programID, $account) { + global $tester; + $this->addWhitelistTest('program', $programID, array($account)); + $tester->dao->update(TABLE_ACL)->set('source')->eq('sync')->where('objectID')->eq($programID)->andWhere('objectType')->eq('program')->exec(); $objects = $this->objectModel->deleteProgramWhitelist($programID, $account); if(dao::isError()) return dao::getError(); @@ -310,8 +333,19 @@ class personnelTest return $objects; } - public function deleteProjectWhitelistTest($objectID = 0, $account = '') + /** + * Delete project whitelist Test + * + * @param int mixed $objectID + * @param string mixed $account + * @access public + * @return void + */ + public function deleteProjectWhitelistTest($objectID, $account) { + global $tester; + $this->addWhitelistTest('project', $objectID, array($account)); + $tester->dao->update(TABLE_ACL)->set('source')->eq('sync')->where('objectID')->eq($objectID)->andWhere('objectType')->eq('project')->exec(); $objects = $this->objectModel->deleteProjectWhitelist($objectID, $account); if(dao::isError()) return dao::getError(); @@ -319,8 +353,19 @@ class personnelTest return $objects; } + /** + * Delete execution whitelist Test + * + * @param int mixed $executionID + * @param string $account + * @access public + * @return void + */ public function deleteExecutionWhitelistTest($executionID, $account = '') { + global $tester; + $this->addWhitelistTest('sprint', $executionID, array($account)); + $tester->dao->update(TABLE_ACL)->set('source')->eq('sync')->where('objectID')->eq($executionID)->andWhere('objectType')->eq('sprint')->exec(); $objects = $this->objectModel->deleteExecutionWhitelist($executionID, $account); if(dao::isError()) return dao::getError(); @@ -328,8 +373,21 @@ class personnelTest return $objects; } + /** + * Delete whitelist Test + * + * @param array $users + * @param string $objectType + * @param int $objectID + * @param int $groupID + * @access public + * @return void + */ public function deleteWhitelistTest($users = array(), $objectType = 'program', $objectID = 0, $groupID = 0) { + global $tester; + $this->addWhitelistTest($objectType, $objectID, $users); + $tester->dao->update(TABLE_ACL)->set('source')->eq('sync')->where('objectID')->eq($objectID)->andWhere('objectType')->eq($objectType)->exec(); $objects = $this->objectModel->deleteWhitelist($users, $objectType, $objectID, $groupID); if(dao::isError()) return dao::getError(); diff --git a/test/class/report.class.php b/test/class/report.class.php index 7f197be0eb..1bdf2caa4e 100644 --- a/test/class/report.class.php +++ b/test/class/report.class.php @@ -5,6 +5,7 @@ class reportTest { global $tester; $this->objectModel = $tester->loadModel('report'); + $tester->dao->delete()->from(TABLE_ACTION)->where('id')->gt(100)->exec(); } /** @@ -75,10 +76,16 @@ class reportTest */ public function getExecutionsTest($begin = 0, $end = 0) { + global $tester; + $tester->dao->update(TABLE_EXECUTION)->set('`status`')->eq('closed')->where('`id`')->in('101,102,103,107,111,121,151,183')->exec(); + $begin = $begin != 0 ? date('Y-m-d', strtotime(date('Y-m-d') . $begin)) : 0; $end = $end != 0 ? date('Y-m-d', strtotime(date('Y-m-d') . $end)) : 0; $objects = $this->objectModel->getExecutions($begin, $end); + $tester->dao->update(TABLE_EXECUTION)->set('`status`')->eq('wait')->where('`id`')->in('101,103,107,111,121,151,183')->exec(); + $tester->dao->update(TABLE_EXECUTION)->set('`status`')->eq('doing')->where('`id`')->in('102')->exec(); + if(dao::isError()) return dao::getError(); $executions = ''; @@ -135,13 +142,31 @@ class reportTest return $count; } + /** + * Test get workload. + * + * @param int $dept + * @param string $assign + * @access public + * @return string + */ public function getWorkloadTest($dept = 0, $assign = 'assign') { - $objects = $this->objectModel->getWorkload($dept = 0, $assign = 'assign'); + $objects = $this->objectModel->getWorkload($dept, $assign); if(dao::isError()) return dao::getError(); - return $objects; + $workload = ''; + foreach($objects as $user => $work) + { + if(strlen($workload) > 40) break; + + $workload .= "$user:"; + foreach($work['total'] as $key => $value) $workload .= "$key:$value,"; + $workload = trim($workload, ','); + $workload .= ';'; + } + return $workload; } /** @@ -161,53 +186,88 @@ class reportTest return $count; } - public function getSysURLTest() - { - $objects = $this->objectModel->getSysURL(); - - if(dao::isError()) return dao::getError(); - - return $objects; - } - + /** + * Test get user bugs. + * + * @access public + * @return string + */ public function getUserBugsTest() { $objects = $this->objectModel->getUserBugs(); if(dao::isError()) return dao::getError(); - return $objects; + $counts = ''; + foreach($objects as $user => $bugs) $counts .= "$user:" . count($bugs) . ';'; + return $counts; } + /** + * Test get user tasks. + * + * @access public + * @return string + */ public function getUserTasksTest() { $objects = $this->objectModel->getUserTasks(); if(dao::isError()) return dao::getError(); - return $objects; + $counts = ''; + foreach($objects as $user => $tasks) $counts .= "$user:" . count($tasks) . ';'; + return $counts; } - public function getUserTodosTest() + /** + * Test get user todos. + * + * @access public + * @return string + */ + public function getUserTodosTest($userType) { $objects = $this->objectModel->getUserTodos(); if(dao::isError()) return dao::getError(); - return $objects; + $counts = ''; + foreach($objects as $user => $todos) + { + if(strpos($user, $userType) !== false and str_replace($userType, '', $user) < 11) $counts .= "$user:" . count($todos) . ';'; + } + return $counts; } + /** + * Test get user test tasks. + * + * @access public + * @return string + */ public function getUserTestTasksTest() { $objects = $this->objectModel->getUserTestTasks(); if(dao::isError()) return dao::getError(); - return $objects; + $counts = ''; + foreach($objects as $user => $testtasks) $counts .= "$user:" . count($testtasks) . ';'; + return $counts; } - public function getUserYearLoginsTest($accounts, $year) + /** + * Test get user login count in this year. + * + * @param string $accounts + * @access public + * @return int + */ + public function getUserYearLoginsTest($accounts) { + $year = date('Y'); + $objects = $this->objectModel->getUserYearLogins($accounts, $year); if(dao::isError()) return dao::getError(); @@ -215,8 +275,17 @@ class reportTest return $objects; } - public function getUserYearActionsTest($accounts, $year) + /** + * Test get user action count in this year. + * + * @param array $accounts + * @access public + * @return void + */ + public function getUserYearActionsTest($accounts) { + $year = date('Y'); + $objects = $this->objectModel->getUserYearActions($accounts, $year); if(dao::isError()) return dao::getError(); @@ -224,49 +293,102 @@ class reportTest return $objects; } - public function getUserYearContributionsTest($accounts, $year) + /** + * Test get user contributions in this year. + * + * @param array $accounts + * @access public + * @return string + */ + public function getUserYearContributionsTest($accounts) { + $year = date('Y'); + $objects = $this->objectModel->getUserYearContributions($accounts, $year); if(dao::isError()) return dao::getError(); - return $objects; + $contributions = ''; + foreach($objects as $type => $contributionTypes) + { + $contributions .= "$type:"; + foreach($contributionTypes as $contributionType => $count) $contributions .= "$contributionType:$count,"; + $contributions = trim($contributions, ',') . ';'; + } + return $contributions; } - public function getUserYearTodosTest($accounts, $year) + /** + * Test get user todo stat in this year. + * + * @param array $accounts + * @access public + * @return string + */ + public function getUserYearTodosTest($accounts) { + $year = date('Y'); $objects = $this->objectModel->getUserYearTodos($accounts, $year); if(dao::isError()) return dao::getError(); - return $objects; + $count = ''; + foreach($objects as $type => $value) $count .= "$type:$value;"; + return $count; } - public function getUserYearEffortsTest($accounts, $year) + /** + * Test get user effort stat in this error. + * + * @param string $accounts + * @access public + * @return object + */ + public function getUserYearEffortsTest($accounts) { - $objects = $this->objectModel->getUserYearEfforts($accounts, $year); + $year = date('Y'); + + $object = $this->objectModel->getUserYearEfforts($accounts, $year); if(dao::isError()) return dao::getError(); - return $objects; + return $object; } - public function getUserYearProductsTest($accounts, $year) + /** + * Test get count of created story,plan and closed story by accounts every product in this year. + * + * @param mixed $accounts + * @access public + * @return void + */ + public function getUserYearProductsTest($accounts) { + $year = date('Y'); + $objects = $this->objectModel->getUserYearProducts($accounts, $year); if(dao::isError()) return dao::getError(); - return $objects; + return implode(',', array_keys($objects)); } - public function getUserYearExecutionsTest($accounts, $year) + /** + * Test get count of finished task, story and resolved bug by accounts every executions in this years. + * + * @param string $accounts + * @access public + * @return string + */ + public function getUserYearExecutionsTest($accounts) { + $year = date('Y'); + $objects = $this->objectModel->getUserYearExecutions($accounts, $year); if(dao::isError()) return dao::getError(); - return $objects; + return implode(',', array_keys($objects)); } /** @@ -290,49 +412,96 @@ class reportTest return $types; } - public function getYearObjectStatTest($accounts, $year, $objectType) + /** + * Test get year object stat, include status and action stat. + * + * @param string $accounts + * @param string $objectType + * @access public + * @return string + */ + public function getYearObjectStatTest($accounts, $objectType) { + $year = date('Y'); + $objects = $this->objectModel->getYearObjectStat($accounts, $year, $objectType); if(dao::isError()) return dao::getError(); - return $objects; + $stats = ''; + foreach($objects['statusStat'] as $stat => $count) $stats .= "$stat:$count;"; + return $stats; } - public function getYearCaseStatTest($accounts, $year) + /** + * Test get year case stat, include result and action stat. + * + * @param string $accounts + * @access public + * @return string + */ + public function getYearCaseStatTest($accounts) { + $year = date('Y'); + $objects = $this->objectModel->getYearCaseStat($accounts, $year); if(dao::isError()) return dao::getError(); - return $objects; + $result = ''; + foreach($objects['resultStat'] as $type => $value) $result .= "$type:$value;"; + return $result; } + /** + * Test get year months. + * + * @param string $year + * @access public + * @return string + */ public function getYearMonthsTest($year) { $objects = $this->objectModel->getYearMonths($year); if(dao::isError()) return dao::getError(); - return $objects; + return implode(',', $objects); } + /** + * Test get status overview. + * + * @param string $objectType + * @param array $statusStat + * @access public + * @return string + */ public function getStatusOverviewTest($objectType, $statusStat) { - $objects = $this->objectModel->getStatusOverview($objectType, $statusStat); + $object = $this->objectModel->getStatusOverview($objectType, $statusStat); if(dao::isError()) return dao::getError(); - return $objects; + return $object; } + /** + * Test get project status overview. + * + * @param array $accounts + * @access public + * @return string + */ public function getProjectStatusOverviewTest($accounts = array()) { - $objects = $this->objectModel->getProjectStatusOverview($accounts = array()); + $objects = $this->objectModel->getProjectStatusOverview($accounts); if(dao::isError()) return dao::getError(); - return $objects; + $counts = ''; + foreach($objects as $type => $count) $counts .= "$type:$count;"; + return $counts; } /** @@ -343,8 +512,9 @@ class reportTest * @access public * @return string */ - public function getOutput4APITest($accounts, $year) + public function getOutput4APITest($accounts) { + $year = date('Y'); $objects = $this->objectModel->getOutput4API($accounts, $year); if(dao::isError()) return dao::getError(); @@ -354,12 +524,19 @@ class reportTest return $output; } - public function getProjectExecutionsTest() + /** + * Test get project and execution name. + * + * @param bool $count + * @access public + * @return int|array + */ + public function getProjectExecutionsTest($count = false) { $objects = $this->objectModel->getProjectExecutions(); if(dao::isError()) return dao::getError(); - return $objects; + return $count ? count($objects) : $objects; } } diff --git a/test/data/moretask.yaml b/test/data/moretask.yaml index 19a589fe73..264461b304 100644 --- a/test/data/moretask.yaml +++ b/test/data/moretask.yaml @@ -185,8 +185,7 @@ fields: format: "" - field: assignedTo note: "指派给" - from: common.user.v1.yaml - use: user + range: "" prefix: "" postfix: "" loop: 0 diff --git a/test/data/task.yaml b/test/data/task.yaml index d74d81ee78..8adca0b47c 100644 --- a/test/data/task.yaml +++ b/test/data/task.yaml @@ -185,8 +185,7 @@ fields: format: "" - field: assignedTo note: "指派给" - from: common.user.v1.yaml - use: user + range: "" prefix: "" postfix: "" loop: 0 diff --git a/test/data/taskestimate.yaml b/test/data/taskestimate.yaml index a77ef4aebd..e947141c7c 100644 --- a/test/data/taskestimate.yaml +++ b/test/data/taskestimate.yaml @@ -12,12 +12,12 @@ fields: format: "" - field: date note: "更新日期" - from: common.date.v1.yaml - use: dateB + range: "(-1M)-(+1w):60s" + type: timestamp + format: "YYYY-MM-DD hh:mm:ss" prefix: "" postfix: "" loop: 0 - format: "" - field: left note: "总计消耗" range: 0 diff --git a/test/data/taskson.yaml b/test/data/taskson.yaml index eab4b3786c..3b7c794305 100644 --- a/test/data/taskson.yaml +++ b/test/data/taskson.yaml @@ -185,8 +185,7 @@ fields: format: "" - field: assignedTo note: "指派给" - from: common.user.v1.yaml - use: user + range: po82,user92 prefix: "" postfix: "" loop: 0 diff --git a/test/model/admin/bindbyapi.php.bak b/test/model/admin/bindbyapi.php.bak new file mode 100755 index 0000000000..e16727e4f7 --- /dev/null +++ b/test/model/admin/bindbyapi.php.bak @@ -0,0 +1,27 @@ +#!/usr/bin/env php +bindByAPI(); +cid=1 +pid=1 + +正常测试 >> success;wxm11,j8a5qCRTleJh9Gv4 +错误密码测试 >> fail;登录失败,请检查您的用户名或密码是否填写正确。 +post数据为空测试 >> fail;登录失败,请检查您的用户名或密码是否填写正确。 + +*/ + +$admin = new adminTest(); + +$paramInfo = array('account' => 'wxm11', 'password' => '123qweasd', 'sn' => 'c8aa3269e181f2b9258ce96625de1497', 'site' => 'http://zentaopmsdemo.com'); +$errorPwd = array('account' => 'wxm11', 'password' => '123', 'sn' => 'c8aa3269e181f2b9258ce96625de1497', 'site' => 'http://zentaopmsdemo.com'); +$emptyPost = array(); + +r($admin->bindByAPITest($errorPwd)) && p('result;message') && e('fail;登录失败,请检查您的用户名或密码是否填写正确。'); //错误密码测试 +r($admin->bindByAPITest($emptyPost)) && p('result;message') && e('fail;登录失败,请检查您的用户名或密码是否填写正确。'); //post数据为空测试 +r($admin->bindByAPITest($paramInfo)) && p('result;data:account,private') && e('success;wxm11,j8a5qCRTleJh9Gv4'); //正常测试 diff --git a/test/model/admin/certifybyapi.php.bak b/test/model/admin/certifybyapi.php.bak new file mode 100755 index 0000000000..ff9b52002c --- /dev/null +++ b/test/model/admin/certifybyapi.php.bak @@ -0,0 +1,19 @@ +#!/usr/bin/env php +certifyByAPI(); +cid=1 +pid=1 + + + +*/ + +$admin = new adminTest(); + +r($admin->certifyByAPITest()) && p() && e(); \ No newline at end of file diff --git a/test/model/admin/checkweak.php b/test/model/admin/checkweak.php new file mode 100755 index 0000000000..57345dcaa4 --- /dev/null +++ b/test/model/admin/checkweak.php @@ -0,0 +1,20 @@ +#!/usr/bin/env php +checkWeak(); +cid=1 +pid=1 + +正常测试 >> 0 + +*/ +$account = 'admin'; + +$admin = new adminTest(); + +r($admin->checkWeakTest($account)) && p() && e('0'); //正常测试 \ No newline at end of file diff --git a/test/model/admin/getapiconfig.php.bak b/test/model/admin/getapiconfig.php.bak new file mode 100755 index 0000000000..3293350d96 --- /dev/null +++ b/test/model/admin/getapiconfig.php.bak @@ -0,0 +1,19 @@ +#!/usr/bin/env php +getApiConfig(); +cid=1 +pid=1 + + + +*/ + +$admin = new adminTest(); + +r($admin->getApiConfigTest()) && p() && e(); \ No newline at end of file diff --git a/test/model/admin/getregisterinfo.php b/test/model/admin/getregisterinfo.php new file mode 100755 index 0000000000..8ffcbd13f9 --- /dev/null +++ b/test/model/admin/getregisterinfo.php @@ -0,0 +1,19 @@ +#!/usr/bin/env php +getRegisterInfo(); +cid=1 +pid=1 + +正常测试 >> 易软天创网络科技有限公司 + +*/ + +$admin = new adminTest(); + +r($admin->getRegisterInfoTest()) && p('company') && e('易软天创网络科技有限公司'); //正常测试 \ No newline at end of file diff --git a/test/model/admin/getsecretkey.php.bak b/test/model/admin/getsecretkey.php.bak new file mode 100755 index 0000000000..60e1f74a66 --- /dev/null +++ b/test/model/admin/getsecretkey.php.bak @@ -0,0 +1,19 @@ +#!/usr/bin/env php +getSecretKey(); +cid=1 +pid=1 + + + +*/ + +$admin = new adminTest(); + +r($admin->getSecretKeyTest()) && p() && e(); \ No newline at end of file diff --git a/test/model/admin/getsignature.php b/test/model/admin/getsignature.php new file mode 100755 index 0000000000..b49acdb2ab --- /dev/null +++ b/test/model/admin/getsignature.php @@ -0,0 +1,18 @@ +#!/usr/bin/env php +getSignature(); +cid=1 +pid=1 + +正常测试 >> 1 + +*/ +$admin = new adminTest(); + +r($admin->getSignatureTest()) && p() && e('1'); //正常测试 \ No newline at end of file diff --git a/test/model/admin/getstatofcompany.php.bak b/test/model/admin/getstatofcompany.php.bak new file mode 100755 index 0000000000..b988fce125 --- /dev/null +++ b/test/model/admin/getstatofcompany.php.bak @@ -0,0 +1,19 @@ +#!/usr/bin/env php +getStatOfCompany(); +cid=1 +pid=1 + + + +*/ + +$admin = new adminTest(); + +r($admin->getStatOfCompanyTest()) && p() && e(); \ No newline at end of file diff --git a/test/model/admin/getstatofpms.php b/test/model/admin/getstatofpms.php new file mode 100755 index 0000000000..f039b99b87 --- /dev/null +++ b/test/model/admin/getstatofpms.php @@ -0,0 +1,19 @@ +#!/usr/bin/env php +getStatOfPMS(); +cid=1 +pid=1 + +正常测试 >> 0 + +*/ + +$admin = new adminTest(); + +r($admin->getStatOfPMSTest()) && p() && e('0'); //正常测试 \ No newline at end of file diff --git a/test/model/admin/getstatofsys.php.bak b/test/model/admin/getstatofsys.php.bak new file mode 100755 index 0000000000..4316e5cc1f --- /dev/null +++ b/test/model/admin/getstatofsys.php.bak @@ -0,0 +1,19 @@ +#!/usr/bin/env php +getStatOfSys(); +cid=1 +pid=1 + + + +*/ + +$admin = new adminTest(); + +r($admin->getStatOfSysTest()) && p() && e(); \ No newline at end of file diff --git a/test/model/admin/postapi.php.bak b/test/model/admin/postapi.php.bak new file mode 100755 index 0000000000..0bef9f9f5f --- /dev/null +++ b/test/model/admin/postapi.php.bak @@ -0,0 +1,20 @@ +#!/usr/bin/env php +postAPI(); +cid=1 +pid=1 + + + +*/ + +$admin = new adminTest(); + +a($admin->postAPITest());die; +r($admin->postAPITest()) && p() && e(); \ No newline at end of file diff --git a/test/model/admin/registerbyapi.php.bak b/test/model/admin/registerbyapi.php.bak new file mode 100755 index 0000000000..8b1a182acb --- /dev/null +++ b/test/model/admin/registerbyapi.php.bak @@ -0,0 +1,19 @@ +#!/usr/bin/env php +registerByAPI(); +cid=1 +pid=1 + + + +*/ + +$admin = new adminTest(); + +r($admin->registerByAPITest()) && p() && e(); \ No newline at end of file diff --git a/test/model/admin/sendcodebyapi.php.bak b/test/model/admin/sendcodebyapi.php.bak new file mode 100755 index 0000000000..a810fff39b --- /dev/null +++ b/test/model/admin/sendcodebyapi.php.bak @@ -0,0 +1,19 @@ +#!/usr/bin/env php +sendCodeByAPI(); +cid=1 +pid=1 + + + +*/ + +$admin = new adminTest(); + +r($admin->sendCodeByAPITest()) && p() && e(); \ No newline at end of file diff --git a/test/model/admin/setcompanybyapi.php.bak b/test/model/admin/setcompanybyapi.php.bak new file mode 100755 index 0000000000..8e8572f782 --- /dev/null +++ b/test/model/admin/setcompanybyapi.php.bak @@ -0,0 +1,19 @@ +#!/usr/bin/env php +setCompanyByAPI(); +cid=1 +pid=1 + + + +*/ + +$admin = new adminTest(); + +r($admin->setCompanyByAPITest()) && p() && e(); \ No newline at end of file diff --git a/test/model/bug/confirm.php b/test/model/bug/confirm.php index a90a1e2043..311839d258 100755 --- a/test/model/bug/confirm.php +++ b/test/model/bug/confirm.php @@ -30,6 +30,6 @@ $bug = new bugTest(); r($bug->confirmTest($bugIDlist[0],$bug1)) && p('0:field,old,new;1:field,old,new') && e('assignedTo,admin,user92;confirmed,0,1'); // 确认指派人变化的bug r($bug->confirmTest($bugIDlist[1],$bug3)) && p('0:field,old,new;1:field,old,new') && e('type,install,codeerror;confirmed,0,1'); // 确认类型变化的bug r($bug->confirmTest($bugIDlist[2],$bug4)) && p('0:field,old,new') && e('assignedTo,admin,user95'); // 确认已确认的bug -r($bug->confirmTest($bugIDlist[3],$bug5)) && p('0:field,old,new;1:field,old,new') && e('status,resolved,active;;pri,3,2'); // 确认优先级变化的bug +r($bug->confirmTest($bugIDlist[3],$bug5)) && p('0:field,old,new;1:field,old,new') && e('status,resolved,active;pri,3,2'); // 确认优先级变化的bug r($bug->confirmTest($bugIDlist[4],$bug8)) && p('0:field,old,new') && e('status,closed,active'); // 确认bug system("./ztest init"); diff --git a/test/model/bug/createbugfromgitlabissue.php b/test/model/bug/createbugfromgitlabissue.php index 4643b3ea58..c481435603 100755 --- a/test/model/bug/createbugfromgitlabissue.php +++ b/test/model/bug/createbugfromgitlabissue.php @@ -44,7 +44,7 @@ $bug5->execution = $executionID; $bug=new bugTest(); r($bug->createBugFromGitlabIssueTest($bug1, $executionID)) && p('title') && e('问题1'); // 测试正常的创建来源于gitlab issue的bug的title -r($bug->createBugFromGitlabIssueTest($bug2, $executionID)) && p('execution') && e("$executionID"); // 测试正常的创建来源于gitlab issue的bug的execution +r($bug->createBugFromGitlabIssueTest($bug2, $executionID)) && p('execution') && e('101'); // 测试正常的创建来源于gitlab issue的bug的execution r($bug->createBugFromGitlabIssueTest($bug3, $executionID)) && p('pri') && e('3'); // 测试正常的创建来源于gitlab issue的bug的pri r($bug->createBugFromGitlabIssueTest($bug4, $executionID)) && p('severity') && e('3'); // 测试正常的创建来源于gitlab issue的bug的severity r($bug->createBugFromGitlabIssueTest($bug5, $executionID)) && p('title:0') && e('『Bug标题』不能为空。'); // 测试创建没有标题 来源于gitlab issue的异常bug diff --git a/test/model/bug/getdataofbugsperassignedto.php b/test/model/bug/getdataofbugsperassignedto.php index be5d2d698a..cc6269e823 100755 --- a/test/model/bug/getdataofbugsperassignedto.php +++ b/test/model/bug/getdataofbugsperassignedto.php @@ -18,7 +18,7 @@ pid=1 $bug=new bugTest(); -r($bug->getDataOfBugsPerAssignedToTest()) && p('admin:name,value') && e('admin,80'); // 获取用户admin数据 +r($bug->getDataOfBugsPerAssignedToTest()) && p('admin:name,value') && e('admin,85'); // 获取用户admin数据 r($bug->getDataOfBugsPerAssignedToTest()) && p('dev1:name,value') && e('开发1,85'); // 获取用户dev1数据 r($bug->getDataOfBugsPerAssignedToTest()) && p('test1:name,value') && e('测试1,85'); // 获取用户test1数据 r($bug->getDataOfBugsPerAssignedToTest()) && p('closed:name,value') && e('Closed,20'); // 获取用户closed数据 diff --git a/test/model/bug/getdataofopenedbugsperday.php b/test/model/bug/getdataofopenedbugsperday.php index f1c700da29..3530616d0f 100755 --- a/test/model/bug/getdataofopenedbugsperday.php +++ b/test/model/bug/getdataofopenedbugsperday.php @@ -9,10 +9,10 @@ title=bugModel->getDataOfOpenedBugsPerDay(); cid=1 pid=1 -获取创建的数据 >> 315 +获取创建的数据 >> 23 */ $bug=new bugTest(); -r($bug->getDataOfOpenedBugsPerDayTest()) && p('0:value') && e('315'); // 获取创建的数据 +r($bug->getDataOfOpenedBugsPerDayTest()) && p('0:value') && e('23'); // 获取创建的数据 diff --git a/test/model/bug/getuserbugs.php b/test/model/bug/getuserbugs.php index a80e06f3ef..167d6a14ea 100755 --- a/test/model/bug/getuserbugs.php +++ b/test/model/bug/getuserbugs.php @@ -22,7 +22,7 @@ $accountIDList = array('admin', 'test1', 'test2', 'dev1', 'po1'); $bug=new bugTest(); r($bug->getUserBugsTest($accountIDList[0])) && p() && e('85'); // 测试获取用户admin的bug -r($bug->getUserBugsTest($accountIDList[1])) && p() && e('55'); // 测试获取用户test1的bug +r($bug->getUserBugsTest($accountIDList[1])) && p() && e('85'); // 测试获取用户test1的bug r($bug->getUserBugsTest($accountIDList[2])) && p() && e('0'); // 测试获取用户test2的bug r($bug->getUserBugsTest($accountIDList[3])) && p() && e('55'); // 测试获取用户dev1的bug r($bug->getUserBugsTest($accountIDList[4])) && p() && e('0'); // 测试获取用户po1的bug diff --git a/test/model/bug/update.php b/test/model/bug/update.php index 7d3899c674..05908734c5 100755 --- a/test/model/bug/update.php +++ b/test/model/bug/update.php @@ -28,7 +28,7 @@ $t_untitle = array('title' => 'jack'); $t_untype = array('type' => 'install'); $bug=new bugTest(); -r($bug->updateObject($projectIdList[0], $t_uptitle)) && p('0:field,old,new') && e('title,正常bug2,john'); // 测试更新bug名称 +r($bug->updateObject($projectIdList[0], $t_uptitle)) && p('0:field,old,new') && e('title,BUG1,john'); // 测试更新bug名称 r($bug->updateObject($projectIdList[0], $t_uptype)) && p('0:field,old,new') && e('type,codeerror,config'); // 测试更新bug类型 r($bug->updateObject($projectIdList[0], $t_typetitle)) && p('0:field,old,new;1:field,old,new') && e('title,john,jack;type,config,install'); // 测试更新bug名称和类型 r($bug->updateObject($projectIdList[0], $t_untitle)) && p() && e('没有数据更新'); // 测试不更改bug名称 diff --git a/test/model/personnel/addwhitelist.php b/test/model/personnel/addwhitelist.php old mode 100644 new mode 100755 index ee45a7b2eb..a9bdcb041f --- a/test/model/personnel/addwhitelist.php +++ b/test/model/personnel/addwhitelist.php @@ -2,7 +2,6 @@ addWhitelist(); cid=1 pid=1 +测试正常添加白名单 >> 0 +测试不传用户名的情况,这里不传用户名会导致删除符合条件的数据 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->addWhitelistTest()) && p() && e(); \ No newline at end of file +$user = array(); +$user[0] = array('admin'); +$user[1] = array(); + +$objectID = array(); +$objectID[0] = 11; +$objectID[1] = 21; + +$objectType = array(); +$objectType[0] = 'project'; +$objectType[1] = 'program'; +$objectType[2] = 'product'; +$objectType[3] = 'sprint'; + +$result1 = $personnel->addWhitelistTest($objectType[0], $objectID[0], $user[0]); +$result2 = $personnel->addWhitelistTest($objectType[0], $objectID[0], $user[1]); + +r($result1) && p() && e('0'); //测试正常添加白名单 +r($result2) && p() && e('0'); //测试不传用户名的情况,这里不传用户名会导致删除符合条件的数据 \ No newline at end of file diff --git a/test/model/personnel/buildsearchform.php b/test/model/personnel/buildsearchform.php old mode 100644 new mode 100755 index edcd239213..b506babce5 --- a/test/model/personnel/buildsearchform.php +++ b/test/model/personnel/buildsearchform.php @@ -2,7 +2,6 @@ buildSearchForm(); cid=1 pid=1 + + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->buildSearchFormTest()) && p() && e(); \ No newline at end of file +//r($personnel->buildSearchFormTest()) && p() && e(); \ No newline at end of file diff --git a/test/model/personnel/canviewprogram.php b/test/model/personnel/canviewprogram.php index 5cae45f2e1..0acdfcbbf2 100755 --- a/test/model/personnel/canviewprogram.php +++ b/test/model/personnel/canviewprogram.php @@ -10,6 +10,9 @@ title=测试 personnelModel->canViewProgram(); cid=1 pid=1 +看是否具有访问权限有的情况 >> 1 +看是否具有访问权限no的情况 >> 1 + */ $personnel = new personnelTest('admin'); @@ -21,4 +24,4 @@ $account = array(); $account[0] = 'test2'; r($personnel->canViewProgramTest(1, 'test2')) && p() && e('1'); //看是否具有访问权限有的情况 -r($personnel->canViewProgramTest(10000, 'test2')) && p() && e('1'); //看是否具有访问权限no的情况 +r($personnel->canViewProgramTest(10000, 'test2')) && p() && e('1'); //看是否具有访问权限no的情况 \ No newline at end of file diff --git a/test/model/personnel/creatememberlink.php b/test/model/personnel/creatememberlink.php old mode 100644 new mode 100755 index c991ed8e18..854972754b --- a/test/model/personnel/creatememberlink.php +++ b/test/model/personnel/creatememberlink.php @@ -2,7 +2,6 @@ createMemberLink(); cid=1 pid=1 + + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->createMemberLinkTest()) && p() && e(); \ No newline at end of file +//r($personnel->createMemberLinkTest()) && p() && e(); \ No newline at end of file diff --git a/test/model/personnel/deleteexecutionwhitelist.php b/test/model/personnel/deleteexecutionwhitelist.php old mode 100644 new mode 100755 index 3d9cdc899a..fbce5664f2 --- a/test/model/personnel/deleteexecutionwhitelist.php +++ b/test/model/personnel/deleteexecutionwhitelist.php @@ -2,7 +2,6 @@ deleteExecutionWhitelist(); cid=1 pid=1 +调用add方法创建spring类型的白名单,并修改source为sync,然后再通过条件删除 >> 0 +不传参数的情况,删除id为0的匹配数据,为空则跳过 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->deleteExecutionWhitelistTest()) && p() && e(); \ No newline at end of file +$executionID = array(); +$executionID[0] = 16; +$executionID[1] = ''; + +$account = array(); +$account[0] = 'admin'; +$account[1] = ''; + +$result1 = $personnel->deleteExecutionWhitelistTest($executionID[0], $account[0]); +$result2 = $personnel->deleteExecutionWhitelistTest($executionID[1], $account[1]); + +r($result1) && p() && e('0'); //调用add方法创建spring类型的白名单,并修改source为sync,然后再通过条件删除 +r($result2) && p() && e('0'); //不传参数的情况,删除id为0的匹配数据,为空则跳过 \ No newline at end of file diff --git a/test/model/personnel/deleteproductwhitelist.php b/test/model/personnel/deleteproductwhitelist.php old mode 100644 new mode 100755 index 999f5735d8..53c32813b4 --- a/test/model/personnel/deleteproductwhitelist.php +++ b/test/model/personnel/deleteproductwhitelist.php @@ -2,7 +2,6 @@ deleteProductWhitelist(); cid=1 pid=1 +删除了产品10的白名单,这里有个条件,source必须为sync,同步过来的才能删 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->deleteProductWhitelistTest()) && p() && e(); \ No newline at end of file +$productID = array(); +$productID[0] = 10; +$peoductID[1] = 11111; + +$account = array(); +$account[0] = 'admin'; +$account[1] = 'test111'; + +$result1 = $personnel->deleteProductWhitelistTest($productID[0], $account[0]); + +r($result1) && p() && e('0'); //删除了产品10的白名单,这里有个条件,source必须为sync,同步过来的才能删 \ No newline at end of file diff --git a/test/model/personnel/deleteprogramwhitelist.php b/test/model/personnel/deleteprogramwhitelist.php old mode 100644 new mode 100755 index 62b756d600..1203c49240 --- a/test/model/personnel/deleteprogramwhitelist.php +++ b/test/model/personnel/deleteprogramwhitelist.php @@ -2,7 +2,6 @@ deleteProgramWhitelist(); cid=1 pid=1 +我这里通过add方法创建了一个id为10的项目集白名单,并修改source为同步,然后删除创建的这条信息 >> 0 +传入空时这里我删除了一个objectID为0的,program白名单信息,如果没这条数据跳过 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->deleteProgramWhitelistTest()) && p() && e(); \ No newline at end of file +$programID = array(); +$programID[0] = 10; +$programID[1] = ''; + +$account = array(); +$account[0] = 'dev10'; +$account[1] = ''; + +$result1 = $personnel->deleteProgramWhitelistTest($programID[0], $account[0]); +$result2 = $personnel->deleteProgramWhitelistTest($programID[1], $account[1]); + +r($result1) && p() && e('0'); //我这里通过add方法创建了一个id为10的项目集白名单,并修改source为同步,然后删除创建的这条信息 +r($result2) && p() && e('0'); //传入空时这里我删除了一个objectID为0的,program白名单信息,如果没这条数据跳过 \ No newline at end of file diff --git a/test/model/personnel/deleteprojectwhitelist.php b/test/model/personnel/deleteprojectwhitelist.php old mode 100644 new mode 100755 index 9ef63d7cf4..34d93aa1aa --- a/test/model/personnel/deleteprojectwhitelist.php +++ b/test/model/personnel/deleteprojectwhitelist.php @@ -2,7 +2,6 @@ deleteProjectWhitelist(); cid=1 pid=1 +通过add方法创建一个白名单,这里判断了objectType为sprint的情况,正常传入无法删除 >> 0 +传入空的情况时,删除为objectID为0的数据,如果空,则跳过 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->deleteProjectWhitelistTest()) && p() && e(); \ No newline at end of file +$projectID = array(); +$projectID[0] = 15; +$projectID[1] = ''; + +$account = array(); +$account[0] = 'dev15'; +$account[1] = ''; + +$result1 = $personnel->deleteProjectWhitelistTest($projectID[0], $account[0]); +$result2 = $personnel->deleteProjectWhitelistTest($projectID[1], $account[1]); + +r($result1) && p() && e('0'); //通过add方法创建一个白名单,这里判断了objectType为sprint的情况,正常传入无法删除 +r($result2) && p() && e('0'); //传入空的情况时,删除为objectID为0的数据,如果空,则跳过 \ No newline at end of file diff --git a/test/model/personnel/deletewhitelist.php b/test/model/personnel/deletewhitelist.php old mode 100644 new mode 100755 index f3e767a268..b20f0ee32c --- a/test/model/personnel/deletewhitelist.php +++ b/test/model/personnel/deletewhitelist.php @@ -2,7 +2,6 @@ deleteWhitelist(); cid=1 pid=1 +创建删除objectID为2的项目白名单 >> 0 +创建删除objectID为2的产品白名单 >> 0 +创建删除objectID为10的项目集白名单 >> 0 +创建删除objectID为11的执行白名单 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->deleteWhitelistTest()) && p() && e(); \ No newline at end of file +$users = array(); +$users[0] = 'dev17'; + +$objectType = array(); +$objectType[0] = 'project'; +$objectType[1] = 'product'; +$objectType[2] = 'program'; +$objectType[3] = 'sprint'; + +$objectID = array(); +$objectID[0] = '2'; +$objectID[1] = '10'; +$objectID[2] = '11'; + +$groupID = array(); +$groupID[0] = '1'; +$groupID[1] = '2'; + +$result1 = $personnel->deleteWhitelistTest($users, $objectType[0], $objectID[0]); +$result2 = $personnel->deleteWhitelistTest($users, $objectType[1], $objectID[0]); +$result3 = $personnel->deleteWhitelistTest($users, $objectType[2], $objectID[1]); +$result4 = $personnel->deleteWhitelistTest($users, $objectType[3], $objectID[2]); + +r($result1) && p() && e('0'); //创建删除objectID为2的项目白名单 +r($result2) && p() && e('0'); //创建删除objectID为2的产品白名单 +r($result3) && p() && e('0'); //创建删除objectID为10的项目集白名单 +r($result4) && p() && e('0'); //创建删除objectID为11的执行白名单 \ No newline at end of file diff --git a/test/model/personnel/getaccessiblepersonnel.php b/test/model/personnel/getaccessiblepersonnel.php index 43024dcef0..1c0059f6b1 100755 --- a/test/model/personnel/getaccessiblepersonnel.php +++ b/test/model/personnel/getaccessiblepersonnel.php @@ -10,6 +10,11 @@ title=测试 personnelModel->getAccessiblePersonnel(); cid=1 pid=1 +测试取出结果集中的一个对象里的名字programID=1 >> 测试1 +测试取出匹配的数量 >> 10 +测试取出结果集中的一个对象里的名字programID=2 >> 开发11 +测试取出匹配的数量 >> 10 + */ $personnel = new personnelTest('admin'); @@ -38,4 +43,4 @@ $getnumber2 = count($personnel->getAccessiblePersonnelTest($programID[1], $dep r($getrealname1) && p('realname') && e('测试1'); //测试取出结果集中的一个对象里的名字programID=1 r($getnumber1) && p() && e('10'); //测试取出匹配的数量 r($getrealname2) && p('realname') && e('开发11'); //测试取出结果集中的一个对象里的名字programID=2 -r($getnumber2) && p() && e('10'); //测试取出匹配的数量 +r($getnumber2) && p() && e('10'); //测试取出匹配的数量 \ No newline at end of file diff --git a/test/model/personnel/getbugandstoryinvest.php b/test/model/personnel/getbugandstoryinvest.php old mode 100644 new mode 100755 index f31002d347..7e58149b51 --- a/test/model/personnel/getbugandstoryinvest.php +++ b/test/model/personnel/getbugandstoryinvest.php @@ -2,7 +2,6 @@ getBugAndStoryInvest(); cid=1 pid=1 + + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->getBugAndStoryInvestTest()) && p() && e(); \ No newline at end of file +//r($personnel->getBugAndStoryInvestTest()) && p() && e(); \ No newline at end of file diff --git a/test/model/personnel/getcopiedobjects.php b/test/model/personnel/getcopiedobjects.php old mode 100644 new mode 100755 index 698551d7cb..8785e24dde --- a/test/model/personnel/getcopiedobjects.php +++ b/test/model/personnel/getcopiedobjects.php @@ -2,7 +2,6 @@ getCopiedObjects(); cid=1 pid=1 +取出匹配的项目数量 >> 20 +取出其中一个匹配的项目 >> 独立项目20 +取出匹配的产品数量 >> 119 +取出其中一个匹配的产品 >> 多平台产品100 +取出匹配的项目集数量 >> 9 +取出其中一个匹配的项目集 >> 项目集10 +取出匹配的执行数量 >> 10 +取出其中一个匹配的执行 >>    独立项目20 +传入不存在的objectID匹配的执行数量 >> 0 +传入空值时取出匹配的执行数量 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->getCopiedObjectsTest()) && p() && e(); \ No newline at end of file +$objectID = array(); +$objectID[0] = 1; +$objectID[1] = 2; +$objectID[2] = 11111; +$objectID[3] = ''; + +$objectType = array(); +$objectType[0] = 'project'; +$objectType[1] = 'product'; +$objectType[2] = 'program'; +$objectType[3] = 'sprint'; + +$result1 = $personnel->getCopiedObjectsTest($objectID[0], $objectType[0]); +$result2 = $personnel->getCopiedObjectsTest($objectID[0], $objectType[1]); +$result3 = $personnel->getCopiedObjectsTest($objectID[1], $objectType[2]); +$result4 = $personnel->getCopiedObjectsTest($objectID[1], $objectType[3]); +$result5 = $personnel->getCopiedObjectsTest($objectID[2], $objectType[3]); +$result6 = $personnel->getCopiedObjectsTest($objectID[2], $objectType[3]); + +//a($result);die; +r(count($result1)) && p() && e('20'); //取出匹配的项目数量 +r($result1) && p('750') && e('独立项目20'); //取出其中一个匹配的项目 +r(count($result2)) && p() && e('119'); //取出匹配的产品数量 +r($result2) && p('100') && e('多平台产品100'); //取出其中一个匹配的产品 +r(count($result3)) && p() && e('9'); //取出匹配的项目集数量 +r($result3) && p('10') && e('项目集10'); //取出其中一个匹配的项目集 +r(count($result4)) && p() && e('10'); //取出匹配的执行数量 +r($result4) && p('750') && e('   独立项目20'); //取出其中一个匹配的执行 +r(count($result5)) && p() && e('0'); //传入不存在的objectID匹配的执行数量 +r(count($result6)) && p() && e('0'); //传入空值时取出匹配的执行数量 \ No newline at end of file diff --git a/test/model/personnel/getinvest.php b/test/model/personnel/getinvest.php index 4ab1075f40..7278652501 100755 --- a/test/model/personnel/getinvest.php +++ b/test/model/personnel/getinvest.php @@ -10,6 +10,8 @@ title=测试 personnelModel->getInvest(); cid=1 pid=1 + + */ $personnel = new personnelTest('admin'); @@ -22,4 +24,4 @@ $invest1 = count($personnel->getInvestTest($programID[0])); $invest2 = count($personnel->getInvestTest($programID[1])); r($invest1) && p($invest1) && e(''); //获得项目id=1的授权用户数量 -r($invest2) && p($invest2) && e(''); //获得项目id=2的授权用户数量 +r($invest2) && p($invest2) && e(''); //获得项目id=2的授权用户数量 \ No newline at end of file diff --git a/test/model/personnel/getinvolvedexecutions.php b/test/model/personnel/getinvolvedexecutions.php index 1f7f6ec81d..73f04ea8cf 100755 --- a/test/model/personnel/getinvolvedexecutions.php +++ b/test/model/personnel/getinvolvedexecutions.php @@ -2,7 +2,6 @@ getInvolvedExecutions(); cid=1 pid=1 +涉及到执行的人员计数 >> 8 +取出其中一个 >> 1 +传入不存在的id >> 0 + */ $personnel = new personnelTest('admin'); $project = array(); -$project[0] = 101; -$project[1] = 102; +$project[0] = array(11, 12); +$project[1] = 12222; -r($personnel->getInvolvedExecutionsTest($project)) && p() && e(''); // +$result1 = count($personnel->getInvolvedExecutionsTest($project[0])); +$result2 = $personnel->getInvolvedExecutionsTest($project[0]); +$result3 = $personnel->getInvolvedExecutionsTest($project[1]); + +r($result1) && p() && e('8'); //涉及到执行的人员计数 +r($result2) && p('pm72') && e('1'); //取出其中一个 +r($result3) && p() && e('0'); //传入不存在的id \ No newline at end of file diff --git a/test/model/personnel/getinvolvedprojects.php b/test/model/personnel/getinvolvedprojects.php old mode 100644 new mode 100755 index d1b7d1357e..ed856f1ca4 --- a/test/model/personnel/getinvolvedprojects.php +++ b/test/model/personnel/getinvolvedprojects.php @@ -2,7 +2,6 @@ getInvolvedProjects(); cid=1 pid=1 +计数project11,12的团队人员个数 >> 4 +取出其中一个角色 >> 1 +传入不存在的ID >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->getInvolvedProjectsTest()) && p() && e(); \ No newline at end of file +$projectID = array(); +$projectID[0] = array(11, 12); +$projectID[1] = array(1111); + +$result1 = count($personnel->getInvolvedProjectsTest($projectID[0])); +$result2 = $personnel->getInvolvedProjectsTest($projectID[0]); +$result3 = count($personnel->getInvolvedProjectsTest($projectID[1])); + +r($result1) && p() && e('4'); //计数project11,12的团队人员个数 +r($result2) && p('admin') && e('1'); //取出其中一个角色 +r($result3) && p() && e('0'); //传入不存在的ID \ No newline at end of file diff --git a/test/model/personnel/getissueinvest.php b/test/model/personnel/getissueinvest.php old mode 100644 new mode 100755 index 2cda93661f..70df9a3cc4 --- a/test/model/personnel/getissueinvest.php +++ b/test/model/personnel/getissueinvest.php @@ -2,7 +2,6 @@ getIssueInvest(); cid=1 pid=1 + + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); r($personnel->getIssueInvestTest()) && p() && e(); \ No newline at end of file diff --git a/test/model/personnel/getprojecttaskinvest.php b/test/model/personnel/getprojecttaskinvest.php old mode 100644 new mode 100755 index 691c956177..a8a3dd73ed --- a/test/model/personnel/getprojecttaskinvest.php +++ b/test/model/personnel/getprojecttaskinvest.php @@ -2,7 +2,6 @@ getProjectTaskInvest(); cid=1 pid=1 +次方法为页面上的项目信息,人员,创建人物 >> 0 +次方法为页面上的项目信息,人员,已完成任务 >> 0 +次方法为页面上的项目信息,人员,待处理 >> 0 +次方法为页面上的项目信息,人员,任务消耗 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->getProjectTaskInvestTest()) && p() && e(); \ No newline at end of file +$projectID = array(); +$projectID[0] = 11; +$projectID[1] = 12; + +$account = array(); +$account[0] = 'admin'; +$account[1] = 'user3'; + +$result1 = $personnel->getProjectTaskInvestTest($projectID, $account); + +r($result1) && p('0:createdTask') && e('0'); //次方法为页面上的项目信息,人员,创建人物 +r($result1) && p('0:finishedTask') && e('0'); //次方法为页面上的项目信息,人员,已完成任务 +r($result1) && p('0:pendingTask') && e('0'); //次方法为页面上的项目信息,人员,待处理 +r($result1) && p('0:consumedTask') && e('0'); //次方法为页面上的项目信息,人员,任务消耗 \ No newline at end of file diff --git a/test/model/personnel/getriskinvest.php b/test/model/personnel/getriskinvest.php index 8abe2503b6..e9242ce909 100755 --- a/test/model/personnel/getriskinvest.php +++ b/test/model/personnel/getriskinvest.php @@ -10,10 +10,12 @@ title=测试 personnelModel->getRiskInvest(); cid=1 pid=1 + + */ $personnel = new personnelTest('admin'); var_dump($personnel->getRiskInvestTest(array('test2', 'test3'), array(1, 2, 3)));die; -r($personnel->getRiskInvestTest()) && p() && e(); +r($personnel->getRiskInvestTest()) && p() && e(); \ No newline at end of file diff --git a/test/model/personnel/getsprintandstage.php b/test/model/personnel/getsprintandstage.php old mode 100644 new mode 100755 index ad77fac728..1a2d4afc3f --- a/test/model/personnel/getsprintandstage.php +++ b/test/model/personnel/getsprintandstage.php @@ -2,7 +2,6 @@ getSprintAndStage(); cid=1 pid=1 + + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->getSprintAndStageTest()) && p() && e(); \ No newline at end of file +//r($personnel->getSprintAndStageTest()) && p() && e(); \ No newline at end of file diff --git a/test/model/personnel/getuserefforthours.php b/test/model/personnel/getuserefforthours.php old mode 100644 new mode 100755 index ebac34ab07..7a189e417c --- a/test/model/personnel/getuserefforthours.php +++ b/test/model/personnel/getuserefforthours.php @@ -10,8 +10,19 @@ title=测试 personnelModel->getUserEffortHours(); cid=1 pid=1 +正常传入的情况 >> 0 +传入不存在的情况 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->getUserEffortHoursTest()) && p() && e(); \ No newline at end of file +$projectID = array(); +$projectID[0] = 11; +$projectID[1] = 11111; + +$result1 = $personnel->getUserEffortHoursTest($projectID[0]); +$result2 = $personnel->getUserEffortHoursTest($projectID[1]); + +r($result1) && p() && e('0'); //正常传入的情况 +r($result2) && p() && e('0'); //传入不存在的情况 \ No newline at end of file diff --git a/test/model/personnel/getuserhours.php b/test/model/personnel/getuserhours.php old mode 100644 new mode 100755 index a134a1fd95..dbc3ae0b6d --- a/test/model/personnel/getuserhours.php +++ b/test/model/personnel/getuserhours.php @@ -10,8 +10,39 @@ title=测试 personnelModel->getUserHours(); cid=1 pid=1 +取出admin工时 >> 4 +取出po82的工时 >> 3 +取出匹配的人员数量 >> 2 +当传入一个存在的角色一个不存在的角色时,打印其中存在的角色工时 >> 4 +其中一个为空时,取出匹配的人员数量 >> 1 +当传入task不存在时 >> 0 +当task不存在时,取出匹配个数 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->getUserHoursTest()) && p() && e(); \ No newline at end of file +$userTask = array(); +$userTask['po82'] = array(1); +$userTask['admin'] = array(2); + +$userTask1 = array(); +$userTask1['test111'] = array(1); +$userTask1['admin'] = array(2); + +$userTask2 = array(); +$userTask2['admin'] = array(1111); +$userTask2['po82'] = array(1112); + +$result1 = $personnel->getUserHoursTest($userTask); +$result2 = count($personnel->getUserHoursTest($userTask)); +$result3 = $personnel->getUserHoursTest($userTask1); +$result4 = $personnel->getUserHoursTest($userTask2); + +r($result1) && p('admin:consumed') && e('4'); //取出admin工时 +r($result1) && p('po82:consumed') && e('3'); //取出po82的工时 +r($result2) && p() && e('2'); //取出匹配的人员数量 +r($result3) && p('admin:consumed') && e('4'); //当传入一个存在的角色一个不存在的角色时,打印其中存在的角色工时 +r(count($result3)) && p() && e('1'); //其中一个为空时,取出匹配的人员数量 +r($result4) && p('admin:consumed') && e('0'); //当传入task不存在时 +r(count($result4)) && p() && e('0'); //当task不存在时,取出匹配个数 \ No newline at end of file diff --git a/test/model/personnel/getwhitelist.php b/test/model/personnel/getwhitelist.php old mode 100644 new mode 100755 index 5d2f1e51ca..37799e3803 --- a/test/model/personnel/getwhitelist.php +++ b/test/model/personnel/getwhitelist.php @@ -2,7 +2,6 @@ getWhitelist(); cid=1 pid=1 +取出对应object1的项目人员数量 >> 2 +取出其中一个人员项目经理10 >> 项目经理10 +取出另一个人员admin >> admin +取出对应object2的执行人员数量 >> 0 +当传入不存在的objectID时,取出匹配执行人员数量 >> 0 +当传入空时,查看匹配执行的人员数量 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->getWhitelistTest()) && p() && e(); \ No newline at end of file +$objectID = array(); +$objectID[0] = 1; +$objectID[1] = 2; +$objectID[2] = 11111; +$objectID[3] = ''; + +$objectType = array(); +$objectType[0] = 'project'; +$objectType[1] = 'program'; +$objectType[2] = 'product'; +$objectType[3] = 'sprint'; + +$result1 = $personnel->getWhitelistTest($objectID[0], $objectType[1]); +$result2 = $personnel->getWhitelistTest($objectID[1], $objectType[3]); +$result3 = $personnel->getWhitelistTest($objectID[2], $objectType[3]); +$result4 = $personnel->getWhitelistTest($objectID[3], $objectType[1]); + +r(count($result1)) && p() && e('2'); //取出对应object1的项目人员数量 +r($result1) && p('0:realname') && e('项目经理10'); //取出其中一个人员项目经理10 +r($result1) && p('1:realname') && e('admin'); //取出另一个人员admin +r(count($result2)) && p() && e('0'); //取出对应object2的执行人员数量 +r(count($result3)) && p() && e('0'); //当传入不存在的objectID时,取出匹配执行人员数量 +r(count($result4)) && p() && e('0'); //当传入空时,查看匹配执行的人员数量 \ No newline at end of file diff --git a/test/model/personnel/getwhitelistaccount.php b/test/model/personnel/getwhitelistaccount.php old mode 100644 new mode 100755 index d1d2eed402..69b7bfef0a --- a/test/model/personnel/getwhitelistaccount.php +++ b/test/model/personnel/getwhitelistaccount.php @@ -2,7 +2,6 @@ getWhitelistAccount(); cid=1 pid=1 +这是一个正常测试,统计关联白名单人员数量 >> 2 +取出其中一个数据admin >> admin +取出另一个数据dev10 >> dev10 +取出objectid2的白名单数量 >> 0 +当objectID不存在时,统计匹配数量 >> 0 +当传入参数为空时,统计匹配人员数量 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->getWhitelistAccountTest()) && p() && e(); \ No newline at end of file +$objectID = array(); +$objectID[0] = 1; +$objectID[1] = 2; +$objectID[2] = 1111; +$objectID[3] = ''; + +$objectType = array(); +$objectType[0] = 'project'; +$objectType[1] = 'program'; +$objectType[2] = 'product'; +$objectType[3] = 'sprint'; + +$result1 = $personnel->getWhitelistAccountTest($objectID[0], $objectType[1]); +$result2 = $personnel->getWhitelistAccountTest($objectID[1], $objectType[2]); +$result3 = $personnel->getWhitelistAccountTest($objectID[2], $objectType[3]); +$result4 = $personnel->getWhitelistAccountTest($objectID[3], $objectType[0]); + +r(count($result1)) && p() && e('2'); //这是一个正常测试,统计关联白名单人员数量 +r($result1) && p('admin') && e('admin'); //取出其中一个数据admin +r($result1) && p('dev10') && e('dev10'); //取出另一个数据dev10 +r(count($result2)) && p() && e('0'); //取出objectid2的白名单数量 +r(count($result3)) && p() && e('0'); //当objectID不存在时,统计匹配数量 +r(count($result4)) && p() && e('0'); //当传入参数为空时,统计匹配人员数量 \ No newline at end of file diff --git a/test/model/personnel/updatewhitelist.php b/test/model/personnel/updatewhitelist.php old mode 100644 new mode 100755 index b513f5c90a..3d05269ae5 --- a/test/model/personnel/updatewhitelist.php +++ b/test/model/personnel/updatewhitelist.php @@ -2,7 +2,6 @@ updateWhitelist(); cid=1 pid=1 +传入已有参数时,数据变更类型source为add >> 0 +传入已有参数时,数据变更type为blacklist >> 0 +传入没有的参数时,新建一条source为sync的数据 >> 0 + */ -$personnel = new personnelTest(); +$personnel = new personnelTest('admin'); -r($personnel->updateWhitelistTest()) && p() && e(); \ No newline at end of file +$user = array(); +$user[0] = array('admin', 'dev10'); +$user[1] = array('test1', 'test2'); + +$objectType = array(); +$objectType[0] = 'project'; +$objectType[1] = 'program'; +$objectType[2] = 'product'; +$objectType[3] = 'sprint'; + +$objectID = array(); +$objectID[0] = 1; +$objectID[1] = 2; + +$type = array(); +$type[0] = 'whitelist'; +$type[1] = 'blacklist'; + +$source = array(); +$source[0] = 'update'; +$source[1] = 'add'; +$source[2] = 'sync'; + +$updateType = array(); +$updateType[0] = 'increase'; +$updateType[1] = 'replace'; + +$result1 = $personnel->updateWhitelistTest($user[0], $objectType[0], $objectID[1], $type[0], $source[1], $updateType[0]); +$result2 = $personnel->updateWhitelistTest($user[0], $objectType[1], $objectID[0], $type[1], $source[0], $updateType[1]); +$result3 = $personnel->updateWhitelistTest($user[1], $objectType[0], $objectID[0], $type[0], $source[2], $updateType[0]); + +r($result1) && p() && e('0'); //传入已有参数时,数据变更类型source为add +r($result2) && p() && e('0'); //传入已有参数时,数据变更type为blacklist +r($result3) && p() && e('0'); //传入没有的参数时,新建一条source为sync的数据 \ No newline at end of file diff --git a/test/model/report/createsinglejson.php b/test/model/report/createsinglejson.php index 4091dae87a..75777567e3 100755 --- a/test/model/report/createsinglejson.php +++ b/test/model/report/createsinglejson.php @@ -10,11 +10,11 @@ title=测试 reportModel->createSingleJSON(); cid=1 pid=1 -测试获取执行 101 的json数据 >> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] -测试获取执行 102 的json数据 >> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] -测试获取执行 103 的json数据 >> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] +测试获取执行 101 的json数据 >> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36] +测试获取执行 102 的json数据 >> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4] +测试获取执行 103 的json数据 >> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23] 测试获取执行 104 的json数据 >> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12] -测试获取执行 105 的json数据 >> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] +测试获取执行 105 的json数据 >> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6] */ @@ -22,8 +22,8 @@ $report = new reportTest(); $executionID = array(101, 102, 103, 104, 105); -r($report->createSingleJSONTest($executionID[0])) && p() && e('[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]'); // 测试获取执行 101 的json数据 -r($report->createSingleJSONTest($executionID[1])) && p() && e('[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]'); // 测试获取执行 102 的json数据 -r($report->createSingleJSONTest($executionID[2])) && p() && e('[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]'); // 测试获取执行 103 的json数据 -r($report->createSingleJSONTest($executionID[3])) && p() && e('[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12]'); // 测试获取执行 104 的json数据 -r($report->createSingleJSONTest($executionID[4])) && p() && e('[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]'); // 测试获取执行 105 的json数据 \ No newline at end of file +r($report->createSingleJSONTest($executionID[0])) && p() && e('[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36]'); // 测试获取执行 101 的json数据 +r($report->createSingleJSONTest($executionID[1])) && p() && e('[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4]'); // 测试获取执行 102 的json数据 +r($report->createSingleJSONTest($executionID[2])) && p() && e('[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23]'); // 测试获取执行 103 的json数据 +r($report->createSingleJSONTest($executionID[3])) && p() && e('[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12]'); // 测试获取执行 104 的json数据 +r($report->createSingleJSONTest($executionID[4])) && p() && e('[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6]'); // 测试获取执行 105 的json数据 \ No newline at end of file diff --git a/test/model/report/getexecutions.php b/test/model/report/getexecutions.php index 2d60bad624..9f8b4ff667 100755 --- a/test/model/report/getexecutions.php +++ b/test/model/report/getexecutions.php @@ -24,14 +24,9 @@ $end = array('0', ' +10 day', ' +15 day', ' +20 day', ' +25 day', ' +30 day'); $report = new reportTest(); -global $tester; -$tester->dao->update(TABLE_EXECUTION)->set('`status`')->eq('closed')->where('id')->in('101,102,103,107,111,121,151,183')->exec(); - r($report->getExecutionsTest($begin[0], $end[0])) && p() && e('151:30,15,项目51;183:15,30,项目83;121:27,15,项目21;111:27,12,项目11;107:30,35,项目7;103:23,35,项目3;102:9,18,项目2;101:3,15,项目1;'); // 测试查询 开始时间 0 结束时间 0 的执行 r($report->getExecutionsTest($begin[1], $end[1])) && p() && e('103:23,35,项目3;102:9,18,项目2;101:3,15,项目1;'); // 测试查询 开始时间大于 -40 day 结束时间小于 -10 day 的执行 r($report->getExecutionsTest($begin[2], $end[2])) && p() && e('107:30,35,项目7;103:23,35,项目3;102:9,18,项目2;101:3,15,项目1;'); // 测试查询 开始时间大于 -28 day 结束时间小于 +5 day 的执行 r($report->getExecutionsTest($begin[3], $end[3])) && p() && e('111:27,12,项目11;107:30,35,项目7;'); // 测试查询 开始时间大于 -24 day 结束时间小于 +10 day 的执行 r($report->getExecutionsTest($begin[4], $end[4])) && p() && e('111:27,12,项目11;'); // 测试查询 开始时间大于 -20 day 结束时间小于 +15 day 的执行 -r($report->getExecutionsTest($begin[5], $end[5])) && p() && e('121:27,15,项目21;'); // 测试查询 开始时间大于 -20 day 结束时间小于 +20 day 的执行 -$tester->dao->update(TABLE_EXECUTION)->set('`status`')->eq('wait')->where('id')->in('101,103,107,111,121,151,183')->exec(); -$tester->dao->update(TABLE_EXECUTION)->set('`status`')->eq('doing')->where('id')->in('102')->exec(); +r($report->getExecutionsTest($begin[5], $end[5])) && p() && e('121:27,15,项目21;'); // 测试查询 开始时间大于 -20 day 结束时间小于 +20 day 的执行 \ No newline at end of file diff --git a/test/model/report/getproducts.php b/test/model/report/getproducts.php index 5d92b90846..02dec70a33 100755 --- a/test/model/report/getproducts.php +++ b/test/model/report/getproducts.php @@ -10,7 +10,12 @@ title=测试 reportModel->getProducts(); cid=1 pid=1 - +测试获取 story 产品 >> product:80;plan:39 +测试获取 story closedProduct 产品 >> product:120;plan:44 +测试获取 story overduePlan 产品 >> product:80;plan:93 +测试获取 requirement 产品 >> product:80;plan:39 +测试获取 requirement closedProduct 产品 >> product:120;plan:44 +测试获取 requirement overduePlan 产品 >> product:80;plan:93 */ $conditions = array('', 'closedProduct', 'overduePlan'); @@ -18,9 +23,9 @@ $storyType = 'requirement'; $report = new reportTest(); -r($report->getProductsTest($conditions[0])) && p() && e(''); // 测试获取 story 产品 -r($report->getProductsTest($conditions[1])) && p() && e(''); // 测试获取 story closedProduct 产品 -r($report->getProductsTest($conditions[2])) && p() && e(''); // 测试获取 story overduePlan 产品 -r($report->getProductsTest($conditions[0], $storyType)) && p() && e(''); // 测试获取 requirement 产品 -r($report->getProductsTest($conditions[1], $storyType)) && p() && e(''); // 测试获取 requirement closedProduct 产品 -r($report->getProductsTest($conditions[2], $storyType)) && p() && e(''); // 测试获取 requirement overduePlan 产品 \ No newline at end of file +r($report->getProductsTest($conditions[0])) && p() && e('product:80;plan:39'); // 测试获取 story 产品 +r($report->getProductsTest($conditions[1])) && p() && e('product:120;plan:44'); // 测试获取 story closedProduct 产品 +r($report->getProductsTest($conditions[2])) && p() && e('product:80;plan:93'); // 测试获取 story overduePlan 产品 +r($report->getProductsTest($conditions[0], $storyType)) && p() && e('product:80;plan:39'); // 测试获取 requirement 产品 +r($report->getProductsTest($conditions[1], $storyType)) && p() && e('product:120;plan:44'); // 测试获取 requirement closedProduct 产品 +r($report->getProductsTest($conditions[2], $storyType)) && p() && e('product:80;plan:93'); // 测试获取 requirement overduePlan 产品 \ No newline at end of file diff --git a/test/model/report/getprojectexecutions.php b/test/model/report/getprojectexecutions.php new file mode 100755 index 0000000000..edb77c12e7 --- /dev/null +++ b/test/model/report/getprojectexecutions.php @@ -0,0 +1,33 @@ +#!/usr/bin/env php +getProjectExecutions(); +cid=1 +pid=1 + +获取项目执行对 101 >> 项目1/迭代1 +获取项目执行对 102 >> 项目2/迭代2 +获取项目执行对 201 >> 项目11/迭代101 +获取项目执行对 301 >> 项目21/迭代201 +获取项目执行对 401 >> 项目31/阶段301 +获取项目执行个数 >> 450 + +*/ + +$count = true; + +$executionID = array(101, 102, 201, 301, 401); + +$report = new reportTest(); + +r($report->getProjectExecutionsTest()) && p('101') && e('项目1/迭代1'); // 获取项目执行对 101 +r($report->getProjectExecutionsTest()) && p('102') && e('项目2/迭代2'); // 获取项目执行对 102 +r($report->getProjectExecutionsTest()) && p('201') && e('项目11/迭代101'); // 获取项目执行对 201 +r($report->getProjectExecutionsTest()) && p('301') && e('项目21/迭代201'); // 获取项目执行对 301 +r($report->getProjectExecutionsTest()) && p('401') && e('项目31/阶段301'); // 获取项目执行对 401 +r($report->getProjectExecutionsTest($count)) && p() && e('450'); // 获取项目执行个数 \ No newline at end of file diff --git a/test/model/report/getprojectstatusoverview.php b/test/model/report/getprojectstatusoverview.php new file mode 100755 index 0000000000..f6c54b720e --- /dev/null +++ b/test/model/report/getprojectstatusoverview.php @@ -0,0 +1,30 @@ +#!/usr/bin/env php +getProjectStatusOverview(); +cid=1 +pid=1 + +获取项目状态 >> wait:24;doing:44;suspended:11;closed:11; +获取 admin pm92 pm1 为团队成员的项目状态 >> wait:1; +获取 user1 user10 为团队成员的项目状态 >> wait:1; +获取 pm92 po2 为团队成员的项目状态 >> wait:1;doing:1; +获取 user20 user21 为团队成员的项目状态 >> doing:2; +获取 pm92 po10 为团队成员的项目状态 >> wait:1;doing:1; + +*/ +$account = array('admin,pm92,pm1', 'user1,user10', ' pm92,po2', 'user20,user21', 'pm92,po10'); + +$report = new reportTest(); + +r($report->getProjectStatusOverviewTest()) && p() && e('wait:24;doing:44;suspended:11;closed:11;'); // 获取项目状态 +r($report->getProjectStatusOverviewTest($account[0])) && p() && e('wait:1;'); // 获取 admin pm92 pm1 为团队成员的项目状态 +r($report->getProjectStatusOverviewTest($account[1])) && p() && e('wait:1;'); // 获取 user1 user10 为团队成员的项目状态 +r($report->getProjectStatusOverviewTest($account[2])) && p() && e('wait:1;doing:1;'); // 获取 pm92 po2 为团队成员的项目状态 +r($report->getProjectStatusOverviewTest($account[3])) && p() && e('doing:2;'); // 获取 user20 user21 为团队成员的项目状态 +r($report->getProjectStatusOverviewTest($account[4])) && p() && e('wait:1;doing:1;'); // 获取 pm92 po10 为团队成员的项目状态 \ No newline at end of file diff --git a/test/model/report/getstatusoverview.php b/test/model/report/getstatusoverview.php new file mode 100755 index 0000000000..42cdaed8d3 --- /dev/null +++ b/test/model/report/getstatusoverview.php @@ -0,0 +1,25 @@ +#!/usr/bin/env php +getStatusOverview(); +cid=1 +pid=1 + +测试获取 story 状态数量 >> 总需求   21
未完成   16 +测试获取 task 状态数量 >> 总任务   21
未完成   6 +测试获取 bug 状态数量 >> 总Bug   21
未解决   1 + +*/ +$objectType = array('story', 'task', 'bug'); +$statusStat = array('active' => 1, 'wait' => 2, 'doing' => 3, 'done' => 4, 'closed' => 5, 'cancel' => 6); + +$report = new reportTest(); + +r($report->getStatusOverviewTest($objectType[0], $statusStat)) && p() && e('总需求   21
未完成   16'); // 测试获取 story 状态数量 +r($report->getStatusOverviewTest($objectType[1], $statusStat)) && p() && e('总任务   21
未完成   6'); // 测试获取 task 状态数量 +r($report->getStatusOverviewTest($objectType[2], $statusStat)) && p() && e('总Bug   21
未解决   1'); // 测试获取 bug 状态数量 \ No newline at end of file diff --git a/test/model/report/getuserbugs.php b/test/model/report/getuserbugs.php new file mode 100755 index 0000000000..2fd8811da4 --- /dev/null +++ b/test/model/report/getuserbugs.php @@ -0,0 +1,19 @@ +#!/usr/bin/env php +getUserBugs(); +cid=1 +pid=1 + +获取人员bug数 >> admin:79;dev1:52;test1:77 + +*/ + +$report = new reportTest(); + +r($report->getUserBugsTest()) && p() && e('admin:79;dev1:52;test1:77'); // 获取人员bug数 \ No newline at end of file diff --git a/test/model/report/getusertasks.php b/test/model/report/getusertasks.php new file mode 100755 index 0000000000..3355dfbba1 --- /dev/null +++ b/test/model/report/getusertasks.php @@ -0,0 +1,19 @@ +#!/usr/bin/env php +getUserTasks(); +cid=1 +pid=1 + +获取人员任务数 >> po82:2;user92:2; + +*/ + +$report = new reportTest(); + +r($report->getUserTasksTest()) && p() && e('po82:2;user92:2;'); // 获取人员任务数 \ No newline at end of file diff --git a/test/model/report/getusertesttasks.php b/test/model/report/getusertesttasks.php new file mode 100755 index 0000000000..8d328f0f60 --- /dev/null +++ b/test/model/report/getusertesttasks.php @@ -0,0 +1,19 @@ +#!/usr/bin/env php +getUserTestTasks(); +cid=1 +pid=1 + +测试获取测试任务数 >> user3:9;user4:9;user7:8;user8:8;user11:8;user12:8; + +*/ + +$report = new reportTest(); + +r($report->getUserTestTasksTest()) && p() && e('user3:9;user4:9;user7:8;user8:8;user11:8;user12:8;'); // 测试获取测试任务数 \ No newline at end of file diff --git a/test/model/report/getusertodos.php b/test/model/report/getusertodos.php new file mode 100755 index 0000000000..c5b0dff672 --- /dev/null +++ b/test/model/report/getusertodos.php @@ -0,0 +1,31 @@ +#!/usr/bin/env php +getUserTodos(); +cid=1 +pid=1 + +测试获取用户待办数 >> admin:2; +测试获取用户待办数 >> dev1:2;dev2:2;dev5:2;dev6:2;dev9:2;dev10:2; +测试获取用户待办数 >> test1:2;test2:2;test5:2;test6:2;test9:2;test10:2; +测试获取用户待办数 >> user4:2;user5:2;user8:2;user9:2; +测试获取用户待办数 >> pm1:2;pm2:2;pm5:2;pm6:2;pm9:2;pm10:2; +测试获取用户待办数 >> po1:2;po2:2;po5:2;po6:2;po9:2;po10:2; + +*/ + +$userType = array('admin', 'dev', 'test', 'user', 'pm', 'po'); + +$report = new reportTest(); + +r($report->getUserTodosTest($userType[0])) && p() && e('admin:2;'); // 测试获取用户待办数 +r($report->getUserTodosTest($userType[1])) && p() && e('dev1:2;dev2:2;dev5:2;dev6:2;dev9:2;dev10:2; '); // 测试获取用户待办数 +r($report->getUserTodosTest($userType[2])) && p() && e('test1:2;test2:2;test5:2;test6:2;test9:2;test10:2;'); // 测试获取用户待办数 +r($report->getUserTodosTest($userType[3])) && p() && e('user4:2;user5:2;user8:2;user9:2;'); // 测试获取用户待办数 +r($report->getUserTodosTest($userType[4])) && p() && e('pm1:2;pm2:2;pm5:2;pm6:2;pm9:2;pm10:2;'); // 测试获取用户待办数 +r($report->getUserTodosTest($userType[5])) && p() && e('po1:2;po2:2;po5:2;po6:2;po9:2;po10:2;'); // 测试获取用户待办数 \ No newline at end of file diff --git a/test/model/report/getuseryearactions.php b/test/model/report/getuseryearactions.php new file mode 100755 index 0000000000..88a5bbcfca --- /dev/null +++ b/test/model/report/getuseryearactions.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +getUserYearActions(); +cid=1 +pid=1 + +测试获取本年度 admin 的操作数 >> 34 +测试获取本年度 dev17 的操作数 >> 33 +测试获取本年度 test18 的操作数 >> 33 +测试获取本年度 admin dev17 的操作数 >> 67 +测试获取本年度 admin test18 的操作数 >> 67 + +*/ +$accounts = array('admin', 'dev17', 'test18', 'admin,dev17', 'admin,test18'); + +$report = new reportTest(); + +r($report->getUserYearActionsTest($accounts[0])) && p() && e('34'); // 测试获取本年度 admin 的操作数 +r($report->getUserYearActionsTest($accounts[1])) && p() && e('33'); // 测试获取本年度 dev17 的操作数 +r($report->getUserYearActionsTest($accounts[2])) && p() && e('33'); // 测试获取本年度 test18 的操作数 +r($report->getUserYearActionsTest($accounts[3])) && p() && e('67'); // 测试获取本年度 admin dev17 的操作数 +r($report->getUserYearActionsTest($accounts[4])) && p() && e('67'); // 测试获取本年度 admin test18 的操作数 \ No newline at end of file diff --git a/test/model/report/getuseryearcontributions.php b/test/model/report/getuseryearcontributions.php new file mode 100755 index 0000000000..65cad484d9 --- /dev/null +++ b/test/model/report/getuseryearcontributions.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +getUserYearContributions(); +cid=1 +pid=1 + +测试获取本年度 admin 的贡献数 >> repo:svnCommit:1;doc:create:1;case:run:70; +测试获取本年度 dev17 的贡献数 >> bug:close:1;product:close:1;repo:gitCommit:1;case:run:0; +测试获取本年度 test18 的贡献数 >> productplan:create:1;case:run:0; +测试获取本年度 admin dev17 的贡献数 >> bug:close:1;repo:svnCommit:1,gitCommit:1;doc:create:1;product:close:1;case:run:70; +测试获取本年度 admin test18 的贡献数 >> repo:svnCommit:1;doc:create:1;productplan:create:1;case:run:70; + +*/ +$account = array('admin', 'dev17', 'test18', 'admin,dev17', 'admin,test18'); + +$report = new reportTest(); + +r($report->getUserYearContributionsTest($account[0])) && p() && e('repo:svnCommit:1;doc:create:1;case:run:70;'); // 测试获取本年度 admin 的贡献数 +r($report->getUserYearContributionsTest($account[1])) && p() && e('bug:close:1;product:close:1;repo:gitCommit:1;case:run:0;'); // 测试获取本年度 dev17 的贡献数 +r($report->getUserYearContributionsTest($account[2])) && p() && e('productplan:create:1;case:run:0;'); // 测试获取本年度 test18 的贡献数 +r($report->getUserYearContributionsTest($account[3])) && p() && e('bug:close:1;repo:svnCommit:1,gitCommit:1;doc:create:1;product:close:1;case:run:70;'); // 测试获取本年度 admin dev17 的贡献数 +r($report->getUserYearContributionsTest($account[4])) && p() && e('repo:svnCommit:1;doc:create:1;productplan:create:1;case:run:70;'); // 测试获取本年度 admin test18 的贡献数 \ No newline at end of file diff --git a/test/model/report/getuseryearefforts.php b/test/model/report/getuseryearefforts.php new file mode 100755 index 0000000000..12d8e116f0 --- /dev/null +++ b/test/model/report/getuseryearefforts.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +getUserYearEfforts(); +cid=1 +pid=1 + +获取本年度 admin 任务数 >> 599,4188 +获取本年度 po82 任务数 >> 1,3 +获取本年度 user92 任务数 >> 0,0 +获取本年度 admin po82 任务数 >> 600,4191 +获取本年度 admin user92 任务数 >> 599,4188 + +*/ +$account = array('admin', 'po82', 'user92', 'admin,po82', 'admin,user92'); + +$report = new reportTest(); + +r($report->getUserYearEffortsTest($account[0])) && p('count,consumed') && e('599,4188'); // 获取本年度 admin 任务数 +r($report->getUserYearEffortsTest($account[1])) && p('count,consumed') && e('1,3'); // 获取本年度 po82 任务数 +r($report->getUserYearEffortsTest($account[2])) && p('count,consumed') && e('0,0'); // 获取本年度 user92 任务数 +r($report->getUserYearEffortsTest($account[3])) && p('count,consumed') && e('600,4191'); // 获取本年度 admin po82 任务数 +r($report->getUserYearEffortsTest($account[4])) && p('count,consumed') && e('599,4188'); // 获取本年度 admin user92 任务数 \ No newline at end of file diff --git a/test/model/report/getuseryearexecutions.php b/test/model/report/getuseryearexecutions.php new file mode 100755 index 0000000000..8038993812 --- /dev/null +++ b/test/model/report/getuseryearexecutions.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +getUserYearExecutions(); +cid=1 +pid=1 + +测试获取本年度 admin 的执行id >> 120 +测试获取本年度 dev17 的执行id >> 0 +测试获取本年度 test18 的执行id >> 127 +测试获取本年度 admin dev17 的执行id >> 120 +测试获取本年度 admin test18 的执行id >> 127,120 + +*/ +$account = array('admin', 'dev17', 'test18', 'admin,dev17', 'admin,test18'); + +$report = new reportTest(); + +r($report->getUserYearExecutionsTest($account[0])) && p() && e('120'); // 测试获取本年度 admin 的执行id +r($report->getUserYearExecutionsTest($account[1])) && p() && e('0'); // 测试获取本年度 dev17 的执行id +r($report->getUserYearExecutionsTest($account[2])) && p() && e('127'); // 测试获取本年度 test18 的执行id +r($report->getUserYearExecutionsTest($account[3])) && p() && e('120'); // 测试获取本年度 admin dev17 的执行id +r($report->getUserYearExecutionsTest($account[4])) && p() && e('127,120'); // 测试获取本年度 admin test18 的执行id \ No newline at end of file diff --git a/test/model/report/getuseryearlogins.php b/test/model/report/getuseryearlogins.php new file mode 100755 index 0000000000..789a895e82 --- /dev/null +++ b/test/model/report/getuseryearlogins.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +getUserYearLogins(); +cid=1 +pid=1 + +测试获取本年度 admin 的登录次数 >> 0 +测试获取本年度 dev17 的登录次数 >> 0 +测试获取本年度 test18 的登录次数 >> 0 +测试获取本年度 admin dev17 的登录次数 >> 0 +测试获取本年度 admin test18 的登录次数 >> 0 + +*/ +$account = array('admin', 'dev17', 'test18', 'admin,dev17', 'admin,test18'); + +$report = new reportTest(); + +r($report->getUserYearLoginsTest($account[0])) && p() && e('0');// 测试获取本年度 admin 的登录次数 +r($report->getUserYearLoginsTest($account[1])) && p() && e('0');// 测试获取本年度 dev17 的登录次数 +r($report->getUserYearLoginsTest($account[2])) && p() && e('0');// 测试获取本年度 test18 的登录次数 +r($report->getUserYearLoginsTest($account[3])) && p() && e('0');// 测试获取本年度 admin dev17 的登录次数 +r($report->getUserYearLoginsTest($account[4])) && p() && e('0');// 测试获取本年度 admin test18 的登录次数 \ No newline at end of file diff --git a/test/model/report/getuseryearproducts.php b/test/model/report/getuseryearproducts.php new file mode 100755 index 0000000000..88c51a39a5 --- /dev/null +++ b/test/model/report/getuseryearproducts.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +getUserYearProducts(); +cid=1 +pid=1 + +测试获取本年度 po1 的产品数 >> 1,11,21,31,41,51,61,71,81,91,101,111 +测试获取本年度 dev17 的产品数 >> 17,117 +测试获取本年度 test18 的产品数 >> 18,118 +测试获取本年度 po1 dev17 的产品数 >> 1,11,17,21,31,41,51,61,71,81,91,101,111,117 +测试获取本年度 po1 test18 的产品数 >> 1,11,18,21,31,41,51,61,71,81,91,101,111,118 + +*/ +$account = array('po1', 'dev17', 'test18', 'po1,dev17', 'po1,test18'); + +$report = new reportTest(); + +r($report->getUserYearProductsTest($account[0])) && p() && e('1,11,21,31,41,51,61,71,81,91,101,111'); // 测试获取本年度 po1 的产品数 +r($report->getUserYearProductsTest($account[1])) && p() && e('17,117'); // 测试获取本年度 dev17 的产品数 +r($report->getUserYearProductsTest($account[2])) && p() && e('18,118'); // 测试获取本年度 test18 的产品数 +r($report->getUserYearProductsTest($account[3])) && p() && e('1,11,17,21,31,41,51,61,71,81,91,101,111,117'); // 测试获取本年度 po1 dev17 的产品数 +r($report->getUserYearProductsTest($account[4])) && p() && e('1,11,18,21,31,41,51,61,71,81,91,101,111,118'); // 测试获取本年度 po1 test18 的产品数 \ No newline at end of file diff --git a/test/model/report/getuseryeartodos.php b/test/model/report/getuseryeartodos.php new file mode 100755 index 0000000000..3702b14049 --- /dev/null +++ b/test/model/report/getuseryeartodos.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +getUserYearTodos(); +cid=1 +pid=1 + +测试获取本年度 admin 的产品数 >> count:3;undone:3;done:0; +测试获取本年度 dev17 的产品数 >> count:2;undone:2;done:0; +测试获取本年度 dev20 的产品数 >> count:2;undone:2;done:0; +测试获取本年度 admin dev17 的产品数 >> count:5;undone:5;done:0; +测试获取本年度 admin dev20 的产品数 >> count:5;undone:5;done:0; + +*/ +$account = array('admin', 'dev17', 'dev20', 'admin,dev17', 'admin,dev20'); + +$report = new reportTest(); + +r($report->getUserYearTodosTest($account[0])) && p() && e('count:3;undone:3;done:0;'); // 测试获取本年度 admin 的产品数 +r($report->getUserYearTodosTest($account[1])) && p() && e('count:2;undone:2;done:0;'); // 测试获取本年度 dev17 的产品数 +r($report->getUserYearTodosTest($account[2])) && p() && e('count:2;undone:2;done:0;'); // 测试获取本年度 dev20 的产品数 +r($report->getUserYearTodosTest($account[3])) && p() && e('count:5;undone:5;done:0;'); // 测试获取本年度 admin dev17 的产品数 +r($report->getUserYearTodosTest($account[4])) && p() && e('count:5;undone:5;done:0;'); // 测试获取本年度 admin dev20 的产品数 \ No newline at end of file diff --git a/test/model/report/getworkload.php b/test/model/report/getworkload.php new file mode 100755 index 0000000000..8d49a13b00 --- /dev/null +++ b/test/model/report/getworkload.php @@ -0,0 +1,27 @@ +#!/usr/bin/env php +getWorkload(); +cid=1 +pid=1 + +测试获取dept 10 的工作量 >> user92:count:7,manhour:23; +测试获取dept 49 的工作量 >> po82:count:6,manhour:12; +测试获取dept 10 非指派人 的工作量 >> user93:count:0,manhour:0;user94:count:0,manhour:0; +测试获取dept 49 非指派人 的工作量 >> po83:count:0,manhour:0;po84:count:0,manhour:0; + +*/ +$dept = array(10, 49); +$assign = 'noassign'; + +$report = new reportTest(); + +r($report->getWorkloadTest($dept[0])) && p() && e('user92:count:7,manhour:23;'); // 测试获取dept 10 的工作量 +r($report->getWorkloadTest($dept[1])) && p() && e('po82:count:6,manhour:12;'); // 测试获取dept 49 的工作量 +r($report->getWorkloadTest($dept[0], $assign)) && p() && e('user93:count:0,manhour:0;user94:count:0,manhour:0;'); // 测试获取dept 10 非指派人 的工作量 +r($report->getWorkloadTest($dept[1], $assign)) && p() && e('po83:count:0,manhour:0;po84:count:0,manhour:0;'); // 测试获取dept 49 非指派人 的工作量 \ No newline at end of file diff --git a/test/model/report/getyearcasestat.php b/test/model/report/getyearcasestat.php new file mode 100755 index 0000000000..cc3f5893ba --- /dev/null +++ b/test/model/report/getyearcasestat.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +getYearCaseStat(); +cid=1 +pid=1 + +测试获取本年度 admin 的用例数 >> pass:40;fail:30; +测试获取本年度 dev17 的用例数 >> 0 +测试获取本年度 test18 的用例数 >> 0 +测试获取本年度 admin dev17 的用例数 >> pass:40;fail:30; +测试获取本年度 admin test18 的用例数 >> pass:40;fail:30; + +*/ +$account = array('admin', 'dev17', 'test18', 'admin,dev17', 'admin,test18'); + +$report = new reportTest(); + +r($report->getYearCaseStatTest($account[0])) && p() && e('pass:40;fail:30;'); // 测试获取本年度 admin 的用例数 +r($report->getYearCaseStatTest($account[1])) && p() && e('0'); // 测试获取本年度 dev17 的用例数 +r($report->getYearCaseStatTest($account[2])) && p() && e('0'); // 测试获取本年度 test18 的用例数 +r($report->getYearCaseStatTest($account[3])) && p() && e('pass:40;fail:30;'); // 测试获取本年度 admin dev17 的用例数 +r($report->getYearCaseStatTest($account[4])) && p() && e('pass:40;fail:30;'); // 测试获取本年度 admin test18 的用例数 \ No newline at end of file diff --git a/test/model/report/getyearmonths.php b/test/model/report/getyearmonths.php new file mode 100755 index 0000000000..768df406f1 --- /dev/null +++ b/test/model/report/getyearmonths.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +getYearMonths(); +cid=1 +pid=1 + +测试获取 2020 的月份 >> 2020-01,2020-02,2020-03,2020-04,2020-05,2020-06,2020-07,2020-08,2020-09,2020-10,2020-11,2020-12 +测试获取 2021 的月份 >> 2021-01,2021-02,2021-03,2021-04,2021-05,2021-06,2021-07,2021-08,2021-09,2021-10,2021-11,2021-12 +测试获取 2022 的月份 >> 2022-01,2022-02,2022-03,2022-04,2022-05,2022-06,2022-07,2022-08,2022-09,2022-10,2022-11,2022-12 +测试获取 2023 的月份 >> 2023-01,2023-02,2023-03,2023-04,2023-05,2023-06,2023-07,2023-08,2023-09,2023-10,2023-11,2023-12 +测试获取 2024 的月份 >> 2024-01,2024-02,2024-03,2024-04,2024-05,2024-06,2024-07,2024-08,2024-09,2024-10,2024-11,2024-12 + +*/ +$year = array(2020, 2021, 2022, 2023, 2024); + +$report = new reportTest(); + +r($report->getYearMonthsTest($year[0])) && p() && e('2020-01,2020-02,2020-03,2020-04,2020-05,2020-06,2020-07,2020-08,2020-09,2020-10,2020-11,2020-12'); // 测试获取 2020 的月份 +r($report->getYearMonthsTest($year[1])) && p() && e('2021-01,2021-02,2021-03,2021-04,2021-05,2021-06,2021-07,2021-08,2021-09,2021-10,2021-11,2021-12'); // 测试获取 2021 的月份 +r($report->getYearMonthsTest($year[2])) && p() && e('2022-01,2022-02,2022-03,2022-04,2022-05,2022-06,2022-07,2022-08,2022-09,2022-10,2022-11,2022-12'); // 测试获取 2022 的月份 +r($report->getYearMonthsTest($year[3])) && p() && e('2023-01,2023-02,2023-03,2023-04,2023-05,2023-06,2023-07,2023-08,2023-09,2023-10,2023-11,2023-12'); // 测试获取 2023 的月份 +r($report->getYearMonthsTest($year[4])) && p() && e('2024-01,2024-02,2024-03,2024-04,2024-05,2024-06,2024-07,2024-08,2024-09,2024-10,2024-11,2024-12'); // 测试获取 2024 的月份 \ No newline at end of file diff --git a/test/model/report/getyearobjectstat.php b/test/model/report/getyearobjectstat.php new file mode 100755 index 0000000000..f33981b0f4 --- /dev/null +++ b/test/model/report/getyearobjectstat.php @@ -0,0 +1,49 @@ +#!/usr/bin/env php +getYearObjectStat(); +cid=1 +pid=1 + +测试获取 admin story >> active:1; +测试获取 admin task >> 0 +测试获取 admin bug >> 0 +测试获取 dev17 story >> 0 +测试获取 dev17 task >> 0 +测试获取 dev17 bug >> active:1; +测试获取 test18 story >> 0 +测试获取 test18 task >> 0 +测试获取 test18 bug >> 0 +测试获取 admin dev17 story >> active:1; +测试获取 admin dev17 task >> 0 +测试获取 admin dev17 bug >> active:1; +测试获取 admin test18 story >> active:1; +测试获取 admin test18 task >> 0 +测试获取 admin test18 bug >> 0 + +*/ +$accounts = array('admin', 'dev17', 'test18', 'admin,dev17', 'admin,test18'); +$objectType = array('story', 'task', 'bug'); + +$report = new reportTest(); + +r($report->getYearObjectStatTest($accounts[0], $objectType[0])) && p() && e('active:1;'); // 测试获取 admin story +r($report->getYearObjectStatTest($accounts[0], $objectType[1])) && p() && e('0'); // 测试获取 admin task +r($report->getYearObjectStatTest($accounts[0], $objectType[2])) && p() && e('0'); // 测试获取 admin bug +r($report->getYearObjectStatTest($accounts[1], $objectType[0])) && p() && e('0'); // 测试获取 dev17 story +r($report->getYearObjectStatTest($accounts[1], $objectType[1])) && p() && e('0'); // 测试获取 dev17 task +r($report->getYearObjectStatTest($accounts[1], $objectType[2])) && p() && e('active:1;'); // 测试获取 dev17 bug +r($report->getYearObjectStatTest($accounts[2], $objectType[0])) && p() && e('0'); // 测试获取 test18 story +r($report->getYearObjectStatTest($accounts[2], $objectType[1])) && p() && e('0'); // 测试获取 test18 task +r($report->getYearObjectStatTest($accounts[2], $objectType[2])) && p() && e('0'); // 测试获取 test18 bug +r($report->getYearObjectStatTest($accounts[3], $objectType[0])) && p() && e('active:1;'); // 测试获取 admin dev17 story +r($report->getYearObjectStatTest($accounts[3], $objectType[1])) && p() && e('0'); // 测试获取 admin dev17 task +r($report->getYearObjectStatTest($accounts[3], $objectType[2])) && p() && e('active:1;'); // 测试获取 admin dev17 bug +r($report->getYearObjectStatTest($accounts[4], $objectType[0])) && p() && e('active:1;'); // 测试获取 admin test18 story +r($report->getYearObjectStatTest($accounts[4], $objectType[1])) && p() && e('0'); // 测试获取 admin test18 task +r($report->getYearObjectStatTest($accounts[4], $objectType[2])) && p() && e('0'); // 测试获取 admin test18 bug \ No newline at end of file diff --git a/test/ztest b/test/ztest index 02817f800b..358a930ca6 100755 --- a/test/ztest +++ b/test/ztest @@ -97,6 +97,15 @@ switch($argv[1]) case 'productsonplan': ztfRun('model/productsonplan'); break; + case 'personnel': + ztfRun('model/personnel'); + break; + case 'projectstory': + ztfRun('model/projectstory'); + break; + case 'admin': + ztfRun('model/admin'); + break; case 'model': ztfRun('model'); break; diff --git a/www/js/zui/min.js b/www/js/zui/min.js index cf397b1efb..42b678ead8 100644 --- a/www/js/zui/min.js +++ b/www/js/zui/min.js @@ -1,7 +1,7 @@ /*! - * ZUI: ZUI for Zentao - v1.10.0 - 2022-04-18 + * ZUI: ZUI for Zentao - v1.10.0 - 2022-04-20 * http://openzui.com - * GitHub: https://github.com/easysoft/zui.git + * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2022 cnezsoft.com; Licensed MIT */ !function(t,e,i){"use strict";if("undefined"==typeof t)throw new Error("ZUI requires jQuery");Number.isNaN||"function"!=typeof isNaN||(Number.isNaN=isNaN),Number.parseInt||"function"!=typeof parseInt||(Number.parseInt=parseInt),Number.parseFloat||"function"!=typeof parseFloat||(Number.parseFloat=parseFloat),t.zui||(t.zui=function(e){t.isPlainObject(e)&&t.extend(t.zui,e)});var n={all:-1,left:0,middle:1,right:2},o=0;t.zui({uuid:function(t){var e=1e5*(Date.now()-1580890015292)+10*Math.floor(1e4*Math.random())+o++%10;return t?e:e.toString(36)},callEvent:function(t,e,n){if("function"==typeof t){n!==i&&(t=t.bind(n));var o=t(e);return e&&(e.result=o),!(o!==i&&!o)}return 1},strCode:function(t){var e=0;if("string"!=typeof t&&(t=String(t)),t&&t.length)for(var i=0;i=e.innerWidth?0:t.zui.getScrollbarSize()},fixBodyScrollbar:function(){if(t.zui.checkBodyScrollbar()){var e=t("body"),i=parseInt(e.css("padding-right")||0,10);return t.zui._scrollbarWidth&&e.css({paddingRight:i+t.zui._scrollbarWidth,overflowY:"hidden"}),!0}},resetBodyScrollbar:function(){t("body").css({paddingRight:"",overflowY:""})}}),t.fn.callEvent=function(e,n,o){var a=t(this),s=e.indexOf(".zui."),r=s<0?e:e.substring(0,s),l=t.Event(r,n);if(o===i&&s>0&&(o=a.data(e.substring(s+1))),o&&o.options){var c=o.options[r];"function"==typeof c&&(l.result=t.zui.callEvent(c,l,o))}return a.trigger(l),l},t.fn.callComEvent=function(t,e,n){n===i||Array.isArray(n)||(n=[n]);var o,a=this;a.trigger(e,n);var s=t.options[e];return s&&(o=s.apply(t,n)),o}}(jQuery,window,void 0),function(){"use strict";function t(t,e){return i&&!e?requestAnimationFrame(t):setTimeout(t,e||0)}function e(t){return i?cancelAnimationFrame(t):void clearTimeout(t)}var i="function"==typeof window.requestAnimationFrame;$.zui({asap:t,clearAsap:e})}(),function(t){"use strict";t.fn.fixOlPd=function(e){return e=e||10,this.each(function(){var i=t(this);i.css("paddingLeft",Math.ceil(Math.log10(i.children().length))*e+10)})},t(function(){t(".ol-pd-fix,.article ol").fixOlPd()})}(jQuery),+function(t){"use strict";var e='[data-dismiss="alert"]',i="zui.alert",n=function(i){t(i).on("click",e,this.close)};n.prototype.close=function(e){function n(){s.trigger("closed."+i).remove()}var o=t(this),a=o.attr("data-target");a||(a=o.attr("href"),a=a&&a.replace(/.*(?=#[^\s]*$)/,""));var s=t(a);e&&e.preventDefault(),s.length||(s=o.hasClass("alert")?o:o.parent()),s.trigger(e=t.Event("close."+i)),e.isDefaultPrevented()||(s.removeClass("in"),t.support.transition&&s.hasClass("fade")?s.one(t.support.transition.end,n).emulateTransitionEnd(150):n())};var o=t.fn.alert;t.fn.alert=function(e){return this.each(function(){var o=t(this),a=o.data(i);a||o.data(i,a=new n(this)),"string"==typeof e&&a[e].call(o)})},t.fn.alert.Constructor=n,t.fn.alert.noConflict=function(){return t.fn.alert=o,this},t(document).on("click."+i+".data-api",e,n.prototype.close)}(window.jQuery),function(t,e){"use strict";var i="zui.pager",n={page:1,recTotal:0,recPerPage:10},o={zh_cn:{pageOfText:"第 {0} 页",prev:"上一页",next:"下一页",first:"第一页",last:"最后一页","goto":"跳转",pageOf:"第 {page} 页",totalPage:"共 {totalPage} 页",totalCount:"共 {recTotal} 项",pageSize:"每页 {recPerPage} 项",itemsRange:"第 {start} ~ {end} 项",pageOfTotal:"第 {page}/{totalPage} 页"},zh_tw:{pageOfText:"第 {0} 頁",prev:"上一頁",next:"下一頁",first:"第一頁",last:"最後一頁","goto":"跳轉",pageOf:"第 {page} 頁",totalPage:"共 {totalPage} 頁",totalCount:"共 {recTotal} 項",pageSize:"每頁 {recPerPage} 項",itemsRange:"第 {start} ~ {end} 項",pageOfTotal:"第 {page}/{totalPage} 頁"},en:{pageOfText:"Page {0}",prev:"Prev",next:"Next",first:"First",last:"Last","goto":"Goto",pageOf:"Page {page}",totalPage:"{totalPage} pages",totalCount:"Total: {recTotal} items",pageSize:"{recPerPage} per page",itemsRange:"From {start} to {end}",pageOfTotal:"Page {page} of {totalPage}"}},a=function(e,n){var s=this;s.name=i,s.$=t(e),n=s.options=t.extend({},a.DEFAULTS,this.$.data(),n),s.langName=n.lang||t.zui.clientLang(),s.lang=t.zui.getLangData(i,s.langName,o),s.state={},s.set(n.page,n.recTotal,n.recPerPage,!0),s.$.on("click",".pager-goto-btn",function(){var e=t(this).closest(".pager-goto"),i=parseInt(e.find(".pager-goto-input").val());NaN!==i&&s.set(i)}).on("click",".pager-item",function(){var e=t(this).data("page");"number"==typeof e&&e>0&&s.set(e)}).on("click",".pager-size-menu [data-size]",function(){var e=t(this).data("size");"number"==typeof e&&e>0&&s.set(-1,-1,e)})};a.prototype.set=function(e,i,o,a){var s=this;"object"==typeof e&&null!==e&&(o=e.recPerPage,i=e.recTotal,e=e.page);var r=s.state;r||(r=t.extend({},n));var l=t.extend({},r);return"number"==typeof o&&o>0&&(r.recPerPage=o),"number"==typeof i&&i>=0&&(r.recTotal=i),"number"==typeof e&&e>=0&&(r.page=e),r.totalPage=r.recTotal&&r.recPerPage?Math.ceil(r.recTotal/r.recPerPage):1,r.page=Math.max(0,Math.min(r.page,r.totalPage)),r.pageRecCount=r.recTotal,r.page&&r.recTotal&&(r.page1&&(r.pageRecCount=r.recTotal-r.recPerPage*(r.page-1))),r.skip=r.page>1?(r.page-1)*r.recPerPage:0,r.start=r.skip+1,r.end=r.skip+r.pageRecCount,r.prev=r.page>1?r.page-1:0,r.next=r.page').attr("href",i?a.createLink(i,a.state):"###").html(n);return o||(s=t("
  • ").append(s).toggleClass("active",i===a.state.page).toggleClass("disabled",!i||i===a.state.page)),s},a.prototype.createNavItems=function(t){var i=this,n=i.$,o=i.state,a=o.totalPage,s=o.page,r=function(t,o){if(t===!1)return void n.append(i.createLinkItem(0,o||i.options.navEllipsisItem));o===e&&(o=t);for(var a=t;a<=o;++a)n.append(i.createLinkItem(a))};t===e&&(t=i.options.maxNavCount||10),r(1),a>1&&(a<=t?r(2,a):sa-t+2?(r(!1),r(a-t+2,a)):(r(!1),r(s-Math.ceil((t-4)/2),s+Math.floor((t-4)/2)),r(!1),r(a)))},a.prototype.createGoto=function(){var e=this,i=this.state,n=t('
    ");return n},a.prototype.createSizeMenu=function(){var e=this,i=this.state,n=t(''),o=e.options.pageSizeOptions;"string"==typeof o&&(o=o.split(","));for(var a=0;a'+s+"
  • ").toggleClass("active",s===i.recPerPage);n.append(r)}return t('
    ').addClass(e.options.menuDirection).append(n)},a.prototype.createElement=function(e,i,n){var o=this,a=o.createLinkItem.bind(o),s=o.lang;switch(e){case"prev":return a(n.prev,s.prev);case"prev_icon":return a(n.prev,'');case"next":return a(n.next,s.next);case"next_icon":return a(n.next,'');case"first":return a(1,s.first);case"first_icon":return a(1,'');case"last":return a(n.totalPage,s.last);case"last_icon":return a(n.totalPage,'');case"space":case"|":return t('
  • ');case"nav":case"pages":return void o.createNavItems();case"total_text":return t(('
    '+s.totalCount+"
    ").format(n));case"page_text":return t(('
    '+s.pageOf+"
    ").format(n));case"total_page_text":return t(('
    '+s.totalPage+"
    ").format(n));case"page_of_total_text":return t(('
    '+s.pageOfTotal+"
    ").format(n));case"page_size_text":return t(('
    '+s.pageSize+"
    ").format(n));case"items_range_text":return t(('
    '+s.itemsRange+"
    ").format(n));case"goto":return o.createGoto();case"size_menu":return o.createSizeMenu();default:return t("
  • ").html(e.format(n))}},a.prototype.createLink=function(i,n){i===e&&(i=this.state.page),n===e&&(n=this.state);var o=this.options.linkCreator;return"string"==typeof o?o.format(t.extend({},n,{page:i})):"function"==typeof o?o(i,n):"#page="+i},a.prototype.render=function(e){var i=this,n=i.state,o=i.options.elementCreator||i.createElement,a=t.isPlainObject(o);e=e||i.elements||i.options.elements,"string"==typeof e&&(e=e.split(",")),i.elements=e,i.$.empty();for(var s=0;s").append(c)),i.$.append(c))}var h=null;return i.$.children("li").each(function(){var e=t(this),i=!!e.children(".pager-item").length;h?h.toggleClass("pager-item-right",!i):i&&e.addClass("pager-item-left"),h=i?e:null}),h&&h.addClass("pager-item-right"),i.$.callComEvent(i,"onRender",[n]),i},a.DEFAULTS=t.extend({elements:["first_icon","prev_icon","pages","next_icon","last_icon","page_of_total_text","items_range_text","total_text"],prevIcon:"icon-double-angle-left",nextIcon:"icon-double-angle-right",firstIcon:"icon-step-backward",lastIcon:"icon-step-forward",navEllipsisItem:'',maxNavCount:10,menuDirection:"dropdown",pageSizeOptions:[10,20,30,50,100]},n),t.fn.pager=function(e){return this.each(function(){var n=t(this),o=n.data(i),s="object"==typeof e&&e;o||n.data(i,o=new a(this,s)),"string"==typeof e&&o[e]()})},a.NAME=i,a.LANG=o,t.fn.pager.Constructor=a,t(function(){t('[data-ride="pager"]').pager()})}(jQuery,void 0),+function(t){"use strict";var e="zui.tab",i=function(e){this.element=t(e)};i.prototype.show=function(){var i=this.element,n=i.closest("ul:not(.dropdown-menu)"),o=i.attr("data-target")||i.attr("data-tab");if(o||(o=i.attr("href"),o=o&&o.replace(/.*(?=#[^\s]*$)/,"")),!i.parent("li").hasClass("active")){var a=n.find(".active:last a")[0],s=t.Event("show."+e,{relatedTarget:a});if(i.trigger(s),!s.isDefaultPrevented()){var r=t(o);this.activate(i.parent("li"),n),this.activate(r,r.parent(),function(){i.trigger({type:"shown."+e,relatedTarget:a})})}}},i.prototype.activate=function(e,i,n){function o(){a.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),e.addClass("active"),s?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu")&&e.closest("li.dropdown").addClass("active"),n&&n()}var a=i.find("> .active"),s=n&&t.support.transition&&a.hasClass("fade");s?a.one(t.support.transition.end,o).emulateTransitionEnd(150):o(),a.removeClass("in")};var n=t.fn.tab;t.fn.tab=function(n){return this.each(function(){var o=t(this),a=o.data(e);a||o.data(e,a=new i(this)),"string"==typeof n&&a[n]()})},t.fn.tab.Constructor=i,t.fn.tab.noConflict=function(){return t.fn.tab=n,this},t(document).on("click.zui.tab.data-api",'[data-toggle="tab"], [data-tab]',function(e){e.preventDefault(),t(this).tab("show")})}(window.jQuery),+function(t){"use strict";function e(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var i in e)if(void 0!==t.style[i])return{end:e[i]};return!1}t.fn.emulateTransitionEnd=function(e){var i=!1,n=this;t(this).one("bsTransitionEnd",function(){i=!0});var o=function(){i||t(n).trigger(t.support.transition.end)};return setTimeout(o,e),this},t(function(){t.support.transition=e(),t.support.transition&&(t.event.special.bsTransitionEnd={bindType:t.support.transition.end,delegateType:t.support.transition.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(t){"use strict";var e="zui.collapse",i=function(e,n){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,n),this.transitioning=null,this.options.parent&&(this.$parent=t(this.options.parent)),this.options.toggle&&this.toggle()};i.DEFAULTS={toggle:!0},i.prototype.dimension=function(){var t=this.$element.hasClass("width");return t?"width":"height"},i.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var i=t.Event("show."+e);if(this.$element.trigger(i),!i.isDefaultPrevented()){var n=this.$parent&&this.$parent.find(".in");if(n&&n.length){var o=n.data(e);if(o&&o.transitioning)return;n.collapse("hide"),o||n.data(e,null)}var a=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[a](0),this.transitioning=1;var s=function(){this.$element.removeClass("collapsing").addClass("in")[a]("auto"),this.transitioning=0,this.$element.trigger("shown."+e)};if(!t.support.transition)return s.call(this);var r=t.camelCase(["scroll",a].join("-"));this.$element.one(t.support.transition.end,s.bind(this)).emulateTransitionEnd(350)[a](this.$element[0][r])}}},i.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var i=t.Event("hide."+e);if(this.$element.trigger(i),!i.isDefaultPrevented()){var n=this.dimension();this.$element[n](this.$element[n]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var o=function(){this.transitioning=0,this.$element.trigger("hidden."+e).removeClass("collapsing").addClass("collapse")};return t.support.transition?void this.$element[n](0).one(t.support.transition.end,o.bind(this)).emulateTransitionEnd(350):o.call(this)}}},i.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var n=t.fn.collapse;t.fn.collapse=function(n){return this.each(function(){var o=t(this),a=o.data(e),s=t.extend({},i.DEFAULTS,o.data(),"object"==typeof n&&n);a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[n]()})},t.fn.collapse.Constructor=i,t.fn.collapse.noConflict=function(){return t.fn.collapse=n,this},t(document).on("click."+e+".data-api","[data-toggle=collapse]",function(i){var n,o=t(this),a=o.attr("data-target")||i.preventDefault()||(n=o.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,""),s=t(a),r=s.data(e),l=r?"toggle":o.data(),c=o.attr("data-parent"),h=c&&t(c);r&&r.transitioning||(h&&h.find('[data-toggle=collapse][data-parent="'+c+'"]').not(o).addClass("collapsed"),o[s.hasClass("in")?"addClass":"removeClass"]("collapsed")),s.collapse(l)})}(window.jQuery),function(t,e){"use strict";var i=1200,n=992,o=768,a=e(t),s=function(){var t=a.width();e("html").toggleClass("screen-desktop",t>=n&&t=i).toggleClass("screen-tablet",t>=o&&t=n)},r="",l=navigator.userAgent;l.match(/(iPad|iPhone|iPod)/i)?r+=" os-ios":l.match(/android/i)?r+=" os-android":l.match(/Win/i)?r+=" os-windows":l.match(/Mac/i)?r+=" os-mac":l.match(/Linux/i)?r+=" os-linux":l.match(/X11/i)&&(r+=" os-unix"),"ontouchstart"in document.documentElement&&(r+=" is-touchable"),e("html").addClass(r),a.resize(s),s()}(window,jQuery),function(t){"use strict";var e={zh_cn:'您的浏览器版本过低,无法体验所有功能,建议升级或者更换浏览器。 了解更多...',zh_tw:'您的瀏覽器版本過低,無法體驗所有功能,建議升級或者更换瀏覽器。了解更多...',en:'Your browser is too old, it has been unable to experience the colorful internet. We strongly recommend that you upgrade a better one. Learn more...'},i=function(){for(var t=!1,e=11;e>5;e--)if(this.isIE(e)){t=e;break}this.ie=t,this.cssHelper()};i.prototype.cssHelper=function(){var e=this.ie,i=t("html");i.toggleClass("ie",e).removeClass("ie-6 ie-7 ie-8 ie-9 ie-10"),e&&i.addClass("ie-"+e).toggleClass("gt-ie-7 gte-ie-8 support-ie",e>=8).toggleClass("lte-ie-7 lt-ie-8 outdated-ie",e<8).toggleClass("gt-ie-8 gte-ie-9",e>=9).toggleClass("lte-ie-8 lt-ie-9",e<9).toggleClass("gt-ie-9 gte-ie-10",e>=10).toggleClass("lte-ie-9 lt-ie-10",e<10).toggleClass("gt-ie-10 gte-ie-11",e>=11).toggleClass("lte-ie-10 lt-ie-11",e<11)},i.prototype.tip=function(i){var n=t("#browseHappyTip");n.length||(n=t('
    '),n.prependTo("body")),i||(i=t.zui.getLangData("zui.browser",t.zui.clientLang(),e),"object"==typeof i&&(i=i.tip)),n.find(".content").html(i)},i.prototype.isIE=function(t){if(11===t)return this.isIE11();if(10===t)return this.isIE10();if(!t&&(this.isIE11()||this.isIE10()))return!0;var e=document.createElement("b");return e.innerHTML="",1===e.getElementsByTagName("i").length},i.prototype.isIE10=function(){return navigator.appVersion.indexOf("MSIE 10")!==-1},i.prototype.isIE11=function(){var t=navigator.userAgent;return t.indexOf("Trident")!==-1&&t.indexOf("rv:11")!==-1},t.zui({browser:new i}),t(function(){t("body").hasClass("disabled-browser-tip")||t.zui.browser.ie&&t.zui.browser.ie<8&&t.zui.browser.tip()})}(jQuery),function(t){"use strict";var e=864e5,i=function(t){return t instanceof Date||("number"==typeof t&&t<1e10&&(t*=1e3),t=new Date(t)),t},n=function(t){return i(t).getTime()},o=function(t,e){t=i(t),void 0===e&&(e="yyyy-MM-dd hh:mm:ss");var n={"M+":t.getMonth()+1,"d+":t.getDate(),"h+":t.getHours(),"m+":t.getMinutes(),"s+":t.getSeconds(),"q+":Math.floor((t.getMonth()+3)/3),"S+":t.getMilliseconds()};/(y+)/i.test(e)&&(e=e.replace(RegExp.$1,(t.getFullYear()+"").substr(4-RegExp.$1.length)));for(var o in n)new RegExp("("+o+")").test(e)&&(e=e.replace(RegExp.$1,1==RegExp.$1.length?n[o]:("00"+n[o]).substr((""+n[o]).length)));return e},a=function(t,e){return t.setTime(t.getTime()+e),t},s=function(t,i){return a(t,i*e)},r=function(t){return new Date(i(t).getTime())},l=function(t){return t%4===0&&t%100!==0||t%400===0},c=function(t,e){return[31,l(t)?29:28,31,30,31,30,31,31,30,31,30,31][e]},h=function(t){return c(t.getFullYear(),t.getMonth())},d=function(t){return t.setHours(0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0),t},u=function(t,e){var i=t.getDate();return t.setDate(1),t.setMonth(t.getMonth()+e),t.setDate(Math.min(i,h(t))),t},p=function(t,e){e=e||1;for(var i=new Date(t.getTime());i.getDay()!=e;)i=s(i,-1);return d(i)},f=function(t,e){return t.toDateString()===e.toDateString()},g=function(t,e){var i=p(t),n=s(r(i),7);return e>=i&&e1){var i;if(2==arguments.length&&"object"==typeof e)for(var n in e)void 0!==e[n]&&(i=new RegExp("({"+n+"})","g"),t=t.replace(i,e[n]));else for(var o=1;othis.length)&&(e=this.length),this.substring(e-t.length,e)===t}),String.prototype.startsWith||Object.defineProperty(String.prototype,"startsWith",{value:function(t,e){return e=!e||e<0?0:+e,this.substring(e,e+t.length)===t}}),String.prototype.includes||(String.prototype.includes=function(){return String.prototype.indexOf.apply(this,arguments)!==-1}))}(),/*! @@ -17,7 +17,7 @@ function(t,e,i){"$:nomunge";function n(){o=e[r](function(){a.each(function(){var * Released under the MIT license */ function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){function e(t){return r.raw?t:encodeURIComponent(t)}function i(t){return r.raw?t:decodeURIComponent(t)}function n(t){return e(r.json?JSON.stringify(t):String(t))}function o(t){0===t.indexOf('"')&&(t=t.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return t=decodeURIComponent(t.replace(s," ")),r.json?JSON.parse(t):t}catch(e){}}function a(t,e){var i=r.raw?t:o(t);return"function"==typeof e?e(i):i}var s=/\+/g,r=t.cookie=function(o,s,l){if(void 0!==s&&"function"!=typeof s){if(l=t.extend({},r.defaults,l),"number"==typeof l.expires){var c=l.expires,h=l.expires=new Date;h.setTime(+h+864e5*c)}return document.cookie=[e(o),"=",n(s),l.expires?"; expires="+l.expires.toUTCString():"",l.path?"; path="+l.path:"",l.domain?"; domain="+l.domain:"",l.secure?"; secure":""].join("")}for(var d=o?void 0:{},u=document.cookie?document.cookie.split("; "):[],p=0,f=u.length;p=0;t--)delete this.page[i[t]];this.set(a,this.page)}},s.prototype.pageRemove=function(t){"undefined"!=typeof this.page[t]&&(this.page[t]=null,this.pageSave())},s.prototype.pageClear=function(){this.page={},this.pageSave()},s.prototype.pageGet=function(t,e){var i=this.page[t];return void 0===e||null!==i&&void 0!==i?i:e},s.prototype.pageSet=function(t,i){e.isPlainObject(t)?e.extend(!0,this.page,t):this.page[this.serialize(t)]=i,this.pageSave()},s.prototype.check=function(){if(!this.enable&&!this.silence)throw new Error("Browser not support localStorage or enable status been set true.");return this.enable},s.prototype.length=function(){return this.check()?i.getLength?i.getLength():i.length:0},s.prototype.removeItem=function(t){return i.removeItem(t),this},s.prototype.remove=function(t){return this.removeItem(t)},s.prototype.getItem=function(t){return i.getItem(t)},s.prototype.get=function(t,e){var i=this.deserialize(this.getItem(t));return"undefined"!=typeof i&&null!==i||"undefined"==typeof e?i:e},s.prototype.key=function(t){return i.key(t)},s.prototype.setItem=function(t,e){return i.setItem(t,e),this},s.prototype.set=function(t,e){return void 0===e?this.remove(t):(this.setItem(t,this.serialize(e)),this)},s.prototype.clear=function(){return i.clear(),this},s.prototype.forEach=function(t){for(var e=this.length(),n=e-1;n>=0;n--){var o=i.key(n);t(o,this.get(o))}return this},s.prototype.getAll=function(){var t={};return this.forEach(function(e,i){t[e]=i}),t},s.prototype.serialize=function(t){return"string"==typeof t?t:JSON.stringify(t)},s.prototype.deserialize=function(t){if("string"==typeof t)try{return JSON.parse(t)}catch(e){return t||void 0}},e.zui({store:new s})}(window,jQuery),function(t){"use strict";var e="zui.searchBox",i=function(e,n){var o=this;o.name=name,o.$=t(e),o.options=n=t.extend({},i.DEFAULTS,o.$.data(),n);var a=o.$.is(n.inputSelector)?o.$:o.$.find(n.inputSelector);if(a.length){var s=function(){o.changeTimer&&(clearTimeout(o.changeTimer),o.changeTimer=null)},r=function(){s();var t=o.getSearch();if(t!==o.lastValue){var e=""===t;a.toggleClass("empty",e),o.$.callComEvent(o,"onSearchChange",[t,e]),o.lastValue=t}};o.$input=a=a.first(),a.on(n.listenEvent,function(t){o.changeTimer=setTimeout(function(){r()},n.changeDelay)}).on("focus",function(t){a.addClass("focus"),o.$.callComEvent(o,"onFocus",[t])}).on("blur",function(t){a.removeClass("focus"),o.$.callComEvent(o,"onBlur",[t])}).on("keydown",function(t){var e=0,i=t.which;27===i&&n.escToClear?(this.setSearch("",!0),r(),e=1):13===i&&n.onPressEnter&&(r(),o.$.callComEvent(o,"onPressEnter",[t]));var a=o.$.callComEvent(o,"onKeyDown",[t]);a===!1&&(e=1),e&&t.preventDefault()}),o.$.on("click",".search-clear-btn",function(t){o.setSearch("",!0),r(),o.focus(),t.preventDefault()}),r()}else console.error("ZUI: search box init error, cannot find search box input element.")};i.DEFAULTS={inputSelector:'input[type="search"],input[type="text"]',listenEvent:"change input paste",changeDelay:500},i.prototype.getSearch=function(){return this.$input&&t.trim(this.$input.val())},i.prototype.setSearch=function(t,e){var i=this.$input;i&&(i.val(t),e||i.trigger("change"))},i.prototype.focus=function(){this.$input&&this.$input.focus()},t.fn.searchBox=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[n]()})},i.NAME=e,t.fn.searchBox.Constructor=i}(jQuery),function(t,e){"use strict";var i="zui.draggable",n={container:"body",move:!0},o=0,a=function(e,i){var a=this;a.$=t(e),a.id=o++,a.options=t.extend({},n,a.$.data(),i),a.init()};a.DEFAULTS=n,a.NAME=i,a.prototype.init=function(){var n,o,a,s,r,l=this,c=l.$,h="before",d="drag",u="finish",p="."+i+"."+l.id,f="mousedown"+p,g="mouseup"+p,m="mousemove"+p,v=l.options,y=v.selector,b=v.handle,w=c,x="function"==typeof v.move,C=function(t){var e=t.pageX,i=t.pageY;r=!0;var o={left:e-a.x,top:i-a.y};w.removeClass("drag-ready").addClass("dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[d]&&v[d]({event:t,element:w,startOffset:a,pos:o,offset:{x:e-n.x,y:i-n.y},smallOffset:{x:e-s.x,y:i-s.y}}),s.x=e,s.y=i,v.stopPropagation&&t.stopPropagation()},_=0,k=function(e){_&&(t.zui.clearAsap||clearTimeout)(_),_=(t.zui.asap||setTimeout)(function(){_=0,C(e)},0)},T=function(i){if(t(e).off(p),!r)return void w.removeClass("drag-ready");var o={left:i.pageX-a.x,top:i.pageY-a.y};w.removeClass("drag-ready dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[u]&&v[u]({event:i,element:w,startOffset:a,pos:o,offset:{x:i.pageX-n.x,y:i.pageY-n.y},smallOffset:{x:i.pageX-s.x,y:i.pageY-s.y}}),i.preventDefault(),v.stopPropagation&&i.stopPropagation()},S=function(i){var l=t.zui.getMouseButtonCode(v.mouseButton);if(!(l>-1&&i.button!==l)){var c=t(this);if(y&&(w=b?c.closest(y):c),v[h]){var d=v[h]({event:i,element:w});if(d===!1)return}var u=t(v.container),p=w.offset();o=u.offset(),n={x:i.pageX,y:i.pageY},a={x:i.pageX-p.left+o.left,y:i.pageY-p.top+o.top},s=t.extend({},n),r=!1,w.addClass("drag-ready"),i.preventDefault(),v.stopPropagation&&i.stopPropagation(),t(e).on(m,k).on(g,T)}};b?c.on(f,b,S):y?c.on(f,y,S):c.on(f,S)},a.prototype.destroy=function(){var n="."+i+"."+this.id;this.$.off(n),t(e).off(n),this.$.data(i,null)},t.fn.draggable=function(e){return this.each(function(){var n=t(this),o=n.data(i),s="object"==typeof e&&e;o||n.data(i,o=new a(this,s)),"string"==typeof e&&o[e]()})},t.fn.draggable.Constructor=a}(jQuery,document),function(t,e,i){"use strict";var n="zui.droppable",o={target:".droppable-target",deviation:5,sensorOffsetX:0,sensorOffsetY:0,dropToClass:"drop-to",dropTargetClass:"drop-target"},a=0,s=function(e,i){var n=this;n.id=a++,n.$=t(e),n.options=t.extend({},o,n.$.data(),i),n.init()};s.DEFAULTS=o,s.NAME=n,s.prototype.trigger=function(e,i){return t.zui.callEvent(this.options[e],i,this)},s.prototype.init=function(){var o,a,s,r,l,c,h,d,u,p,f,g,m,v,y=this,b=y.$,w=y.options,x=w.deviation,C="."+n+"."+y.id,_="mousedown"+C,k="mouseup"+C,T="mousemove"+C,S=w.selector,D=w.handle,M=w.flex,L=w.canMoveHere,z=w.dropToClass,P=w.noShadow,$=b,I=!1;w.dropOnMouseleave&&(k+=" mouseleave"+C);var F=function(e){if(I){if(g={left:e.pageX,top:e.pageY},!r){if(i.abs(g.left-u.left)a&&g.top>s&&g.left-1&&i.button!==n)){var g=t(this);S&&($=D?g.closest(S):g),$.hasClass("drag-shadow")||w.before&&w.before({event:i,element:$})===!1||(I=!0,o=w.container?"function"==typeof w.container?w.container($,b):t(w.container).first():S?b:t("body"),a="function"==typeof w.target?w.target($,b):o.find(w.target),s=null,r=null,l=!1,c=!0,h=null,d=$.offset(),p=o.offset(),p.top=p.top-o.scrollTop(),p.left=p.left-o.scrollLeft(),u={left:i.pageX,top:i.pageY},m=t.extend({},u),f={left:u.left-d.left,top:u.top-d.top},$.addClass("drag-from"),t(e).on(T,E).on(k,O),v=setTimeout(function(){t(e).on(_,O)},10),i.preventDefault(),w.stopPropagation&&i.stopPropagation())}};D?b.on(_,D,R):S?b.on(_,S,R):b.on(_,R)},s.prototype.destroy=function(){var i="."+n+"."+this.id;this.$.off(i),t(e).off(i),this.$.data(n,null)},s.prototype.reset=function(){this.destroy(),this.init()},t.fn.droppable=function(e){return this.each(function(){var i=t(this),o=i.data(n),a="object"==typeof e&&e;o||i.data(n,o=new s(this,a)),"string"==typeof e&&o[e]()})},t.fn.droppable.Constructor=s}(jQuery,document,Math),+function(t,e){"use strict";function i(e,i,a){return this.each(function(){var s=t(this),r=s.data(n),l=t.extend({},o.DEFAULTS,s.data(),"object"==typeof e&&e);r||s.data(n,r=new o(this,l)),"string"==typeof e?r[e](i,a):l.show&&r.show(i,a)})}var n="zui.modal",o=function(i,o){var a=this;a.options=o,a.$body=t(document.body),a.$element=t(i),a.$backdrop=a.isShown=null,a.scrollbarWidth=0,o.moveable===e&&(a.options.moveable=a.$element.hasClass("modal-moveable")),o.remote&&a.$element.find(".modal-content").load(o.remote,function(){a.$element.trigger("loaded."+n)}),o.scrollInside&&t(window).on("resize."+n,function(){a.isShown&&a.adjustPosition(e,100)})};o.VERSION="3.2.0",o.TRANSITION_DURATION=300,o.BACKDROP_TRANSITION_DURATION=150,o.DEFAULTS={backdrop:!0,keyboard:!0,show:!0,position:"fit"};var a=function(e,i){var n=t(window);i.left=Math.max(0,Math.min(i.left,n.width()-e.outerWidth())),i.top=Math.max(0,Math.min(i.top,n.height()-e.outerHeight())),e.css(i)};o.prototype.toggle=function(t,e){return this.isShown?this.hide():this.show(t,e)},o.prototype.adjustPosition=function(i,o){var s=this;if(clearTimeout(s.reposTask),o)return void(s.reposTask=setTimeout(s.adjustPosition.bind(s,i,0),o));var r=s.options;if(i===e&&(i=r.position),i!==e&&null!==i){"function"==typeof i&&(i=i(s));var l=s.$element.find(".modal-dialog"),c=t(window).height(),h={maxHeight:"initial",overflow:"visible"},d=l.find(".modal-body").css(h);if(r.scrollInside&&d.length){var u=r.headerHeight,p=r.footerHeight,f=l.find(".modal-header"),g=l.find(".modal-footer");"number"!=typeof u&&(u=f.length?f.outerHeight():"function"==typeof u?u(f):0),"number"!=typeof p&&(p=g.length?g.outerHeight():"function"==typeof p?p(g):0),h.maxHeight=c-u-p,h.overflow=d[0].scrollHeight>h.maxHeight?"auto":"visible",d.css(h)}var m=Math.max(0,(c-l.outerHeight())/2);if("fit"===i?i={top:m>50?Math.floor(2*m/3):m}:"center"===i?i={top:m}:t.isPlainObject(i)||(i={top:i}),l.hasClass("modal-moveable")){var v=null,y=r.rememberPos;y&&(y===!0?v=s.$element.data("modal-pos"):t.zui.store&&(v=t.zui.store.pageGet(n+".rememberPos."+y))),i=t.extend(i,{left:Math.max(0,(t(window).width()-l.outerWidth())/2)},v),"inside"===r.moveable?a(l,i):l.css(i)}else l.css(i)}},o.prototype.setMoveable=function(){t.fn.draggable||console.error("Moveable modal requires draggable.js.");var e=this,i=e.options,o=e.$element.find(".modal-dialog").removeClass("modal-dragged");o.toggleClass("modal-moveable",!!i.moveable),e.$element.data("modal-moveable-setup")||o.draggable({container:e.$element,handle:".modal-header",before:function(){var t=o.css("margin-top");t&&"0px"!==t&&o.css("top",t).css("margin-top","").addClass("modal-dragged")},finish:function(o){var a=i.rememberPos;a&&(e.$element.data("modal-pos",o.pos),t.zui.store&&a!==!0&&t.zui.store.pageSet(n+".rememberPos."+a,o.pos))},move:"inside"!==i.moveable||function(t){a(o,t)}})},o.prototype.show=function(e,i){var a=this,s=t.Event("show."+n,{relatedTarget:e});a.$element.trigger(s),a.$element.toggleClass("modal-scroll-inside",!!a.options.scrollInside),a.isShown||s.isDefaultPrevented()||(a.isShown=!0,a.options.moveable&&a.setMoveable(),a.options.backdrop!==!1&&(a.setScrollbar(),a.$body.addClass("modal-open")),a.escape(),a.$element.on("click.dismiss."+n,'[data-dismiss="modal"]',function(t){a.hide(),t.stopPropagation()}),a.backdrop(function(){var s=t.support.transition&&a.$element.hasClass("fade");a.$element.parent().length||a.$element.appendTo(a.$body),a.$element.show().scrollTop(0),s&&a.$element[0].offsetWidth,a.$element.addClass("in").attr("aria-hidden",!1),a.adjustPosition(i),a.enforceFocus();var r=t.Event("shown."+n,{relatedTarget:e});s?a.$element.find(".modal-dialog").one("bsTransitionEnd",function(){a.$element.trigger("focus").trigger(r)}).emulateTransitionEnd(o.TRANSITION_DURATION):a.$element.trigger("focus").trigger(r)}))},o.prototype.hide=function(e){e&&e.preventDefault&&e.preventDefault();var i=this;e=t.Event("hide."+n),i.$element.trigger(e),i.isShown&&!e.isDefaultPrevented()&&(i.isShown=!1,i.options.backdrop!==!1&&(i.$body.removeClass("modal-open"),i.resetScrollbar()),i.escape(),t(document).off("focusin."+n),i.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss."+n),t.support.transition&&i.$element.hasClass("fade")?i.$element.one("bsTransitionEnd",i.hideModal.bind(i)).emulateTransitionEnd(o.TRANSITION_DURATION):i.hideModal())},o.prototype.enforceFocus=function(){t(document).off("focusin."+n).on("focusin."+n,function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")}.bind(this))},o.prototype.escape=function(){this.isShown&&this.options.keyboard?t(document).on("keydown.dismiss."+n,function(i){if(27==i.which){var o=t.Event("escaping."+n),a=this.$element.triggerHandler(o,"esc");if(a!=e&&!a)return;this.hide()}}.bind(this)):this.isShown||t(document).off("keydown.dismiss."+n)},o.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$element.trigger("hidden."+n)})},o.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},o.prototype.backdrop=function(e){var i=this,a=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var s=t.support.transition&&a;if(this.$backdrop=t('"].join("")).appendTo(i),e.$actions.on("click",".picker-action",function(i){var n=t(this).data("type");"select-all"===n?e.selectAll():"deselect-all"===n&&e.deselectAll()})),e.$message=t('
    ').appendTo(i),e.$dropMenu=i,e.$optionsList=a}e.updateList(e.search,!1,function(){e.triggerEvent("showedDrop",{picker:e},"","chosen:showing_dropdown")}),e.$dropMenu.addClass("picker-drop-show")}},r.prototype.hideDropList=function(e){var i=this;if(i.triggerEvent("hidingDrop",{picker:i})!==!1){i.dropListShowed=!1,i.$activeOption=null,i.activeValue=null,i.$search.val(""),i.search="",delete o[i.id],i.$dropMenu&&i.$dropMenu.removeClass("picker-drop-show"),i.options.disableScrollOnShow&&t.zui.resetBodyScrollbar(),e&&this.$search.blur(),i.triggerEvent("hiddenDrop",{picker:i},"","chosen:hiding_dropdown");var n=i.options.autoClearDrop;n&&i.destroyDropList(n)}},r.prototype.updateFromSelect=function(e){var i=this,n=i.options,o=[];void 0===e&&(e=!0),i.$formItem.children("option").each(function(){var e=t(this),i=e.text(),a=e.val();if(i.length||a.length){var s={};s[n.valueKey]=a,s[n.textKey]=i,s[n.keysKey]=e.data(n.keysKey),o.push(s)}var r=n.allowSingleDeselect;"auto"!==r&&null!==r&&void 0!==r||a.length||(n.allowSingleDeselect=!0)}),i.selectOptionsBackup=o.slice(),i.setList(o,e)},r.prototype.setList=function(t,e){var i=this,n=i.options,o=e?[]:i.list||[],a=e?{}:i.listMap||{};"string"==typeof t&&(t=t.split(n.multiValueSplitter));for(var s=0;s')}):p&&u.find('option[value="'+e+'"]').length||u.append('