+ add the converter of bugfree2.

This commit is contained in:
wangchunsheng
2010-03-21 05:18:47 +00:00
parent b0cf8af038
commit adcaf955e4
10 changed files with 817 additions and 250 deletions
+11
View File
@@ -83,6 +83,7 @@ $lang->bug->severityList[2] = 2;
$lang->bug->severityList[4] = 4;
/* Define the OS list. */
$lang->bug->osList[''] = '';
$lang->bug->osList['all'] = '全部';
$lang->bug->osList['winxp'] = 'Windows XP';
$lang->bug->osList['win7'] = 'Windows 7';
@@ -95,6 +96,7 @@ $lang->bug->osList['unix'] = 'Unix';
$lang->bug->osList['others'] = '其他';
/* Define the OS list. */
$lang->bug->browserList[''] = '';
$lang->bug->browserList['all'] = '全部';
$lang->bug->browserList['ie6'] = 'IE6';
$lang->bug->browserList['ie7'] = 'IE7';
@@ -112,6 +114,15 @@ $lang->bug->typeList[''] = '';
$lang->bug->typeList['codeerror'] = '代码错误';
$lang->bug->typeList['interface'] = '界面优化';
$lang->bug->typeList['designchange'] = '设计变更';
$lang->bug->typeList['newfeature'] = '新增需求';
$lang->bug->typeList['designdefect'] = '设计缺陷';
$lang->bug->typeList['config'] = '配置相关';
$lang->bug->typeList['install'] = '安装部署';
$lang->bug->typeList['security'] = '安全相关';
$lang->bug->typeList['performance'] = '性能问题';
$lang->bug->typeList['standard'] = '标准规范';
$lang->bug->typeList['automation'] = '测试脚本';
$lang->bug->typeList['trackthings'] = '事务跟踪';
$lang->bug->typeList['Others'] = '其他';
$lang->bug->statusList[''] = '';
+9 -5
View File
@@ -60,8 +60,8 @@ class convert extends control
{
$this->view->source = 'BugFree';
$this->view->version = $version;
$this->view->tablePrefix = $version > 1 ? 'bf' : '';
$this->view->dbName = 'BugFree';
$this->view->tablePrefix = $version > 1 ? 'bf_' : '';
$this->view->dbName = $version > 1 ? 'bugfree2' : 'BugFree';
$this->display();
}
@@ -104,6 +104,7 @@ class convert extends control
$convertFunc = 'convert' . $this->post->source;
$this->view->header->title = $this->lang->convert->execute;
$this->view->source = $this->post->source;
$this->view->version = $this->post->version;
$this->view->executeResult = $this->fetch('convert', $convertFunc, "version={$this->post->version}");
$this->display();
}
@@ -112,9 +113,12 @@ class convert extends control
public function convertBugFree($version)
{
helper::import('./converter/bugfree.php');
$converter = new bugfreeConvertModel();
$this->view->result = $converter->execute();
$this->view->info = bugfreeConvertModel::$info;
helper::import("./converter/bugfree$version.php");
$className = "bugfree{$version}ConvertModel";
$converter = new $className();
$this->view->version = $version;
$this->view->result = $converter->execute($version);
$this->view->info = bugfreeConvertModel::$info;
$this->display();
}
}
+4 -232
View File
@@ -1,6 +1,6 @@
<?php
/**
* The model file of bugfree convert of ZenTaoMS.
* The baisc model file of bugfree convert of ZenTaoMS.
*
* ZenTaoMS is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
@@ -26,6 +26,8 @@ class bugfreeConvertModel extends convertModel
public $map = array();
public $filePath = '';
static public $info = array();
/* 构造函数,连接到数据库。*/
public function __construct()
{
parent::__construct();
@@ -52,238 +54,8 @@ class bugfreeConvertModel extends convertModel
}
/* 执行转换。*/
public function execute()
public function execute($version)
{
$this->clear();
$result['users'] = $this->convertUser();
$result['projects'] = $this->convertProject();
$result['modules'] = $this->convertModule();
$result['bugs'] = $this->convertBug();
$result['actions'] = $this->convertAction();
$result['files'] = $this->convertFile();
$this->loadModel('tree')->fixModulePath();
return $result;
}
/* 转换用户。*/
public function convertUser()
{
/* 查询当前系统中存在的用户。*/
$activeUsers = $this->dao
->dbh($this->sourceDBH)
->select("{$this->app->company->id} AS company, username AS account, userpassword AS password, realname, email")
->from('BugUser')
->orderBy('userID ASC')
->fetchAll('account');
/* 查找曾经出现过的用户。*/
$allUsers = $this->dao->select("distinct(username) AS account")->from('BugHistory')->fetchPairs();
/* 合并二者。*/
foreach($allUsers as $key => $account)
{
if(isset($activeUsers[$account]))
{
$allUsers[$key] = $activeUsers[$account];
}
else
{
$allUsers[$key] = array('company' => $this->app->company->id, 'account' => $account, 'realname' => $account, 'status' => 'delete');
}
}
foreach($activeUsers as $account => $user) if(!isset($allUsers[$account])) $allUsers[$account] = $user;
/* 导入到zentao数据库中。*/
$convertCount = 0;
foreach($allUsers as $account => $user)
{
if(!$this->dao->dbh($this->dbh)->findByAccount($account)->from(TABLE_USER)->fetch('account'))
{
$this->dao->dbh($this->dbh)->insert(TABLE_USER)->data($user)->exec();
$convertCount ++;
}
else
{
self::$info['users'][] = sprintf($this->lang->convert->errorUserExists, $account);
}
}
return $convertCount;
}
/* 转换项目为产品。*/
public function convertProject()
{
$projects = $this->dao->dbh($this->sourceDBH)->select("projectID AS id, projectName AS name, {$this->app->company->id} AS company")->from('BugProject')->fetchAll('id');
foreach($projects as $projectID => $project)
{
unset($project->id);
$this->dao->dbh($this->dbh)->insert(TABLE_PRODUCT)->data($project)->exec();
$this->map['product'][$projectID] = $this->dao->lastInsertID();
}
return count($projects);
}
/* 转换原来的模块为Bug视图模块。*/
public function convertModule()
{
$this->map['module'][0] = 0;
$modules = $this->dao
->dbh($this->sourceDBH)
->select(
'moduleID AS id,
projectID AS product,
moduleName AS name,
moduleGrade AS grade,
parentID AS parent,
"bug" AS view')
->from('BugModule')
->orderBy('id ASC')
->fetchAll('id');
foreach($modules as $moduleID => $module)
{
$module->product = $this->map['product'][$module->product];
unset($module->id);
$this->dao->dbh($this->dbh)->insert(TABLE_MODULE)->data($module)->exec();
$this->map['module'][$moduleID] = $this->dao->lastInsertID();
}
/* 更新parent。*/
foreach($this->map['module'] as $oldModuleID => $newModuleID)
{
$this->dao->dbh($this->dbh)->update(TABLE_MODULE)->set('parent')->eq($newModuleID)->where('parent')->eq($oldModuleID)->exec();
}
return count($modules);
}
/* 转换Bug。*/
public function convertBug()
{
$bugs = $this->dao
->dbh($this->sourceDBH)
->select('
bugID AS id,
projectID AS product,
moduleID AS module,
bugTitle AS title,
bugSeverity AS severity,
bugType AS type,
bugOS AS os,
bugStatus AS status,
mailto,
openedBy, openedDate, openedBuild,
assignedTo, assignedDate,
resolvedBy, resolution, resolvedBuild, resolvedDate,
closedBy, closedDate,
lastEditedBy, lastEditedDate,
linkID as duplicateBug
')
->from('BugInfo')
->orderBy('bugID')
->fetchAll('id');
foreach($bugs as $bugID => $bug)
{
$bugID = (int)$bugID;
unset($bug->id);
if($bug->assignedTo == 'Closed') $bug->assignedTo = 'closed';
$bug->type = strtolower($bug->type);
$bug->os = strtolower($bug->os);
$bug->browser = 'all';
$bug->resolution = str_replace(' ','', strtolower($bug->resolution));
$bug->product = $this->map['product'][$bug->product];
$bug->module = $this->map['module'][$bug->module];
$this->dao->dbh($this->dbh)->insert(TABLE_BUG)->data($bug)->exec();
$this->map['bug'][$bugID] = $this->dao->lastInsertID();
}
/* 更新duplicateBug。 */
foreach($this->map['bug'] as $oldBugID => $newBugID)
{
$this->dao->dbh($this->dbh)->update(TABLE_BUG)->set('duplicateBug')->eq($newBugID)->where('duplicateBug')->eq($oldBugID)->exec();
}
return count($bugs);
}
/* 转换历史记录。*/
public function convertAction()
{
$actions = $this->dao
->dbh($this->sourceDBH)
->select(
"{$this->app->company->id} AS company,
'bug' AS objectType,
bugID AS objectID,
userName AS actor,
action,
fullInfo AS comment,
actionDate AS date")
->from('BugHistory')
->orderBy('bugID, historyID')
->fetchGroup('objectID');
$convertCount = 0;
foreach($actions as $bugID => $bugActions)
{
/* 获得转换之后的bugID。*/
$bugID = (int)$bugID;
$zentaoBugID = $this->map['bug'][$bugID];
/* 处理action。*/
foreach($bugActions as $key => $action)
{
$action->objectID = $zentaoBugID;
if($key == 0)
{
$this->dao->dbh($this->dbh)->update(TABLE_BUG)->set('steps')->eq($action->comment)->where('id')->eq($zentaoBugID)->exec();
$action->comment = '';
}
$this->dao->dbh($this->dbh)->insert(TABLE_ACTION)->data($action)->exec();
$convertCount ++;
}
}
return $convertCount;
}
/* 转换附件。*/
public function convertFile()
{
$this->setPath();
$files = $this->dao->dbh($this->sourceDBH)
->select(
"{$this->app->company->id} AS company,
fileName AS pathname,
fileTitle AS title,
fileType AS extension,
fileSize AS size,
'bug' AS objectType,
bugID AS objectID,
addUser AS addedBy,
addDate AS addedDate
")
->from('BugFile')
->orderBy('fileID')
->fetchAll();
foreach($files as $file)
{
$file->objectID = $this->map['bug'][(int)$file->objectID];
if(strpos($file->size, 'KB')) $file->size = (int)(str_replace('KB', '', $file->size) * 1024);
if(strpos($file->size, 'MB')) $file->size = (int)(str_replace('MB', '', $file->size) * 1024 * 1024);
$this->dao->dbh($this->dbh)->insert(TABLE_FILE)->data($file)->exec();
/* 拷贝文件。*/
$soureFile = $this->filePath . $file->pathname;
if(!file_exists($soureFile))
{
self::$info['files'][] = sprintf($this->lang->convert->errorFileNotExits, $soureFile);
continue;
}
$targetFile = $this->app->getAppRoot() . "www/data/upload/{$this->app->company->id}/" . $file->pathname;
$targetPath = dirname($targetFile);
if(!is_dir($targetPath)) mkdir($targetPath, 0777, true);
if(!copy($soureFile, $targetFile))
{
self::$info['files'][] = sprintf($this->lang->convert->errorCopyFailed, $targetFile);
}
}
return count($files);
}
/* 清空导入之后的数据。*/
+289
View File
@@ -0,0 +1,289 @@
<?php
/**
* The model file of bugfree version 1 convert of ZenTaoMS.
*
* ZenTaoMS is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ZenTaoMS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with ZenTaoMS. If not, see <http://www.gnu.org/licenses/>.
*
* @copyright Copyright 2009-2010 Chunsheng Wang
* @author Chunsheng Wang <wwccss@263.net>
* @package convert
* @version $Id$
* @link http://www.zentao.cn
*/
class bugfree1ConvertModel extends bugfreeConvertModel
{
/* 执行转换。*/
public function execute()
{
$this->clear();
$this->convertGroup();
$result['users'] = $this->convertUser();
$result['projects'] = $this->convertProject();
$result['modules'] = $this->convertModule();
$result['bugs'] = $this->convertBug();
$result['actions'] = $this->convertAction();
$result['files'] = $this->convertFile();
$this->loadModel('tree')->fixModulePath();
return $result;
}
/* 转换用户分组。*/
public function convertGroup()
{
$groups = $this->dao->dbh($this->sourceDBH)
->select("{$this->app->company->id} AS company, groupID AS id, groupName AS name, groupUser AS users")
->from('BugGroup')
->fetchAll('id');
foreach($groups as $groupID => $group)
{
/* 将分组用户拆分成数组。*/
$groupUsers = explode(',', $group->users);
unset($group->id);
unset($group->users);
/* 插入到group表中。*/
$this->dao->dbh($this->dbh)->insert(TABLE_GROUP)->data($group)->exec();
$zentaoGroupID = $this->dao->lastInsertId();
/* 设置账户和group的对应关系。*/
foreach($groupUsers as $account)
{
if(empty($account)) continue;
$this->dao->dbh($this->dbh)->insert(TABLE_USERGROUP)->set('`group`')->eq($zentaoGroupID)->set('account')->eq($account)->exec();
}
}
}
/* 转换用户。*/
public function convertUser()
{
/* 查询当前系统中存在的用户。*/
$activeUsers = $this->dao
->dbh($this->sourceDBH)
->select("{$this->app->company->id} AS company, username AS account, userpassword AS password, realname, email")
->from('BugUser')
->orderBy('userID ASC')
->fetchAll('account');
/* 查找曾经出现过的用户。*/
$allUsers = $this->dao->select("distinct(username) AS account")->from('BugHistory')->fetchPairs();
/* 合并二者。*/
foreach($allUsers as $key => $account)
{
if(isset($activeUsers[$account]))
{
$allUsers[$key] = $activeUsers[$account];
}
else
{
$allUsers[$key] = array('company' => $this->app->company->id, 'account' => $account, 'realname' => $account, 'status' => 'delete');
}
}
foreach($activeUsers as $account => $user) if(!isset($allUsers[$account])) $allUsers[$account] = $user;
/* 导入到zentao数据库中。*/
$convertCount = 0;
foreach($allUsers as $account => $user)
{
if(!$this->dao->dbh($this->dbh)->findByAccount($account)->from(TABLE_USER)->fetch('account'))
{
$this->dao->dbh($this->dbh)->insert(TABLE_USER)->data($user)->exec();
$convertCount ++;
}
else
{
self::$info['users'][] = sprintf($this->lang->convert->errorUserExists, $account);
}
}
return $convertCount;
}
/* 转换项目为产品。*/
public function convertProject()
{
$projects = $this->dao->dbh($this->sourceDBH)->select("projectID AS id, projectName AS name, {$this->app->company->id} AS company")->from('BugProject')->fetchAll('id');
foreach($projects as $projectID => $project)
{
unset($project->id);
$this->dao->dbh($this->dbh)->insert(TABLE_PRODUCT)->data($project)->exec();
$this->map['product'][$projectID] = $this->dao->lastInsertID();
}
return count($projects);
}
/* 转换原来的模块为Bug视图模块。*/
public function convertModule()
{
$this->map['module'][0] = 0;
$modules = $this->dao
->dbh($this->sourceDBH)
->select(
'moduleID AS id,
projectID AS product,
moduleName AS name,
moduleGrade AS grade,
parentID AS parent,
"bug" AS view')
->from('BugModule')
->orderBy('id ASC')
->fetchAll('id');
foreach($modules as $moduleID => $module)
{
$module->product = $this->map['product'][$module->product];
unset($module->id);
$this->dao->dbh($this->dbh)->insert(TABLE_MODULE)->data($module)->exec();
$this->map['module'][$moduleID] = $this->dao->lastInsertID();
}
/* 更新parent。*/
foreach($this->map['module'] as $oldModuleID => $newModuleID)
{
$this->dao->dbh($this->dbh)->update(TABLE_MODULE)->set('parent')->eq($newModuleID)->where('parent')->eq($oldModuleID)->exec();
}
return count($modules);
}
/* 转换Bug。*/
public function convertBug()
{
$bugs = $this->dao
->dbh($this->sourceDBH)
->select('
bugID AS id,
projectID AS product,
moduleID AS module,
bugTitle AS title,
bugSeverity AS severity,
bugType AS type,
bugOS AS os,
bugStatus AS status,
mailto,
openedBy, openedDate, openedBuild,
assignedTo, assignedDate,
resolvedBy, resolution, resolvedBuild, resolvedDate,
closedBy, closedDate,
lastEditedBy, lastEditedDate,
linkID as duplicateBug
')
->from('BugInfo')
->orderBy('bugID')
->fetchAll('id');
foreach($bugs as $bugID => $bug)
{
/* 修正Bug数据。*/
$bugID = (int)$bugID;
unset($bug->id);
if($bug->assignedTo == 'Closed') $bug->assignedTo = 'closed';
$bug->type = strtolower($bug->type);
$bug->os = strtolower($bug->os);
$bug->browser = 'all';
$bug->resolution = str_replace(' ','', strtolower($bug->resolution));
$bug->product = $this->map['product'][$bug->product];
$bug->module = $this->map['module'][$bug->module];
$this->dao->dbh($this->dbh)->insert(TABLE_BUG)->data($bug)->exec();
$this->map['bug'][$bugID] = $this->dao->lastInsertID();
}
/* 更新duplicateBug。 */
foreach($this->map['bug'] as $oldBugID => $newBugID)
{
$this->dao->dbh($this->dbh)->update(TABLE_BUG)->set('duplicateBug')->eq($newBugID)->where('duplicateBug')->eq($oldBugID)->exec();
}
return count($bugs);
}
/* 转换历史记录。*/
public function convertAction()
{
$actions = $this->dao
->dbh($this->sourceDBH)
->select(
"{$this->app->company->id} AS company,
'bug' AS objectType,
bugID AS objectID,
userName AS actor,
action,
fullInfo AS comment,
actionDate AS date")
->from('BugHistory')
->orderBy('bugID, historyID')
->fetchGroup('objectID');
$convertCount = 0;
foreach($actions as $bugID => $bugActions)
{
/* 获得转换之后的bugID。*/
$bugID = (int)$bugID;
$zentaoBugID = $this->map['bug'][$bugID];
/* 处理action。*/
foreach($bugActions as $key => $action)
{
$action->objectID = $zentaoBugID;
if($key == 0)
{
$this->dao->dbh($this->dbh)->update(TABLE_BUG)->set('steps')->eq($action->comment)->where('id')->eq($zentaoBugID)->exec();
$action->comment = '';
}
$this->dao->dbh($this->dbh)->insert(TABLE_ACTION)->data($action)->exec();
$convertCount ++;
}
}
return $convertCount;
}
/* 转换附件。*/
public function convertFile()
{
$this->setPath();
$files = $this->dao->dbh($this->sourceDBH)
->select(
"{$this->app->company->id} AS company,
fileName AS pathname,
fileTitle AS title,
fileType AS extension,
fileSize AS size,
'bug' AS objectType,
bugID AS objectID,
addUser AS addedBy,
addDate AS addedDate
")
->from('BugFile')
->orderBy('fileID')
->fetchAll();
foreach($files as $file)
{
$file->objectID = $this->map['bug'][(int)$file->objectID];
if(strpos($file->size, 'KB')) $file->size = (int)(str_replace('KB', '', $file->size) * 1024);
if(strpos($file->size, 'MB')) $file->size = (int)(str_replace('MB', '', $file->size) * 1024 * 1024);
$this->dao->dbh($this->dbh)->insert(TABLE_FILE)->data($file)->exec();
/* 拷贝文件。*/
$soureFile = $this->filePath . $file->pathname;
if(!file_exists($soureFile))
{
self::$info['files'][] = sprintf($this->lang->convert->errorFileNotExits, $soureFile);
continue;
}
$targetFile = $this->app->getAppRoot() . "www/data/upload/{$this->app->company->id}/" . $file->pathname;
$targetPath = dirname($targetFile);
if(!is_dir($targetPath)) mkdir($targetPath, 0777, true);
if(!copy($soureFile, $targetFile))
{
self::$info['files'][] = sprintf($this->lang->convert->errorCopyFailed, $targetFile);
}
}
return count($files);
}
}
+469
View File
@@ -0,0 +1,469 @@
<?php
/**
* The model file of bugfree2 convert of ZenTaoMS.
*
* ZenTaoMS is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ZenTaoMS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with ZenTaoMS. If not, see <http://www.gnu.org/licenses/>.
*
* @copyright Copyright 2009-2010 Chunsheng Wang
* @author Chunsheng Wang <wwccss@263.net>
* @package convert
* @version $Id$
* @link http://www.zentao.cn
*/
class bugfree2ConvertModel extends bugfreeConvertModel
{
/* 执行转换。*/
public function execute()
{
$this->clear();
$this->setTable();
$this->convertGroup();
$result['users'] = $this->convertUser();
$result['projects'] = $this->convertProject();
$result['modules'] = $this->convertModule();
$result['bugs'] = $this->convertBug();
$result['cases'] = $this->convertCase();
$result['results'] = $this->convertResult();
$result['actions'] = $this->convertAction();
$result['files'] = $this->convertFile();
$this->loadModel('tree')->fixModulePath();
return $result;
}
/* 设置表名。*/
public function setTable()
{
$dbPrefix = $this->post->dbPrefix;
define('BUGFREE_TABLE_USER', $dbPrefix . 'TestUser');
define('BUGFREE_TABLE_PROJECT', $dbPrefix . 'TestProject');
define('BUGFREE_TABLE_MODULE', $dbPrefix . 'TestModule');
define('BUGFREE_TABLE_BUGINFO', $dbPrefix . 'BugInfo');
define('BUGFREE_TABLE_CASEINFO', $dbPrefix . 'CaseInfo');
define('BUGFREE_TABLE_RESULTINFO', $dbPrefix . 'ResultInfo');
define('BUGFREE_TABLE_ACTION', $dbPrefix . 'TestAction');
define('BUGFREE_TABLE_FILE', $dbPrefix . 'TestFile');
define('BUGFREE_TABLE_HISTORY', $dbPrefix . 'TestHistory');
define('BUGFREE_TABLE_GROUP', $dbPrefix . 'TestGroup');
}
/* 转换用户。*/
public function convertUser()
{
/* 获得所有的用户列表。*/
$users = $this->dao
->dbh($this->sourceDBH)
->select("{$this->app->company->id} AS company, username AS account, userpassword AS password, realname, email, isDroped")
->from(BUGFREE_TABLE_USER)
->orderBy('userID ASC')
->fetchAll('account');
/* 转换isDroped字段。*/
foreach($users as $account => $user)
{
$user->status = $user->isDroped ? 'delete' : 'active';
unset($user->isDroped);
}
/* 导入到zentao数据库中。*/
$convertCount = 0;
foreach($users as $account => $user)
{
if(!$this->dao->dbh($this->dbh)->findByAccount($account)->from(TABLE_USER)->fetch('account'))
{
$this->dao->dbh($this->dbh)->insert(TABLE_USER)->data($user)->exec();
$convertCount ++;
}
else
{
self::$info['users'][] = sprintf($this->lang->convert->errorUserExists, $account);
}
}
return $convertCount;
}
/* 转换用户分组。*/
public function convertGroup()
{
$groups = $this->dao->dbh($this->sourceDBH)
->select("{$this->app->company->id} AS company, groupID AS id, groupName AS name, groupUser AS users")
->from(BUGFREE_TABLE_GROUP)
->fetchAll('id');
foreach($groups as $groupID => $group)
{
/* 处理group数据。*/
if($group->name == '[All Users]') continue;
$groupUsers = explode(',', $group->users);
unset($group->id);
unset($group->users);
/* 插入到group表。*/
$this->dao->dbh($this->dbh)->insert(TABLE_GROUP)->data($group)->exec();
$zentaoGroupID = $this->dao->lastInsertId();
/* 插入到userGroup表。*/
foreach($groupUsers as $account)
{
if(empty($account)) continue;
$this->dao->dbh($this->dbh)->insert(TABLE_USERGROUP)
->set('`group`')->eq($zentaoGroupID)
->set('account')->eq($account)
->exec();
}
}
}
/* 转换项目为产品。*/
public function convertProject()
{
$projects = $this->dao->dbh($this->sourceDBH)
->select("projectID AS id, projectName AS name, {$this->app->company->id} AS company, isDroped")
->from(BUGFREE_TABLE_PROJECT)
->fetchAll('id');
foreach($projects as $projectID => $project)
{
$project->status = $project->isDroped ? 'delete' : 'active';
unset($project->id);
unset($project->isDroped);
$this->dao->dbh($this->dbh)->insert(TABLE_PRODUCT)->data($project)->exec();
$this->map['product'][$projectID] = $this->dao->lastInsertID();
}
return count($projects);
}
/* 转换原来的模块为Bug视图模块。*/
public function convertModule()
{
$this->map['module'][0] = 0;
$modules = $this->dao
->dbh($this->sourceDBH)
->select(
'moduleID AS id,
moduleType as view,
projectID AS product,
moduleName AS name,
moduleGrade AS grade,
parentID AS parent,
displayOrder AS `order`')
->from(BUGFREE_TABLE_MODULE)
->orderBy('id ASC')
->fetchAll('id');
foreach($modules as $moduleID => $module)
{
$module->product = $this->map['product'][$module->product];
$module->view = strtolower($module->view);
unset($module->id);
$this->dao->dbh($this->dbh)->insert(TABLE_MODULE)->data($module)->exec();
$this->map['module'][$moduleID] = $this->dao->lastInsertID();
}
/* 更新parent。*/
foreach($this->map['module'] as $oldModuleID => $newModuleID)
{
$this->dao->dbh($this->dbh)->update(TABLE_MODULE)->set('parent')->eq($newModuleID)->where('parent')->eq($oldModuleID)->exec();
}
return count($modules);
}
/* 转换Bug。*/
public function convertBug()
{
$bugs = $this->dao
->dbh($this->sourceDBH)
->select('
bugID AS id,
projectID AS product,
moduleID AS module,
bugTitle AS title,
bugSeverity AS severity,
bugPriority AS pri,
bugType AS type,
bugOS AS os,
bugBrowser AS browser,
bugMachine AS hardware,
howFound AS found,
reproSteps AS steps,
bugStatus AS status,
linkID AS linkBug,
duplicateID AS duplicateBug,
caseID AS `case`,
1 AS caseVersion,
resultID AS result,
mailto,
openedBy, openedDate, openedBuild,
assignedTo, assignedDate,
resolvedBy, resolution, resolvedBuild, resolvedDate,
closedBy, closedDate,
lastEditedBy, lastEditedDate,
bugKeyword AS keyword
')
->from(BUGFREE_TABLE_BUGINFO)
->where('isDroped')->eq(0)
->orderBy('bugID')
->fetchAll('id');
foreach($bugs as $bugID => $bug)
{
/* 修正Bug数据。*/
$bugID = (int)$bugID;
unset($bug->id);
if($bug->assignedTo == 'Closed') $bug->assignedTo = 'closed';
if($bug->assignedTo == 'Active') $bug->assignedTo = '';
$bug->type = strtolower($bug->type);
$bug->found = strtolower($bug->found);
$bug->status = strtolower($bug->status);
$bug->os = strtolower($bug->os);
$bug->browser= strtolower($bug->browser);
if($bug->os == 'winvista') $bug->os = 'vista';
if($bug->browser == 'firefox3.0') $bug->browser = 'firefox3';
if($bug->browser == 'firefox2.0') $bug->browser = 'firefox2';
if($bug->openedBuild == 'N/A') $bug->openedBuild = '';
if(!$bug->case) $bug->caseVersion = 0;
$bug->resolution = str_replace(' ', '', strtolower($bug->resolution));
$bug->product = $this->map['product'][$bug->product];
$bug->module = $this->map['module'][$bug->module];
$this->dao->dbh($this->dbh)->insert(TABLE_BUG)->data($bug)->exec();
$this->map['bug'][$bugID] = $this->dao->lastInsertID();
}
/* 更新duplicateBug。 */
foreach($this->map['bug'] as $oldBugID => $newBugID)
{
$this->dao->dbh($this->dbh)->update(TABLE_BUG)->set('duplicateBug')->eq($newBugID)->where('duplicateBug')->eq($oldBugID)->exec();
}
return count($bugs);
}
/* 转换case。*/
public function convertCase()
{
$cases = $this->dao
->dbh($this->sourceDBH)
->select('
caseID AS id,
projectID AS product,
moduleID AS module,
caseTitle AS title,
caseSteps AS step,
casePriority AS pri,
caseType AS type,
caseStatus AS status,
caseMethod AS executeType,
casePlan AS scope,
openedBy, openedDate,
lastEditedBy, lastEditedDate,
scriptedBy, scriptedDate, scriptStatus, scriptLocation,
linkID AS linkCase,
casekeyword AS keyword,
DisplayOrder AS `order`,
1 AS version,
bugID
')
->from(BUGFREE_TABLE_CASEINFO)
->where('isDroped')->eq(0)
->orderBy('caseID')
->fetchAll('id');
foreach($cases as $caseID => $case)
{
/* 修正case的数据。*/
$caseID = (int)$caseID;
$step = $case->step;
$bugs = explode(',', $case->bugID);
unset($case->id);
unset($case->step);
unset($case->bugID);
$case->type = strtolower($case->type);
$case->status = strtolower($case->status);
$case->executeType = strtolower($case->executeType);
$case->scope = strtolower($case->scope);
if($case->type == 'configuration') $case->type = 'config';
if($case->type == 'setup') $case->type = 'install';
if($case->type == 'functional') $case->type = 'feature';
if($case->status == 'active') $case->status = 'normal';
/* 将产品和模块替换成禅道系统中的id。*/
$case->product = $this->map['product'][$case->product];
$case->module = $this->map['module'][$case->module];
/* 插入到case表中。*/
$this->dao->dbh($this->dbh)->insert(TABLE_CASE)->data($case)->exec();
$zentaoCaseID = $this->dao->lastInsertID();
$this->map['case'][$caseID] = $zentaoCaseID;
/* 用例步骤表。*/
$caseStep->case = $zentaoCaseID;
$caseStep->version = 1;
$caseStep->desc = $step;
$this->dao->dbh($this->dbh)->insert(TABLE_CASESTEP)->data($caseStep)->exec();
/* 更新相关bug。*/
foreach($bugs as $bugID)
{
if(!isset($this->map['bug'][$bugID])) continue;
$zentaoBugID = $this->map['bug'][$bugID];
$this->dao->dbh($this->dbh)->update(TABLE_BUG)->set('`case`')->eq($zentaoCaseID)->where('id')->eq($zentaoBugID)->limit(1)->exec();
}
}
return count($cases);
}
/* 转换测试执行结果。*/
public function convertResult()
{
$results = $this->dao->dbh($this->sourceDBH)
->select('
resultID AS id,
caseID AS `case`,
resultValue AS caseResult,
1 AS version,
openedDate as date,
bugID
')
->from(BUGFREE_TABLE_RESULTINFO)
->orderBy('id')
->fetchAll('id');
foreach($results as $resultID => $result)
{
unset($result->id);
/* 记录对应的bug信息。*/
$bugID = (int)$result->bugID;
$zentaoBugID = $this->map['bug'][$bugID];
unset($result->bugID);
/* 插入到testResult表中。*/
$this->dao->dbh($this->dbh)->insert(TABLE_TESTRESULT)->data($result)->exec();
$zentaoResultID = $this->dao->lastInsertId();
$this->map['result'][$resultID] = $zentaoResultID;
/* 更新bug表中的result字段。*/
$this->dao->dbh($this->dbh)->update(TABLE_BUG)->set('result')->eq($zentaoResultID)->where('id')->eq($zentaoBugID)->limit(1)->exec();
}
return count($results);
}
/* 转换历史记录。*/
public function convertAction()
{
$actions = $this->dao
->dbh($this->sourceDBH)
->select("{$this->app->company->id} AS company,
actionID AS id,
actionTarget AS objectType,
idValue AS objectID,
actionUser AS actor,
actionType AS action,
actionDate AS date,
actionNote AS comment
")
->from(BUGFREE_TABLE_ACTION)
->where('actionTarget' != 'Result')
->orderBy('actionID')
->fetchAll('id');
foreach($actions as $actionID => $action)
{
$actionID = (int)$action->id;
unset($action->id);
$action->objectType = strtolower($action->objectType);
$action->action = strtolower($action->action);
$action->objectID = $this->map[$action->objectType][$action->objectID];
$this->dao->dbh($this->dbh)->insert(TABLE_ACTION)->data($action)->exec();
$this->map['action'][$actionID] = $this->dao->lastInsertID();
}
return count($actions);
}
/* 转换历史修改记录。*/
public function convertHistory()
{
$histories = $this->dao->dbh($this->sourceDBH)
->select('actioID, actionField AS field, oldValue AS old, newValue AS new')
->from(BUGFREE_TABLE_HISTORY)
->orderBy('historyID')
->fetchAll();
foreach($histories as $history)
{
$history->actionID = $this->map['action'][$history->actionID];
$this->dao->dbh($this->dbh)->insert(TABLE_HISTORY)->data($history)->exec();
}
}
/* 转换附件。*/
public function convertFile()
{
$this->setPath();
$files = $this->dao->dbh($this->sourceDBH)
->select(
"{$this->app->company->id} AS company,
actionID,
fileName AS pathname,
fileTitle AS title,
fileType AS extension,
fileSize AS size
")
->from(BUGFREE_TABLE_FILE)
->orderBy('fileID')
->fetchAll();
foreach($files as $file)
{
/* 查找对应的action信息,以获得文件的相关字段。*/
$zentaoActionID = $this->map['action'][$file->actionID];
$zentaoAction = $this->dao->dbh($this->dbh)->findById($zentaoActionID)->from(TABLE_ACTION)->fetch();
$file->objectType = $zentaoAction->objectType;
$file->objectID = $zentaoAction->objectID;
$file->addedBy = $zentaoAction->actor;
$file->addedDate = $zentaoAction->date;
unset($file->actionID);
/* 处理文件大小。*/
if(strpos($file->size, 'KB')) $file->size = (int)(str_replace('KB', '', $file->size) * 1024);
if(strpos($file->size, 'MB')) $file->size = (int)(str_replace('MB', '', $file->size) * 1024 * 1024);
/* 插入到数据库。*/
$this->dao->dbh($this->dbh)->insert(TABLE_FILE)->data($file)->exec();
/* 拷贝文件。*/
$soureFile = $this->filePath . $file->pathname;
if(!file_exists($soureFile))
{
self::$info['files'][] = sprintf($this->lang->convert->errorFileNotExits, $soureFile);
continue;
}
$targetFile = $this->app->getAppRoot() . "www/data/upload/{$this->app->company->id}/" . $file->pathname;
$targetPath = dirname($targetFile);
if(!is_dir($targetPath)) mkdir($targetPath, 0777, true);
if(!copy($soureFile, $targetFile))
{
self::$info['files'][] = sprintf($this->lang->convert->errorCopyFailed, $targetFile);
}
}
return count($files);
}
/* 清空导入之后的数据。*/
public function clear()
{
foreach($this->session->state as $table => $maxID)
{
$this->dao->dbh($this->dbh)->delete()->from($table)->where('id')->gt($maxID)->exec();
}
}
}
+3 -1
View File
@@ -38,7 +38,7 @@ $lang->convert->source = '来源系统';
$lang->convert->version = '版本';
$lang->convert->mustSelectSource = "必须选择一个来源。";
$lang->convert->sourceList['BugFree'] = array('bugfree_1' => '1.x');
$lang->convert->sourceList['BugFree'] = array('bugfree_1' => '1.x', 'bugfree_2' => '2.x');
$lang->convert->setting = '设置';
$lang->convert->checkConfig = '检查配置';
@@ -68,6 +68,8 @@ $lang->convert->bugfree->users = '用户';
$lang->convert->bugfree->projects = '项目';
$lang->convert->bugfree->modules = '模块';
$lang->convert->bugfree->bugs = 'Bug';
$lang->convert->bugfree->cases = '测试用例';
$lang->convert->bugfree->results = '测试结果';
$lang->convert->bugfree->actions = '历史记录';
$lang->convert->bugfree->files = '附件';
+1
View File
@@ -34,6 +34,7 @@
echo html::hidden('dbUser', $this->post->dbUser);
echo html::hidden('dbPassword', $this->post->dbPassword);
echo html::hidden('dbName', $this->post->dbName);
echo html::hidden('dbPrefix', $this->post->dbPrefix);
echo html::hidden('installPath',$this->post->installPath);
?>
</form>
@@ -23,6 +23,20 @@
<td><?php echo $result['bugs'];?></td>
<td class='f-12px'><?php if(isset($info['bugs'])) echo join('<br />', $info['bugs']);?></td>
</tr>
<?php if($version > 1):?>
<tr>
<th class='rowhead'><?php echo $lang->convert->bugfree->cases;?></th>
<td><?php echo $result['cases'];?></td>
<td class='f-12px'><?php if(isset($info['cases'])) echo join('<br />', $info['cases']);?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->convert->bugfree->results;?></th>
<td><?php echo $result['results'];?></td>
<td class='f-12px'><?php if(isset($info['results'])) echo join('<br />', $info['results']);?></td>
</tr>
<?php endif;?>
<tr>
<th class='rowhead'><?php echo $lang->convert->bugfree->actions;?></th>
<td><?php echo $result['actions'];?></td>
+9 -9
View File
@@ -1,30 +1,30 @@
<tr>
<th class='rowhead w-200px'><?php echo $lang->convert->dbHost;?></th>
<td><?php echo html::input('dbHost', $config->db->host);?></td>
<td><?php echo html::input('dbHost', $config->db->host, "class='text-3'");?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->convert->dbPort;?></th>
<td><?php echo html::input('dbPort', $config->db->port);?></td>
<td><?php echo html::input('dbPort', $config->db->port, "class='text-3'");?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->convert->dbUser;?></th>
<td><?php echo html::input('dbUser', $config->db->user);?></td>
<td><?php echo html::input('dbUser', $config->db->user, "class='text-3'");?></td>
</tr>
<tr>
<th class='rowhead'><?php echo $lang->convert->dbPassword;?></th>
<td><?php echo html::input('dbPassword', $config->db->password);?></td>
<td><?php echo html::input('dbPassword', $config->db->password, "class='text-3'");?></td>
</tr>
<tr>
<th class='rowhead'><?php printf($lang->convert->dbName, $source);?></th>
<td><?php echo html::input('dbName', $dbName);?></td>
<td><?php echo html::input('dbName', $dbName, "class='text-3'");?></td>
</tr>
<!--
<?php if($version > 1):?>
<tr>
<th class='rowhead'><?php printf($lang->convert->dbPrefix, $source);?></th>
<td><?php echo html::input('dbPrefix', $tablePrefix);?></td>
<td><?php echo html::input('dbPrefix', $tablePrefix, "class='text-3'");?></td>
</tr>
-->
<?php endif;?>
<tr>
<th class='rowhead'><?php printf($lang->convert->installPath, $source);?></th>
<td><?php echo html::input('installPath');?></td>
<td><?php echo html::input('installPath', '', "class='text-3'");?></td>
</tr>
+8 -3
View File
@@ -97,10 +97,15 @@ $lang->testcase->priList[4] = 4;
$lang->testcase->typeList[''] = '';
$lang->testcase->typeList['feature'] = '功能测试';
$lang->testcase->typeList['performance'] = '性能测试';
$lang->testcase->typeList['config'] = '配置相关';
$lang->testcase->typeList['install'] = '安装部署';
$lang->testcase->typeList['security'] = '安全相关';
$lang->testcase->typeList['other'] = '其他';
$lang->testcase->statusList[''] = '';
$lang->testcase->statusList['normal'] = '正常';
$lang->testcase->statusList['blocked'] = 'Blocked';
$lang->testcase->statusList[''] = '';
$lang->testcase->statusList['normal'] = '正常';
$lang->testcase->statusList['blocked'] = '被阻塞';
$lang->testcase->statusList['investigate'] = '研究中';
$lang->testcase->resultList['n/a'] = 'N/A';
$lang->testcase->resultList['pass'] = '通过';