From 8699e2815b34931df8a4fe55e30f295cfebf1487 Mon Sep 17 00:00:00 2001
From: Keigan Ashall <keigan.ashall@gmail.com>
Date: Thu, 17 Nov 2011 16:24:37 -0500
Subject: [PATCH] Issue #502666: Add devel_generate

---
 .DS_Store                     |  Bin 0 -> 6148 bytes
 privatemsg.devel_generate.inc |  244 +++++++++++++++++++++++++++++++++++++++++
 privatemsg.module             |   10 ++
 3 files changed, 254 insertions(+), 0 deletions(-)
 create mode 100644 .DS_Store
 create mode 100644 privatemsg.devel_generate.inc

diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6
GIT binary patch
literal 6148
zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3
zem<@ulZcFPQ@L2!n>{z**<q8>++&mCkOWA81W14cNZ<zv;LbK1Poaz?KmsK2CSc!(
z0ynLxE!0092;Krf2c+FF_Fe*7ECH>lEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ
zLs35+`xjp>T0<F0fCPF1$Cyrb|F7^5{eNG?83~ZUUlGt@xh*qZDeu<Z%US-OSsOPv
j)R!Z4KLME7ReXlK;d!wEw5GODWMKRea10D2@KpjYNUI8I

literal 0
HcmV?d00001

diff --git a/privatemsg.devel_generate.inc b/privatemsg.devel_generate.inc
new file mode 100644
index 0000000..569e0c4
--- /dev/null
+++ b/privatemsg.devel_generate.inc
@@ -0,0 +1,244 @@
+<?php
+
+/**
+ * Form; Integrates with Devel Generate
+ *
+ * @see privatemsg_devel_generate_form_validate()
+ * @see privatemsg_devel_generate_form_submit()
+ */
+function privatemsg_devel_generate_form() {
+  $options = array();
+  for ($i = 1; $i <= 10; $i++) {
+    $options[$i] = $i;
+  }
+  
+  $form['kill_content'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('<strong>Delete all messages</strong> before generating new messages.'),
+    '#default_value' => FALSE,
+  );
+  $form['num_messages'] = array(
+    '#type' => 'textfield',
+    '#title' => t('How many threads would you like to generate?'),
+    '#default_value' => 10,
+    '#size' => 10,
+  );
+  $form['max_thread'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Max thread length?'),
+    '#default_value' => 5,
+    '#size' => 10,
+  );
+  $form['recipients'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Recipients'),
+    '#description' => t('A random number of recipients will be generated for each message.'),
+  );
+  $form['recipients']['min_recipients'] = array(
+    '#type' => 'select',
+    '#title' => t('Minimum number of recipients for each message'),
+    '#default_value' => 1,
+    '#options' => $options,
+  );
+  $form['recipients']['max_recipients'] = array(
+    '#type' => 'select',
+    '#title' => t('Maximum number of recipients for each message'),
+    '#default_value' => 3,
+    '#options' => $options,
+  );
+  
+  $options = array(1 => t('Now'));
+  foreach (array(3600, 86400, 604800, 2592000, 31536000) as $interval) {
+    $options[$interval] = format_interval($interval, 1) . ' ' . t('ago');
+  }
+  $form['time_range'] = array(
+    '#type' => 'select',
+    '#title' => t('How far back in time should the messages be dated?'),
+    '#description' => t('Message creation dates will be distributed randomly from the current time, back to the selected time.'),
+    '#options' => $options,
+    '#default_value' => 604800,
+  );
+  
+  $form['subject_length'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Max word length of subjects'),
+    '#default_value' => 8,
+    '#size' => 10,
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Do it!'),
+  );
+  $form['#redirect'] = FALSE;
+
+  return $form;
+}
+
+/**
+ * Validate; Integrates with Devel Generate
+ *
+ * @see privatemsg_devel_generate_form()
+ * @see privatemsg_devel_generate_form_submit()
+ */
+function privatemsg_devel_generate_form_validate($form_id, &$form_state) {
+  module_load_include('inc', 'devel_generate');
+  $users = devel_get_users();  
+  $max_recipients = $form_state['values']['max_recipients'];
+
+  // minus anonymous and admin
+  if (count($users) - 2 < $max_recipients) {
+    form_set_error($form_state['values']['max_recipients'], t('You only have @count_users users to handle @count_recipients recipients. You must increase the number of users.', array('@count_users' => count($users), '@count_recipients' => $max_recipients)));
+  }
+}
+
+/**
+ * Submit; Integrates with Devel Generate
+ *
+ * @see privatemsg_devel_generate_form()
+ * @see privatemsg_devel_generate_form_validate()
+ */
+function privatemsg_devel_generate_form_submit($form_id, &$form_state) {
+  if (!$form_state['values']['kill_content'] && $form_state['values']['num_messages'] <= 50 && $form_state['values']['max_thread'] <= 10) {
+    privatemsg_devel_generate_messages($form_state);
+  }
+  else {
+    privatemsg_devel_batch_generate_messages($form_state);
+  }
+}
+
+/**
+ * Mass Message Generation
+ */
+function privatemsg_devel_generate_messages($form_state) {
+  if ($form_state['values']['kill_content']) {
+    privatemsg_devel_generate_kill_messages();
+  }
+  
+  // Generate threads.
+  for ($i = 1; $i <= $form_state['values']['num_messages']; $i++) {
+    privatemsg_devel_generate_new_thread($form_state['values']);
+  }
+
+  drupal_set_message(format_plural($form_state['values']['num_messages'], '1 message created.', '@count messages created'));
+}
+
+/**
+ * Single Message Generation
+ */
+function privatemsg_devel_generate_new_thread($values) {
+  module_load_include('inc', 'devel_generate');
+
+  $users = devel_get_users();
+  // unset anonymous (key) and admin (end)
+  unset($users[key($users)]);
+  unset($users[end($users)]);
+  
+  $author = user_load(array('uid' => $users[array_rand($users)]));
+  $subject = devel_create_greeking(rand(1, $values['subject_length']), TRUE);
+  $body = devel_create_content();
+  
+  $timestamp = rand(0, $values['time_range']);
+  $options = array(
+    'author' => $author,
+    'timestamp' => time() - $timestamp,
+  );
+  
+  $num_recipients = range($values['min_recipients'], $values['max_recipients']);
+  $count_recipients = array_rand($num_recipients);
+  $recipients = array();
+  $recipient_uids = array();
+  
+  for ($i = 1; $i <= $count_recipients; $i++) {
+    $recipient_uid = array('uid' => $users[array_rand($users)]);
+
+    // Don't send message to self or duplicate entry
+    while ($author->uid == $recipient_uid) {
+    // while ($author->uid == $recipient_uid || in_array($recipient_uid, $recipient_uids)) {
+      $recipient_uid = array('uid' => $users[array_rand($users)]);
+    }
+    $recipient_uids[] = $recipient_uid;
+  }
+  $recipients = array();
+  foreach ($recipient_uids as $recipient_uid) {
+    $recipients[] = user_load($recipient_uid);
+  }
+
+  $validated = privatemsg_new_thread($recipients, $subject, $body, $options);
+  $thread_id = $validated['message']['thread_id'];
+
+  $num_replies = range(0, $values['max_thread']);
+  $replies = array_rand($num_replies);
+  $reply_timestamp = $options['timestamp'];
+  
+  // Generate messages.    
+  for ($j = 0; $j <= $replies; $j++) {
+    $reply_body = devel_create_content();
+    $reply_author = user_load(array_rand($recipient_uids));
+    $reply_timestamp = rand(0, $reply_timestamp);
+      
+    $reply_options = array(
+      'author' => $reply_author,
+      'timestamp' => time() - $reply_timestamp,
+    );
+    privatemsg_reply($thread_id, $reply_body, $reply_options);
+  }
+  
+}
+
+/**
+ * Handle the privatemsg_devel_generate_form request to kill all of the messages.
+ * This is used by both the batch and non-batch branches of the code.
+ *
+ * @param $num
+ *   array of options obtained from privatemsg_devel_generate_form.
+ */
+function privatemsg_devel_generate_kill_messages() {
+  db_query('DELETE FROM {pm_index}');
+  db_query('DELETE FROM {pm_message}');
+  $i = db_affected_rows();
+
+  drupal_set_message(format_plural($i, 'Deleted one message', 'Deleted @count messages'));
+}
+
+function privatemsg_devel_batch_generate_messages($form_state) {
+  $operations = array();
+
+  // add the kill operation
+  if ($form_state['values']['kill_content']) {
+    $operations[] = array('privatemsg_devel_generate_batch_kill_messages', array());
+  }
+
+  // add the operations to create the nodes
+  for ($num = 0; $num < $form_state['values']['num_messages']; $num ++) {
+    $operations[] = array('privatemsg_devel_generate_batch_new_thread', array($form_state['values']));
+  }
+
+  // start the batch
+  $batch = array(
+    'title' => t('Generating private messages'),
+    'operations' => $operations,
+    'finished' => 'privatemsg_devel_generate_batch_finished',
+    'file' => drupal_get_path('module', 'privatemsg') . '/privatemsg.devel_generate.inc',
+  );
+  batch_set($batch);
+}
+
+function privatemsg_devel_generate_batch_kill_messages(&$context) {
+  privatemsg_devel_generate_kill_messages();
+}
+
+function privatemsg_devel_generate_batch_new_thread($values, &$context) {
+  privatemsg_devel_generate_new_thread($values);
+  $context['results']['num_mids'] ++;
+}
+
+function privatemsg_devel_generate_batch_finished($success, $results, $operations) {
+  if ($success) {
+    $message = t('Created @num_mids messages successfully.', array('@num_mids' => $results['num_mids']));
+  }
+  else {
+    $message = t('Finished with an error.');
+  }
+  drupal_set_message($message);
+}
diff --git a/privatemsg.module b/privatemsg.module
index 92c0bf8..052b738 100644
--- a/privatemsg.module
+++ b/privatemsg.module
@@ -224,6 +224,16 @@ function privatemsg_menu() {
     'type'             => MENU_DEFAULT_LOCAL_TASK,
     'weight'           => -10,
   );
+  if (module_exists('devel_generate')) {
+    $items['admin/generate/privatemsg'] = array(
+      'title' => 'Generate private messages',
+      'description' => 'Generate a given number of private messages. Optionally delete current private messages.',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('privatemsg_devel_generate_form'),
+      'access arguments' => array('administer privatemsg settings'),
+      'file' => 'privatemsg.devel_generate.inc',
+    );
+  }
   $items['messages/undo/action'] = array(
     'title'            => 'Private messages',
     'description'      => 'Undo last thread action',
-- 
1.7.4.4

