* fix bug #14682.
This commit is contained in:
@@ -164,3 +164,5 @@ $lang->createIcons['program'] = 'program';
|
||||
$lang->createIcons['doc'] = 'w';
|
||||
|
||||
$lang->noMenuModule = array('report', 'my', 'todo', 'effort', 'program', 'product', 'execution', 'task', 'build', 'productplan', 'project', 'projectrelease', 'projectstory', 'story', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'pssp', 'sms', 'message', 'webhook', 'search', 'score', 'stage', 'entry', 'jenkins', 'gitlab');
|
||||
|
||||
if(isset($_SESSION['tutorialMode']) and $_SESSION['tutorialMode'] and !defined('TUTORIAL')) define('TUTORIAL', true);
|
||||
|
||||
@@ -18,6 +18,18 @@ list($productModule, $productMethod) = explode('-', $config->productLink);
|
||||
list($projectModule, $projectMethod) = explode('-', $config->projectLink);
|
||||
list($executionModule, $executionMethod) = explode('-', $config->executionLink);
|
||||
|
||||
if(defined('TUTORIAL'))
|
||||
{
|
||||
$programModule = 'program';
|
||||
$programMethod = 'browse';
|
||||
$productModule = 'product';
|
||||
$productMethod = 'all';
|
||||
$projectModule = 'project';
|
||||
$projectMethod = 'browse';
|
||||
$executionModule = 'execution';
|
||||
$executionMethod = 'task';
|
||||
}
|
||||
|
||||
/* Main Navigation. */
|
||||
$lang->mainNav = new stdclass();
|
||||
$lang->mainNav->my = "{$lang->navIcons['my']} {$lang->my->shortCommon}|my|index|";
|
||||
|
||||
@@ -40,6 +40,8 @@ class executionModel extends model
|
||||
*/
|
||||
public function accessDenied()
|
||||
{
|
||||
if(defined('TUTORIAL')) return true;
|
||||
|
||||
echo(js::alert($this->lang->execution->accessDenied));
|
||||
|
||||
if(!$this->server->http_referer) die(js::locate(helper::createLink('execution', 'index')));
|
||||
|
||||
@@ -186,6 +186,8 @@ class productModel extends model
|
||||
*/
|
||||
public function accessDenied()
|
||||
{
|
||||
if(defined('TUTORIAL')) return true;
|
||||
|
||||
echo(js::alert($this->lang->product->accessDenied));
|
||||
|
||||
if(!$this->server->http_referer) die(js::locate(helper::createLink('product', 'index')));
|
||||
@@ -1661,6 +1663,8 @@ class productModel extends model
|
||||
*/
|
||||
public function statisticProgram($productStats)
|
||||
{
|
||||
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProductStats();
|
||||
|
||||
$productStructure = array();
|
||||
|
||||
foreach($productStats as $product)
|
||||
|
||||
+22
-20
@@ -145,7 +145,7 @@ class programModel extends model
|
||||
|
||||
/**
|
||||
* Get kanban group data.
|
||||
*
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -175,7 +175,7 @@ class programModel extends model
|
||||
->fetchGroup('program', 'id');
|
||||
|
||||
$productPairs = array();
|
||||
foreach($productGroup as $programID => $products)
|
||||
foreach($productGroup as $programID => $products)
|
||||
{
|
||||
foreach($products as $productID => $product) $productPairs[$productID] = $productID;
|
||||
}
|
||||
@@ -236,7 +236,7 @@ class programModel extends model
|
||||
/* Group data. */
|
||||
foreach($productGroup as $programID => $products)
|
||||
{
|
||||
foreach($products as $productID => $product)
|
||||
foreach($products as $productID => $product)
|
||||
{
|
||||
$product->plans = zget($plans, $productID, array());
|
||||
$product->releases = zget($releases, $productID, array());
|
||||
@@ -245,10 +245,10 @@ class programModel extends model
|
||||
{
|
||||
if(helper::diffDate(helper::today(), $project->end) > 0) $project->delay = 1;
|
||||
|
||||
$status = $project->status == 'wait' ? 'wait' : 'doing';
|
||||
$status = $project->status == 'wait' ? 'wait' : 'doing';
|
||||
$execution = zget($doingExecutions, $project->id, array());
|
||||
|
||||
if(!empty($execution))
|
||||
if(!empty($execution))
|
||||
{
|
||||
$execution->hours = zget($hours, $execution->id, array());
|
||||
if(helper::diffDate(helper::today(), $execution->end) > 0) $execution->delay = 1;
|
||||
@@ -281,8 +281,8 @@ class programModel extends model
|
||||
|
||||
/**
|
||||
* Get involved programs by user.
|
||||
*
|
||||
* @param string $account
|
||||
*
|
||||
* @param string $account
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -299,12 +299,12 @@ class programModel extends model
|
||||
foreach($objects as $id => $object)
|
||||
{
|
||||
if($object->type == 'program') $involvedPrograms[$id] = $id;
|
||||
if($object->type == 'project')
|
||||
if($object->type == 'project')
|
||||
{
|
||||
$programID = $this->getTopByID($id);
|
||||
$involvedPrograms[$programID] = $programID;
|
||||
}
|
||||
if($object->type == 'sprint' || $object->type == 'stage')
|
||||
if($object->type == 'sprint' || $object->type == 'stage')
|
||||
{
|
||||
$programID = $this->getTopByID($object->project);
|
||||
$involvedPrograms[$programID] = $programID;
|
||||
@@ -321,11 +321,11 @@ class programModel extends model
|
||||
|
||||
foreach($stakeholders as $objectID => $object)
|
||||
{
|
||||
if($object->type == 'program')
|
||||
if($object->type == 'program')
|
||||
{
|
||||
$involvedPrograms[$objectID] = $objectID;
|
||||
}
|
||||
if($object->type == 'project')
|
||||
if($object->type == 'project')
|
||||
{
|
||||
$programID = $this->getTopByID($objectID);
|
||||
$involvedPrograms[$programID] = $programID;
|
||||
@@ -342,12 +342,12 @@ class programModel extends model
|
||||
|
||||
foreach($teams as $objectID => $object)
|
||||
{
|
||||
if($object->type == 'project')
|
||||
if($object->type == 'project')
|
||||
{
|
||||
$programID = $this->getTopByID($objectID);
|
||||
$involvedPrograms[$programID] = $programID;
|
||||
}
|
||||
if($object->type == 'execution')
|
||||
if($object->type == 'execution')
|
||||
{
|
||||
$programID = $this->getTopByID($object->project);
|
||||
$involvedPrograms[$programID] = $programID;
|
||||
@@ -364,7 +364,7 @@ class programModel extends model
|
||||
|
||||
/* Check priv. */
|
||||
$involvedPrograms = $this->dao->select('id')->from(TABLE_PROGRAM)
|
||||
->where('deleted')->eq(0)
|
||||
->where('deleted')->eq(0)
|
||||
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->programs)->fi()
|
||||
->andWhere('id')->in($involvedPrograms)
|
||||
->andWhere('grade')->eq(1)
|
||||
@@ -375,8 +375,8 @@ class programModel extends model
|
||||
|
||||
/**
|
||||
* Compute progress for project or execution.
|
||||
*
|
||||
* @param array $tasks
|
||||
*
|
||||
* @param array $tasks
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -384,20 +384,20 @@ class programModel extends model
|
||||
{
|
||||
$hours = array();
|
||||
foreach($tasks as $projectID => $projectTasks)
|
||||
{
|
||||
{
|
||||
$hour = new stdclass();
|
||||
$hour->totalConsumed = 0;
|
||||
$hour->totalEstimate = 0;
|
||||
$hour->totalLeft = 0;
|
||||
|
||||
foreach($projectTasks as $task)
|
||||
{
|
||||
{
|
||||
$hour->totalConsumed += $task->consumed;
|
||||
$hour->totalEstimate += $task->estimate;
|
||||
if($task->status != 'cancel' and $task->status != 'closed') $hour->totalLeft += $task->left;
|
||||
}
|
||||
}
|
||||
$hours[$projectID] = $hour;
|
||||
}
|
||||
}
|
||||
|
||||
foreach($hours as $hour)
|
||||
{
|
||||
@@ -1162,6 +1162,8 @@ class programModel extends model
|
||||
*/
|
||||
public function getProjectStats($programID = 0, $browseType = 'undone', $queryID = 0, $orderBy = 'id_desc', $pager = null, $programTitle = 0, $involved = 0, $queryAll = false)
|
||||
{
|
||||
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProjectStats();
|
||||
|
||||
/* Init vars. */
|
||||
$projects = $this->getProjectList($programID, $browseType, $queryID, $orderBy, $pager, $programTitle, $involved, $queryAll);
|
||||
|
||||
|
||||
@@ -61,6 +61,9 @@ $lang->project->id = '项目编号';
|
||||
$lang->project->stage = '阶段';
|
||||
$lang->project->model = '项目管理方式';
|
||||
$lang->project->PM = '负责人';
|
||||
$lang->project->PO = '项目负责人';
|
||||
$lang->project->QD = '测试负责人';
|
||||
$lang->project->RD = '发布负责人';
|
||||
$lang->project->name = '项目名称';
|
||||
$lang->project->category = '项目类型';
|
||||
$lang->project->desc = '项目描述';
|
||||
|
||||
@@ -32,6 +32,8 @@ class projectModel extends model
|
||||
*/
|
||||
public function accessDenied()
|
||||
{
|
||||
if(defined('TUTORIAL')) return true;
|
||||
|
||||
echo(js::alert($this->lang->project->accessDenied));
|
||||
$this->session->set('project', '');
|
||||
|
||||
@@ -172,6 +174,8 @@ class projectModel extends model
|
||||
*/
|
||||
public function getByID($projectID, $type = 'project')
|
||||
{
|
||||
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProject();
|
||||
|
||||
$project = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($projectID)->andWhere('`type`')->in($type)->fetch();
|
||||
if(!$project) return false;
|
||||
|
||||
@@ -501,6 +505,12 @@ class projectModel extends model
|
||||
*/
|
||||
public function getProducts($projectID, $withBranch = true, $status = 'all')
|
||||
{
|
||||
if(defined('TUTORIAL'))
|
||||
{
|
||||
if(!$withBranch) return $this->loadModel('tutorial')->getProductPairs();
|
||||
return $this->loadModel('tutorial')->getExecutionProducts();
|
||||
}
|
||||
|
||||
$query = $this->dao->select('t2.id, t2.name, t2.type, t1.branch, t1.plan')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id')
|
||||
->where('t1.project')->eq((int)$projectID)
|
||||
|
||||
@@ -115,6 +115,8 @@ class treeModel extends model
|
||||
*/
|
||||
public function getOptionMenu($rootID, $type = 'story', $startModule = 0, $branch = 0)
|
||||
{
|
||||
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getModulePairs();
|
||||
|
||||
if($type == 'line') $rootID = 0;
|
||||
|
||||
$branches = array($branch => '');
|
||||
|
||||
@@ -99,7 +99,7 @@ class tutorial extends control
|
||||
*/
|
||||
public function wizard($module, $method, $params = '')
|
||||
{
|
||||
define('TUTORIAL', true);
|
||||
if(!defined('TUTORIAL')) define('TUTORIAL', true);
|
||||
define('WIZARD_MODULE', $module);
|
||||
define('WIZARD_METHOD', $method);
|
||||
|
||||
|
||||
+130
-13
@@ -42,6 +42,17 @@ class tutorialModel extends model
|
||||
return array(1 => 'Test product');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get module pairs for tutorial.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getModulePairs()
|
||||
{
|
||||
return array(1 => 'Test module');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tutorial product.
|
||||
*
|
||||
@@ -52,6 +63,8 @@ class tutorialModel extends model
|
||||
{
|
||||
$product = new stdclass();
|
||||
$product->id = 1;
|
||||
$product->program = 0;
|
||||
$product->line = 0;
|
||||
$product->name = 'Test product';
|
||||
$product->code = 'test';
|
||||
$product->type = 'normal';
|
||||
@@ -70,6 +83,96 @@ class tutorialModel extends model
|
||||
return $product;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get product stats for tutorial.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProductStats()
|
||||
{
|
||||
$product = $this->getProduct();
|
||||
$product->stories = array();
|
||||
$product->stories[0] = '';
|
||||
$product->stories[1] = 'draft';
|
||||
$product->stories[2] = 'active';
|
||||
$product->stories[3] = 'closed';
|
||||
$product->stories[4] = 'changed';
|
||||
$product->stories[''] = 0;
|
||||
$product->stories['draft'] = 0;
|
||||
$product->stories['active'] = 0;
|
||||
$product->stories['closed'] = 0;
|
||||
$product->stories['changed'] = 0;
|
||||
$product->requirements = $product->stories;
|
||||
$product->plans = 0;
|
||||
$product->releases = 0;
|
||||
$product->bugs = 0;
|
||||
$product->unResolved = 0;
|
||||
$product->closedBugs = 0;
|
||||
$product->fixedBugs = 0;
|
||||
$product->assignToNull = 0;
|
||||
|
||||
$productStat[$product->program][$product->line]['products'][$product->id] = $product;
|
||||
return $productStat;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get project for tutorial;
|
||||
*
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function getProject()
|
||||
{
|
||||
$project = new stdclass();
|
||||
$project->id = 2;
|
||||
$project->project = 0;
|
||||
$project->model = 'scrum';
|
||||
$project->type = 'project';
|
||||
$project->name = 'Test Project';
|
||||
$project->code = '';
|
||||
$project->lifetime = '';
|
||||
$project->begin = date('Y-m-d', strtotime('-7 days'));
|
||||
$project->end = date('Y-m-d', strtotime('+7 days'));
|
||||
$project->days = 10;
|
||||
$project->status = 'wait';
|
||||
$project->pri = '1';
|
||||
$project->desc = '';
|
||||
$project->goal = '';
|
||||
$project->acl = 'open';
|
||||
$project->parent = 0;
|
||||
$project->path = ',2,';
|
||||
$project->grade = 1;
|
||||
$project->PM = $this->app->user->account;
|
||||
$project->PO = $this->app->user->account;
|
||||
$project->QD = $this->app->user->account;
|
||||
$project->RD = $this->app->user->account;
|
||||
$project->budget = 0;
|
||||
$project->deleted = '0';
|
||||
|
||||
return $project;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get project stats for tutorial
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProjectStats()
|
||||
{
|
||||
$project = $this->getProject();
|
||||
$emptyHour = array('totalEstimate' => 0, 'totalConsumed' => 0, 'totalLeft' => 0, 'progress' => 0);
|
||||
|
||||
$project->hours = (object)$emptyHour;
|
||||
$project->leftTasks = '—';
|
||||
$project->teamMembers = $this->getTeamMembers();
|
||||
$project->teamCount = count($project->teamMembers);
|
||||
|
||||
$projectStat[$project->id] = $project;
|
||||
return $projectStat;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tutorial stories.
|
||||
*
|
||||
@@ -82,6 +185,8 @@ class tutorialModel extends model
|
||||
$story->id = 1;
|
||||
$story->product = 1;
|
||||
$story->branch = 0;
|
||||
$story->parent = 0;
|
||||
$story->category = 0;
|
||||
$story->module = 0;
|
||||
$story->plan = '';
|
||||
$story->planTitle = '';
|
||||
@@ -111,6 +216,7 @@ class tutorialModel extends model
|
||||
$story->version = 1;
|
||||
$story->deleted = '0';
|
||||
$story->order = '0';
|
||||
$story->URChanged = false;
|
||||
|
||||
$stories = array();
|
||||
$stories[] = $story;
|
||||
@@ -129,7 +235,7 @@ class tutorialModel extends model
|
||||
*/
|
||||
public function getExecutionPairs()
|
||||
{
|
||||
return array(1 => 'Test execution');
|
||||
return array(3 => 'Test execution');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -141,18 +247,28 @@ class tutorialModel extends model
|
||||
public function getExecution()
|
||||
{
|
||||
$execution = new stdclass();
|
||||
$execution->id = 1;
|
||||
$execution->type = 'sprint';
|
||||
$execution->name = 'Test execution';
|
||||
$execution->code = 'test';
|
||||
$execution->begin = date('Y-m-d', strtotime('-7 days'));
|
||||
$execution->end = date('Y-m-d', strtotime('+7 days'));
|
||||
$execution->days = 10;
|
||||
$execution->status = 'wait';
|
||||
$execution->pri = '1';
|
||||
$execution->desc = '';
|
||||
$execution->goal = '';
|
||||
$execution->acl = 'open';
|
||||
$execution->id = 3;
|
||||
$execution->project = 2;
|
||||
$execution->type = 'sprint';
|
||||
$execution->name = 'Test execution';
|
||||
$execution->code = 'test';
|
||||
$execution->lifetime = '';
|
||||
$execution->begin = date('Y-m-d', strtotime('-7 days'));
|
||||
$execution->end = date('Y-m-d', strtotime('+7 days'));
|
||||
$execution->days = 10;
|
||||
$execution->status = 'wait';
|
||||
$execution->pri = '1';
|
||||
$execution->desc = '';
|
||||
$execution->goal = '';
|
||||
$execution->acl = 'open';
|
||||
$execution->parent = 2;
|
||||
$execution->path = ',2,3,';
|
||||
$execution->grade = 1;
|
||||
$execution->PM = $this->app->user->account;
|
||||
$execution->PO = $this->app->user->account;
|
||||
$execution->QD = $this->app->user->account;
|
||||
$execution->RD = $this->app->user->account;
|
||||
$execution->deleted = '0';
|
||||
return $execution;
|
||||
}
|
||||
|
||||
@@ -212,6 +328,7 @@ class tutorialModel extends model
|
||||
$member->totalHours = 70.0;
|
||||
$member->realname = $this->app->user->realname;
|
||||
$member->limited = 'no';
|
||||
$member->userID = $this->app->user->id;
|
||||
return array($member->account => $member);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user