devel_generate.drush.inc 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <?php
  2. /**
  3. * @file
  4. * Generate content, taxonomy, menu, and users via drush framework.
  5. */
  6. /**
  7. * Implementation of hook_drush_command().
  8. */
  9. function devel_generate_drush_command() {
  10. $items['generate-users'] = array(
  11. 'callback' => 'drush_devel_generate_users',
  12. 'description' => 'Create users.',
  13. 'arguments' => array(
  14. 'number_users' => 'Number of users to generate.',
  15. ),
  16. 'options' => array(
  17. 'kill' => 'Delete all users before generating new ones.',
  18. 'roles' => 'A comma delimited list of role IDs which should be granted to the new users. No need to specify authenticated user role.',
  19. 'pass' => 'Specify a password to be set for all generated users.',
  20. ),
  21. 'aliases' => array('genu'),
  22. );
  23. $items['generate-terms'] = array(
  24. 'callback' => 'drush_devel_generate_terms',
  25. 'description' => 'Create terms in specified vocabulary.',
  26. 'arguments' => array(
  27. 'machine_name' => 'Vocabulary machine name into which new terms will be inserted.',
  28. 'number_terms' => 'Number of terms to insert. Defaults to 10.',
  29. ),
  30. 'options' => array(
  31. 'kill' => 'Delete all terms in specified vocabulary before generating.',
  32. 'feedback' => 'An integer representing interval for insertion rate logging. Defaults to 1000',
  33. ),
  34. 'aliases' => array('gent'),
  35. );
  36. $items['generate-vocabs'] = array(
  37. 'callback' => 'drush_devel_generate_vocabs',
  38. 'description' => 'Create vocabularies.',
  39. 'arguments' => array(
  40. 'num_vocabs' => 'Number of vocabularies to create. Defaults to 1.',
  41. ),
  42. 'options' => array(
  43. 'kill' => 'Delete all vocabularies before generating.',
  44. ),
  45. 'aliases' => array('genv'),
  46. );
  47. $items['generate-content'] = array(
  48. 'callback' => 'drush_devel_generate_content',
  49. 'description' => 'Create content.',
  50. 'drupal dependencies' => array('devel_generate'),
  51. 'arguments' => array(
  52. 'number_nodes' => 'Number of nodes to generate.',
  53. 'maximum_comments' => 'Maximum number of comments to generate.',
  54. ),
  55. 'options' => array(
  56. 'kill' => 'Delete all content before generating new content.',
  57. 'types' => 'A comma delimited list of content types to create. Defaults to page,article.',
  58. 'feedback' => 'An integer representing interval for insertion rate logging. Defaults to 1000',
  59. 'skip-fields' => 'A comma delimited list of fields to omit when generating random values',
  60. 'languages' => 'A comma-separated list of language codes',
  61. ),
  62. 'aliases' => array('genc'),
  63. );
  64. $items['generate-menus'] = array(
  65. 'callback' => 'drush_devel_generate_menus',
  66. 'description' => 'Create menus and menu items.',
  67. 'drupal dependencies' => array('devel_generate'), // Remove these once devel.module is moved down a directory. http://drupal.org/node/925246
  68. 'arguments' => array(
  69. 'number_menus' => 'Number of menus to generate. Defaults to 2.',
  70. 'number_links' => 'Number of links to generate. Defaults to 50.',
  71. 'max_depth' => 'Max link depth. Defaults to 3',
  72. 'max_width' => 'Max width of first level of links. Defaults to 8.',
  73. ),
  74. 'options' => array(
  75. 'kill' => 'Delete all previously generated menus and links before generating new menus and links.',
  76. ),
  77. 'aliases' => array('genm'),
  78. );
  79. return $items;
  80. }
  81. /**
  82. * Command callback. Generate a number of users.
  83. */
  84. function drush_devel_generate_users($num_users = NULL) {
  85. if (drush_generate_is_number($num_users) == FALSE) {
  86. return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', t('Invalid number of users.'));
  87. }
  88. drush_generate_include_devel();
  89. $roles = drush_get_option('roles') ? explode(',', drush_get_option('roles')) : array();
  90. $pass = drush_get_option('pass', NULL);
  91. devel_create_users($num_users, drush_get_option('kill'), 0, $roles, $pass);
  92. drush_log(t('Generated @number users.', array('@number' => $num_users)), 'success');
  93. }
  94. /**
  95. * Command callback. Generate a number of terms in given vocabs.
  96. */
  97. function drush_devel_generate_terms($vname = NULL, $num_terms = 10) {
  98. // Try to convert machine name to a vocab ID
  99. if (!$vocab = taxonomy_vocabulary_machine_name_load($vname)) {
  100. return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', dt('Invalid vocabulary name: !name', array('!name' => $vname)));
  101. }
  102. if (drush_generate_is_number($num_terms) == FALSE) {
  103. return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', dt('Invalid number of terms: !num', array('!num' => $num_terms)));
  104. }
  105. drush_generate_include_devel();
  106. if (drush_get_option('kill')) {
  107. devel_generate_delete_vocabulary_terms($vocab->vid);
  108. drush_log(dt('Deleted existing terms.'), 'success');
  109. }
  110. $new_terms = devel_generate_terms($num_terms, array($vocab->vid => $vocab), '12');
  111. if (!empty($new_terms)) {
  112. drush_log(dt("Created the following new terms:\n!terms", array('!terms' => implode("\n", $new_terms))), 'success');
  113. }
  114. }
  115. /**
  116. * Command callback. Generate a number of vocabularies.
  117. */
  118. function drush_devel_generate_vocabs($num_vocab = 1) {
  119. if (drush_generate_is_number($num_vocab) == FALSE) {
  120. return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', dt('Invalid number of vocabularies: !num.', array('!num' => $num_vocab)));
  121. }
  122. drush_generate_include_devel();
  123. if (drush_get_option('kill')) {
  124. devel_generate_delete_vocabularies();
  125. drush_log(dt('Deleted existing vocabularies.'), 'success');
  126. }
  127. $new_vocs = devel_generate_vocabs($num_vocab, '12');
  128. if (!empty($new_vocs)) {
  129. drush_log(dt("Created the following new vocabularies:\n!vocs", array('!vocs' => implode("\n", $new_vocs))), 'success');
  130. }
  131. }
  132. /**
  133. * Command callback. Generate a number of nodes and comments.
  134. */
  135. function drush_devel_generate_content($num_nodes = NULL, $max_comments = NULL) {
  136. if (drush_generate_is_number($num_nodes) == FALSE) {
  137. return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', dt('Invalid number of nodes'));
  138. }
  139. if (!empty($max_comments) && drush_generate_is_number($max_comments) == FALSE) {
  140. return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', dt('Invalid number of comments.'));
  141. }
  142. $add_language = drush_get_option('languages');
  143. if (!empty($add_language)) {
  144. $add_language = explode(',', str_replace(' ', '', $add_language));
  145. // Intersect with the enabled languages to make sure the language args
  146. // passed are actually enabled.
  147. $values['values']['add_language'] = array_intersect($add_language, array_keys(locale_language_list()));
  148. }
  149. // Load user 1; is needed for creating *published* comments.
  150. if ($max_comments) {
  151. global $user;
  152. $user_one = user_load(1);
  153. $user = $user_one;
  154. drupal_save_session(FALSE);
  155. }
  156. $values['values']['kill_content'] = drush_get_option('kill');
  157. $values['values']['title_length'] = 6;
  158. $values['values']['num_nodes'] = $num_nodes;
  159. $values['values']['max_comments'] = $max_comments;
  160. $values['values']['node_types'] = drupal_map_assoc(explode(',', drush_get_option('types', 'page,article')));
  161. $node_types = array_filter($values['values']['node_types']);
  162. if (!empty($values['values']['kill_content']) && empty($node_types)) {
  163. return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', dt('Please provide content type (--types) in which you want to delete the content.'));
  164. }
  165. drush_generate_include_devel();
  166. devel_generate_content($values);
  167. drush_log(t('Generated @num_nodes nodes, @max_comments comments (or less) per node.', array('@num_nodes' => (int)$num_nodes, '@max_comments' => (int)$max_comments)), 'success');
  168. }
  169. /**
  170. * Command callback. Generate a number of menus and menu links.
  171. */
  172. function drush_devel_generate_menus($number_menus = 2, $number_links = 50, $max_depth = 3, $max_width = 8) {
  173. if (drush_generate_is_number($number_menus) == FALSE) {
  174. return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', dt('Invalid number of menus'));
  175. }
  176. if (drush_generate_is_number($number_links) == FALSE) {
  177. return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', dt('Invalid number of links'));
  178. }
  179. if (drush_generate_is_number($max_depth) == FALSE || $max_depth > 9 || $max_depth < 1) {
  180. return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', dt('Invalid maximum link depth. Use a value between 1 and 9'));
  181. }
  182. if (drush_generate_is_number($max_width) == FALSE || $max_width < 1) {
  183. return drush_set_error('DEVEL_GENERATE_INVALID_INPUT', dt('Invalid maximum menu width. Use a positive numeric value.'));
  184. }
  185. global $user;
  186. $user_one = user_load(1);
  187. $user = $user_one;
  188. drupal_save_session(FALSE);
  189. drush_generate_include_devel();
  190. // Delete custom menus.
  191. if (drush_get_option('kill')) {
  192. devel_generate_delete_menus();
  193. drush_log(dt('Deleted existing menus and links.'), 'success');
  194. }
  195. // Generate new menus.
  196. $new_menus = devel_generate_menus($number_menus, '12');
  197. if (!empty($new_menus)) {
  198. drush_log(dt("Created the following new menus:\n!menus", array('!menus' => implode("\n", $new_menus))), 'success');
  199. }
  200. // Generate new menu links.
  201. $link_types = drupal_map_assoc(array('node', 'front', 'external'));
  202. $new_links = devel_generate_links($number_links, $new_menus, '12', $link_types, $max_depth, $max_width);
  203. drush_log(dt('Created !count new menu links.', array('!count' => count($new_links))), 'success');
  204. }
  205. //////////////////////////////////////////////////////////////////////////////
  206. // Helper functions
  207. // Verify if param is a number.
  208. function drush_generate_is_number($number) {
  209. if ($number == NULL) return FALSE;
  210. if (!is_numeric($number)) return FALSE;
  211. return TRUE;
  212. }
  213. // Include devel_generate.inc.
  214. function drush_generate_include_devel() {
  215. $path = drupal_get_path('module', 'devel_generate');
  216. require_once($path .'/devel_generate.inc');
  217. }