PageRenderTime 65ms CodeModel.GetById 23ms RepoModel.GetById 2ms app.codeStats 0ms

/lib/plan/planUpdateTC.php

https://bitbucket.org/pfernandez/testlink1.9.6
PHP | 395 lines | 244 code | 46 blank | 105 comment | 24 complexity | 4bbae84daf4f2942f60394dbefe67052 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, GPL-3.0
  1. <?php
  2. /**
  3. * TestLink Open Source Project - http://testlink.sourceforge.net/
  4. * @version $Id: planUpdateTC.php,v 1.46 2010/07/26 19:00:57 asimon83 Exp $
  5. *
  6. * Author: franciscom
  7. *
  8. * Allows for NON executed test cases linked to a test plan, update of Test Case versions
  9. * following user choices.
  10. * Test Case Execution assignments will be auto(magically) updated.
  11. *
  12. * @internal revisions:
  13. * 20100726 - asimon - fixed bug in processTestPlan(): "All linked Test Case Versions are current"
  14. * was always displayed on bulk update of linked versions
  15. * even when there were newer versions
  16. * 20100628 - asimon - removal of constants from filter control class
  17. * 20160625 - asimon - refactoring for new filter features and BUGID 3516
  18. * 20100624 - asimon - CVS merge (experimental branch to HEAD)
  19. * 20100131 - franciscom - BUGID 3008/3109
  20. * 20100123 - franciscom - BUGID 2652 + missing refactoring for table prefix doUpdate()
  21. * 20091212 - franciscom - added contribution by asimon83 (refactored) - BUGID 2652
  22. * show newest testcase versions when updating all linked testcase versions
  23. *
  24. */
  25. require_once("../../config.inc.php");
  26. require_once("common.php");
  27. require_once("specview.php");
  28. testlinkInitPage($db,false,false,"checkRights");
  29. $tree_mgr = new tree($db);
  30. $tsuite_mgr = new testsuite($db);
  31. $tplan_mgr = new testplan($db);
  32. $tcase_mgr = new testcase($db);
  33. $templateCfg = templateConfiguration();
  34. $args = init_args($tplan_mgr);
  35. $gui = initializeGui($db,$args,$tplan_mgr,$tcase_mgr);
  36. $keywordsFilter = null;
  37. if(is_array($args->keyword_id))
  38. {
  39. $keywordsFilter = new stdClass();
  40. $keywordsFilter->items = $args->keyword_id;
  41. $keywordsFilter->type = $gui->keywordsFilterType->selected;
  42. }
  43. switch ($args->doAction)
  44. {
  45. case "doUpdate":
  46. case "doBulkUpdateToLatest":
  47. $gui->user_feedback = doUpdate($db,$args);
  48. break;
  49. default:
  50. break;
  51. }
  52. $out = null;
  53. $gui->show_details = 0;
  54. $gui->operationType = 'standard';
  55. $gui->hasItems = 0;
  56. switch($args->level)
  57. {
  58. case 'testcase':
  59. $out = processTestCase($db,$args,$keywordsFilter,$tplan_mgr,$tree_mgr);
  60. break;
  61. case 'testsuite':
  62. $out = processTestSuite($db,$args,$keywordsFilter,$tplan_mgr,$tcase_mgr);
  63. break;
  64. case 'testplan':
  65. $itemSet = processTestPlan($db,$args,$keywordsFilter,$tplan_mgr);
  66. $gui->testcases = $itemSet['items'];
  67. $gui->user_feedback = $itemSet['msg'];
  68. $gui->instructions = lang_get('update2latest');
  69. $gui->buttonAction = "doBulkUpdateToLatest";
  70. $gui->operationType = 'bulk';
  71. if( !is_null($gui->testcases) )
  72. {
  73. $gui->hasItems = 1;
  74. $gui->show_details = 1;
  75. }
  76. break;
  77. default:
  78. // show instructions
  79. redirect($_SESSION['basehref'] . "/lib/general/staticPage.php?key=planUpdateTC");
  80. break;
  81. }
  82. if(!is_null($out))
  83. {
  84. $gui->hasItems = $out['num_tc'] > 0 ? 1 : 0;
  85. $gui->items = $out['spec_view'];
  86. }
  87. $smarty = new TLSmarty();
  88. $smarty->assign('gui', $gui);
  89. $smarty->display($templateCfg->template_dir . $templateCfg->default_template);
  90. /*
  91. function: init_args
  92. args :
  93. returns:
  94. */
  95. function init_args(&$tplanMgr)
  96. {
  97. $_REQUEST = strings_stripSlashes($_REQUEST);
  98. $args = new stdClass();
  99. $args->id = isset($_REQUEST['id']) ? $_REQUEST['id'] : null;
  100. $args->level = isset($_REQUEST['level']) ? $_REQUEST['level'] : null;
  101. $args->doAction = isset($_REQUEST['doAction']) ? $_REQUEST['doAction'] : null;
  102. // Maps with key: test case ID value: tcversion_id
  103. $args->fullTestCaseSet = isset($_REQUEST['a_tcid']) ? $_REQUEST['a_tcid'] : null;
  104. $args->checkedTestCaseSet = isset($_REQUEST['achecked_tc']) ? $_REQUEST['achecked_tc'] : null;
  105. $args->newVersionSet = isset($_REQUEST['new_tcversion_for_tcid']) ? $_REQUEST['new_tcversion_for_tcid'] : null;
  106. $args->version_id = isset($_REQUEST['version_id']) ? $_REQUEST['version_id'] : 0;
  107. // BUGID 3516
  108. // Can be a list (string with , (comma) has item separator), that will be trasformed in an array.
  109. // $keywordSet = isset($_REQUEST['keyword_id']) ? $_REQUEST['keyword_id'] : null;
  110. // $args->keyword_id = is_null($keywordSet) ? 0 : explode(',',$keywordSet);
  111. // $args->keywordsFilterType = isset($_REQUEST['keywordsFilterType']) ? $_REQUEST['keywordsFilterType'] : 'OR';
  112. // $args->tplan_id = isset($_REQUEST['tplan_id']) ? intval($_REQUEST['tplan_id']) : 0;
  113. // if($args->tplan_id == 0)
  114. // {
  115. // $args->tplan_id = isset($_SESSION['testplanID']) ? intval($_SESSION['testplanID']) : 0;
  116. // $args->tplan_name = $_SESSION['testplanName'];
  117. // }
  118. // else
  119. // {
  120. // $tpi = $tplanMgr->get_by_id($args->tplan_id);
  121. // $args->tplan_name = $tpi['name'];
  122. // }
  123. $args->tproject_id = $_SESSION['testprojectID'];
  124. $args->tproject_name = $_SESSION['testprojectName'];
  125. // BUGID 3516
  126. // For more information about the data accessed in session here, see the comment
  127. // in the file header of lib/functions/tlTestCaseFilterControl.class.php.
  128. $form_token = isset($_REQUEST['form_token']) ? $_REQUEST['form_token'] : 0;
  129. $mode = 'plan_mode';
  130. $session_data = isset($_SESSION[$mode]) && isset($_SESSION[$mode][$form_token])
  131. ? $_SESSION[$mode][$form_token] : null;
  132. $args->tplan_id = isset($session_data['setting_testplan']) ? $session_data['setting_testplan'] : 0;
  133. if($args->tplan_id == 0) {
  134. $args->tplan_id = isset($_SESSION['testplanID']) ? intval($_SESSION['testplanID']) : 0;
  135. $args->tplan_name = $_SESSION['testplanName'];
  136. } else {
  137. $tpi = $tplanMgr->get_by_id($args->tplan_id);
  138. $args->tplan_name = $tpi['name'];
  139. }
  140. $args->refreshTree = isset($session_data['setting_refresh_tree_on_action']) ?
  141. $session_data['setting_refresh_tree_on_action'] : 0;
  142. $args->keyword_id = 0;
  143. $fk = 'filter_keywords';
  144. if (isset($session_data[$fk])) {
  145. $args->keyword_id = $session_data[$fk];
  146. if (is_array($args->keyword_id) && count($args->keyword_id) == 1) {
  147. $args->keyword_id = $args->keyword_id[0];
  148. }
  149. }
  150. $args->keywordsFilterType = null;
  151. $ft = 'filter_keywords_filter_type';
  152. if (isset($session_data[$ft])) {
  153. $args->keywordsFilterType = $session_data[$ft];
  154. }
  155. return $args;
  156. }
  157. /*
  158. function: doUpdate
  159. args:
  160. returns: message
  161. */
  162. function doUpdate(&$dbObj,&$argsObj)
  163. {
  164. $debugMsg = 'File:' . __FILE__ . ' - Function: ' . __FUNCTION__;
  165. $tables = tlObject::getDBTables(array('testplan_tcversions','executions',
  166. 'cfield_execution_values'));
  167. $msg = "";
  168. if(!is_null($argsObj->checkedTestCaseSet))
  169. {
  170. foreach($argsObj->checkedTestCaseSet as $tcaseID => $tcversionID)
  171. {
  172. $newtcversion=$argsObj->newVersionSet[$tcaseID];
  173. foreach($tables as $table2update)
  174. {
  175. $sql = "/* $debugMsg */ UPDATE $table2update " .
  176. " SET tcversion_id={$newtcversion} " .
  177. " WHERE tcversion_id={$tcversionID} " .
  178. " AND testplan_id={$argsObj->tplan_id}";
  179. $dbObj->exec_query($sql);
  180. }
  181. }
  182. $msg = lang_get("tplan_updated");
  183. }
  184. return $msg;
  185. }
  186. /*
  187. function: initializeGui
  188. args :
  189. returns:
  190. */
  191. function initializeGui(&$dbHandler,$argsObj,&$tplanMgr,&$tcaseMgr)
  192. {
  193. $tcase_cfg = config_get('testcase_cfg');
  194. $gui = new stdClass();
  195. $gui->refreshTree=false;
  196. $gui->instructions='';
  197. $gui->buttonAction="doUpdate";
  198. $gui->testCasePrefix = $tcaseMgr->tproject_mgr->getTestCasePrefix($argsObj->tproject_id);
  199. $gui->testCasePrefix .= $tcase_cfg->glue_character;
  200. $gui->user_feedback = '';
  201. $gui->testPlanName = $argsObj->tplan_name;
  202. $gui->items = null;
  203. $gui->has_tc = 1;
  204. return $gui;
  205. }
  206. /*
  207. function: processTestSuite
  208. args :
  209. returns:
  210. */
  211. function processTestSuite(&$dbHandler,&$argsObj,$keywordsFilter,&$tplanMgr,&$tcaseMgr)
  212. {
  213. $out=keywordFilteredSpecView($dbHandler,$argsObj,$keywordsFilter,$tplanMgr,$tcaseMgr);
  214. return $out;
  215. }
  216. /*
  217. function: doUpdateAllToLatest
  218. args:
  219. returns: message
  220. */
  221. function doUpdateAllToLatest(&$dbObj,$argsObj,&$tplanMgr)
  222. {
  223. $qty=0;
  224. //
  225. // $linkedItems=$tplanMgr->get_linked_tcversions($argsObj->tplan_id);
  226. $linkedItems = $tplanMgr->get_linked_items_id($argsObj->tplan_id);
  227. if( is_null($linkedItems) )
  228. {
  229. return lang_get('no_testcase_available');
  230. }
  231. $items=$tplanMgr->get_linked_and_newest_tcversions($argsObj->tplan_id);
  232. if( !is_null($items) )
  233. {
  234. foreach($items as $key => $value)
  235. {
  236. if( $value['newest_tcversion_id'] != $value['tcversion_id'] )
  237. {
  238. $newtcversion=$value['newest_tcversion_id'];
  239. $tcversionID=$value['tcversion_id'];
  240. $qty++;
  241. // Update link to testplan
  242. $sql = "UPDATE testplan_tcversions " .
  243. " SET tcversion_id={$newtcversion} " .
  244. " WHERE tcversion_id={$tcversionID} " .
  245. " AND testplan_id={$argsObj->tplan_id}";
  246. $dbObj->exec_query($sql);
  247. // Update link in executions
  248. $sql = "UPDATE executions " .
  249. " SET tcversion_id={$newtcversion} " .
  250. " WHERE tcversion_id={$tcversionID}" .
  251. " AND testplan_id={$argsObj->tplan_id}";
  252. $dbObj->exec_query($sql);
  253. // Update link in cfields values
  254. $sql = "UPDATE cfield_execution_values " .
  255. " SET tcversion_id={$newtcversion} " .
  256. " WHERE tcversion_id={$tcversionID}" .
  257. " AND testplan_id={$argsObj->tplan_id}";
  258. $dbObj->exec_query($sql);
  259. }
  260. }
  261. }
  262. if( $qty == 0 )
  263. {
  264. $msg=lang_get('all_versions_where_latest');
  265. }
  266. else
  267. {
  268. $msg=sprintf(lang_get('num_of_updated'),$qty);
  269. }
  270. return $msg;
  271. }
  272. /**
  273. *
  274. *
  275. */
  276. function processTestCase(&$dbHandler,&$argsObj,$keywordsFilter,&$tplanMgr,&$treeMgr)
  277. {
  278. $my_path = $treeMgr->get_path($argsObj->id);
  279. $idx_ts = count($my_path)-1;
  280. $tsuite_data = $my_path[$idx_ts-1];
  281. $filters = array('tcase_id' => $argsObj->id);
  282. $opt = array('write_button_only_if_linked' => 1, 'prune_unlinked_tcversions' => 1);
  283. $dummy_items = $tplanMgr->get_linked_tcversions($argsObj->tplan_id,$filters);
  284. // 20100131 - franciscom
  285. // adapt data structure to gen_spec_view() desires
  286. $linked_items[key($dummy_items)][0] = current($dummy_items);
  287. $filters = array('keywords' => $argsObj->keyword_id, 'testcases' => $argsObj->id);
  288. $out = gen_spec_view($dbHandler,'testplan',$argsObj->tplan_id,$tsuite_data['id'],$tsuite_data['name'],
  289. $linked_items,null,$filters,$opt);
  290. return $out;
  291. }
  292. /**
  293. *
  294. *
  295. * @internal revisions:
  296. * 20100726 - asimon - fixed bug: "All linked Test Case Versions are current"
  297. * was always displayed on bulk update of linked versions
  298. * even when there were newer versions of linked TCs
  299. */
  300. function processTestPlan(&$dbHandler,&$argsObj,$keywordsFilter,&$tplanMgr)
  301. {
  302. $set2update = array('items' => null, 'msg' => '');
  303. $filters = array('keywords' => $argsObj->keyword_id);
  304. $linked_tcases = $tplanMgr->get_linked_tcversions($argsObj->tplan_id,$filters);
  305. $set2update['msg'] = lang_get('testplan_seems_empty');
  306. if( count($linked_tcases) > 0 )
  307. {
  308. $testCaseSet = array_keys($linked_tcases);
  309. $set2update['items'] = $tplanMgr->get_linked_and_newest_tcversions($argsObj->tplan_id,$testCaseSet);
  310. // 20100726 - asimon
  311. $set2update['msg'] = '';
  312. if( !is_null($set2update['items']) && count($set2update['items']) > 0 )
  313. {
  314. $itemSet=array_keys($set2update['items']);
  315. $path_info=$tplanMgr->tree_manager->get_full_path_verbose($itemSet);
  316. foreach($set2update['items'] as $tcase_id => $value)
  317. {
  318. $path=$path_info[$tcase_id];
  319. unset($path[0]);
  320. $path[]='';
  321. $set2update['items'][$tcase_id]['path']=implode(' / ',$path);
  322. }
  323. } else {
  324. // 20100726 - asimon
  325. $set2update['msg'] = lang_get('no_newest_version_of_linked_tcversions');
  326. }
  327. }
  328. return $set2update;
  329. }
  330. function checkRights(&$db,&$user)
  331. {
  332. return $user->hasRight($db,'testplan_planning');
  333. }
  334. ?>