diff --git a/trunk/module/bug/lang/zh-cn.php b/trunk/module/bug/lang/zh-cn.php index c204d0ad6c..543da7c6e0 100644 --- a/trunk/module/bug/lang/zh-cn.php +++ b/trunk/module/bug/lang/zh-cn.php @@ -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[''] = ''; diff --git a/trunk/module/convert/control.php b/trunk/module/convert/control.php index 9644f2be09..47086d8145 100644 --- a/trunk/module/convert/control.php +++ b/trunk/module/convert/control.php @@ -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(); } } diff --git a/trunk/module/convert/converter/bugfree.php b/trunk/module/convert/converter/bugfree.php index c05330a011..6afc411880 100644 --- a/trunk/module/convert/converter/bugfree.php +++ b/trunk/module/convert/converter/bugfree.php @@ -1,6 +1,6 @@ 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); } /* յ֮ݡ*/ diff --git a/trunk/module/convert/converter/bugfree1.php b/trunk/module/convert/converter/bugfree1.php new file mode 100644 index 0000000000..b95fc744d8 --- /dev/null +++ b/trunk/module/convert/converter/bugfree1.php @@ -0,0 +1,289 @@ +. + * + * @copyright Copyright 2009-2010 Chunsheng Wang + * @author Chunsheng Wang + * @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); + } +} diff --git a/trunk/module/convert/converter/bugfree2.php b/trunk/module/convert/converter/bugfree2.php new file mode 100644 index 0000000000..2d4a674686 --- /dev/null +++ b/trunk/module/convert/converter/bugfree2.php @@ -0,0 +1,469 @@ +. + * + * @copyright Copyright 2009-2010 Chunsheng Wang + * @author Chunsheng Wang + * @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(); + } + } +} diff --git a/trunk/module/convert/lang/zh-cn.php b/trunk/module/convert/lang/zh-cn.php index baa8342314..a93a177ef3 100644 --- a/trunk/module/convert/lang/zh-cn.php +++ b/trunk/module/convert/lang/zh-cn.php @@ -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 = '附件'; diff --git a/trunk/module/convert/view/checkconfig.html.php b/trunk/module/convert/view/checkconfig.html.php index 4ff268da9c..c1493328c8 100644 --- a/trunk/module/convert/view/checkconfig.html.php +++ b/trunk/module/convert/view/checkconfig.html.php @@ -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); ?> diff --git a/trunk/module/convert/view/convertbugfree.html.php b/trunk/module/convert/view/convertbugfree.html.php index 5d4c0524ac..414ae5fb4b 100644 --- a/trunk/module/convert/view/convertbugfree.html.php +++ b/trunk/module/convert/view/convertbugfree.html.php @@ -23,6 +23,20 @@ ', $info['bugs']);?> + 1):?> + + convert->bugfree->cases;?> + + ', $info['cases']);?> + + + convert->bugfree->results;?> + + ', $info['results']);?> + + + + convert->bugfree->actions;?> diff --git a/trunk/module/convert/view/setbugfree.html.php b/trunk/module/convert/view/setbugfree.html.php index 267f4bbdf0..9dbea70624 100644 --- a/trunk/module/convert/view/setbugfree.html.php +++ b/trunk/module/convert/view/setbugfree.html.php @@ -1,30 +1,30 @@ convert->dbHost;?> - db->host);?> + db->host, "class='text-3'");?> convert->dbPort;?> - db->port);?> + db->port, "class='text-3'");?> convert->dbUser;?> - db->user);?> + db->user, "class='text-3'");?> convert->dbPassword;?> - db->password);?> + db->password, "class='text-3'");?> convert->dbName, $source);?> - + - + convert->installPath, $source);?> - + diff --git a/trunk/module/testcase/lang/zh-cn.php b/trunk/module/testcase/lang/zh-cn.php index 0cefa702b3..e885145d8f 100644 --- a/trunk/module/testcase/lang/zh-cn.php +++ b/trunk/module/testcase/lang/zh-cn.php @@ -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'] = '通过';