Merge remote-tracking branch 'rajgo94/mailingui-new' into master-abtest
authorTim Otten <totten@civicrm.org>
Wed, 29 Oct 2014 00:09:15 +0000 (17:09 -0700)
committerTim Otten <totten@civicrm.org>
Wed, 29 Oct 2014 00:09:15 +0000 (17:09 -0700)
Conflicts:
CRM/Mailing/Event/BAO/Delivered.php
CRM/Mailing/Info.php
api/v3/Mailing.php
api/v3/MailingGroup.php
js/angular-crmCaseType.js
tests/phpunit/api/v3/MailingTest.php

1  2 
CRM/Mailing/BAO/Mailing.php
CRM/Mailing/Info.php
api/v3/Mailing.php
api/v3/MailingGroup.php

Simple merge
index 68134697685f2eae8649ef7d1f3f9098e2db0ae4,681b79de41c041297a4108f45c65f5432c52c000..7eb682851f02c93f2e32f1b7b5ee95ac2ab38c59
   */
  class CRM_Mailing_Info extends CRM_Core_Component_Info {
  
 -      // docs inherited from interface
 -      protected $keyword = 'mailing';
 -
 -
 -      // docs inherited from interface
 -      /**
 -       * @return array
 -       */
 -      public function getInfo() {
 -              return array(
 -                      'name' => 'CiviMail',
 -                      'translatedName' => ts('CiviMail'),
 -                      'title' => 'CiviCRM Mailing Engine',
 -                      'search' => 1,
 -                      'showActivitiesInCore' => 1,
 -              );
 -      }
 -
 -      public function getAngularModules() {
 -              $result = array();
 -              $result['crmMailing'] = array(
 -                      'ext' => 'civicrm',
 -                      'js' => array('js/angular-Mailing.js' , 'js/angularsanitize.js' , 'packages/ckeditor/ckeditor.js'),
 -              );
 -              $session = CRM_Core_Session::singleton();
 -              $contactID = $session->get('userID');
 -              $civiMails = civicrm_api3('Mailing', 'get', array());
 -              $campNames = civicrm_api3('Campaign', 'get', array());
 -              $mailStatus = civicrm_api3('MailingJob', 'get', array());
 -              $groupNames = civicrm_api3('Group', 'get', array());
 -              $headerfooterList = civicrm_api3('MailingComponent', 'get', array());
 -              $emailAdd = civicrm_api3('Email', 'get', array(
 -                      'sequential' => 1,
 -                      'return' => "email",
 -                      'contact_id' => $contactID,
 -              ));
 -              $mesTemplate = civicrm_api3('MessageTemplate', 'get', array(  'sequential' => 1,
 -                      'return' => array("msg_html", "id", "msg_title", "msg_subject"),
 -                      'workflow_id' => array('IS NULL' => ""),
 -              ));
 -              $mailGrp = civicrm_api3('MailingGroup','get', array());
 -              $mailTokens = civicrm_api3('Mailing', 'get_token', array( 'usage' => 'Mailing'));
 +  // docs inherited from interface
 +  protected $keyword = 'mailing';
 +
 +
 +  // docs inherited from interface
 +  /**
 +   * @return array
 +   */
 +  public function getInfo() {
 +    return array(
 +      'name' => 'CiviMail',
 +      'translatedName' => ts('CiviMail'),
 +      'title' => 'CiviCRM Mailing Engine',
 +      'search' => 1,
 +      'showActivitiesInCore' => 1,
 +    );
 +  }
 +
 +  public function getAngularModules() {
 +    $result = array();
++    $result['crmMailing'] = array(
++      'ext' => 'civicrm',
++      'js' => array('js/angular-Mailing.js' , 'js/angularsanitize.js' , 'packages/ckeditor/ckeditor.js'),
++    );
 +    $result['crmMailingAB'] = array(
 +      'ext' => 'civicrm',
 +      'js' => array(
 +        'js/angular-crmMailingAB.js',
 +        'js/angular-crmMailingAB-ReportCtrl.js',
 +        'js/d3.min.js',
 +        'js/angular-sanitize.js',
 +        'packages/ckeditor/ckeditor.js',
 +      ),
 +      'css' => array('css/angular-crmMailingAB.css'),
 +    );
 +
++    $session = CRM_Core_Session::singleton();
++    $contactID = $session->get('userID');
 +    $civiMails = civicrm_api3('Mailing', 'get', array());
 +    $campNames = civicrm_api3('Campaign', 'get', array());
 +    $mailingabNames = civicrm_api3('MailingAB','get',array());
 +    $mailStatus = civicrm_api3('MailingJob', 'get', array());
 +    $groupNames = civicrm_api3('Group', 'get', array());
 +    $headerfooterList = civicrm_api3('MailingComponent', 'get', array());
-     $emailAdd = civicrm_api3('Email', 'get', array());
-     $mesTemplate = civicrm_api3('MessageTemplate', 'get', array(
++
++    // FIXME: The following two items differ between GSOC CiviMail and ABTest branches
++    if (FALSE) {
++      // AB Test
++      $emailAdd = civicrm_api3('Email', 'get', array());
++      $mesTemplate = civicrm_api3('MessageTemplate', 'get', array(
++        'sequential' => 1,
++        'return' => array("msg_html", "id", "msg_title","msg_subject"),
++        'id' => array('>' => 58),
++      ));
++    } else {
++      // CiviMail UI
++      $emailAdd = civicrm_api3('Email', 'get', array(
++        'sequential' => 1,
++        'return' => "email",
++        'contact_id' => $contactID,
++      ));
++      $mesTemplate = civicrm_api3('MessageTemplate', 'get', array(  'sequential' => 1,
++        'return' => array("msg_html", "id", "msg_title", "msg_subject"),
++        'workflow_id' => array('IS NULL' => ""),
++      ));
++    }
++    $mailGrp = civicrm_api3('MailingGroup','get', array());
++    $mailTokens = civicrm_api3('Mailing', 'get_token', array( 'usage' => 'Mailing'));
+     $fromAddress = civicrm_api3('OptionGroup', 'get', array(
        'sequential' => 1,
-       'return' => array("msg_html", "id", "msg_title","msg_subject"),
-       'id' => array('>' => 58),
+       'name' => "from_email_address",
+       'api.OptionValue.get' => array(),
      ));
-     $mailTokens = civicrm_api3('Mailing', 'get_token', array( 'usage' => 'Mailing'));
-     $mailGrp = civicrm_api3('MailingGroup','get', array());
 +    CRM_Core_Resources::singleton()->addSetting(array(
 +      'crmMailing' => array(
 +        'mailingabNames'=>array_values($mailingabNames['values']),
 +        'civiMails' => array_values($civiMails['values']),
 +        'campNames' => array_values($campNames['values']),
 +        'mailStatus' => array_values($mailStatus['values']),
 +        'groupNames' => array_values($groupNames['values']),
 +        'headerfooterList' => array_values($headerfooterList['values']),
 +        'mesTemplate' => array_values($mesTemplate['values']),
 +        'emailAdd' => array_values($emailAdd['values']),
++        'mailGrp' => array_values($mailGrp['values']),
 +        'mailTokens' => array_values($mailTokens),
-         'mailGrp' => array_values($mailGrp['values'])
++        'contactid' => $contactID,
++        'fromAddress' => array_values($fromAddress['values'][0]['api.OptionValue.get']['values']),
 +      ),
 +    ));
  
 -
 -              CRM_Core_Resources::singleton()->addSetting(array(
 -                      'crmMailing' => array(
 -                              'civiMails' => array_values($civiMails['values']),
 -                              'campNames' => array_values($campNames['values']),
 -                              'mailStatus' => array_values($mailStatus['values']),
 -                              'groupNames' => array_values($groupNames['values']),
 -                              'headerfooterList' => array_values($headerfooterList['values']),
 -                              'mesTemplate' => array_values($mesTemplate['values']),
 -                              'emailAdd' => array_values($emailAdd['values']),
 -                              'mailGrp' => array_values($mailGrp['values']),
 -                              'mailTokens' => array_values($mailTokens),
 -                              'contactid' => $contactID,
 -        'fromAddress' => array_values($fromAddress['values'][0]['api.OptionValue.get']['values'])
 -                      ),
 -              ));
 -              return $result;
 -      }
 -
 -      /**
 -       * @return bool
 -       */
 -      static function workflowEnabled() {
 -              $config = CRM_Core_Config::singleton();
 -
 -              // early exit, since not true for most
 -              if (!$config->userSystem->is_drupal ||
 -                      !function_exists('module_exists')
 -              ) {
 -                      return FALSE;
 -              }
 -
 -              if (!module_exists('rules')) {
 -                      return FALSE;
 -              }
 -
 -              $enableWorkflow = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::MAILING_PREFERENCES_NAME,
 -                      'civimail_workflow',
 -                      NULL,
 -                      FALSE
 -              );
 -
 -              return ($enableWorkflow &&
 -                      $config->userSystem->is_drupal
 -              ) ? TRUE : FALSE;
 -      }
 -
 -      // docs inherited from interface
 -      /**
 -       * @param bool $getAllUnconditionally
 -       *
 -       * @return array
 -       */
 -      public function getPermissions($getAllUnconditionally = FALSE) {
 -              $permissions = array(
 -                      'access CiviMail',
 -                      'access CiviMail subscribe/unsubscribe pages',
 -                      'delete in CiviMail',
 -                      'view public CiviMail content',
 -              );
 -
 -              if (self::workflowEnabled() || $getAllUnconditionally) {
 -                      $permissions[] = 'create mailings';
 -                      $permissions[] = 'schedule mailings';
 -                      $permissions[] = 'approve mailings';
 -              }
 -
 -              return $permissions;
 -      }
 -
 -
 -      // docs inherited from interface
 -      /**
 -       * @return null
 -       */
 -      public function getUserDashboardElement() {
 -              // no dashboard element for this component
 -              return NULL;
 -      }
 -
 -      /**
 -       * @return null
 -       */
 -      public function getUserDashboardObject() {
 -              // no dashboard element for this component
 -              return NULL;
 -      }
 -
 -      // docs inherited from interface
 -      /**
 -       * @return array
 -       */
 -      public function registerTab() {
 -              return array(
 -                      'title' => ts('Mailings'),
 -                      'id' => 'mailing',
 -                      'url' => 'mailing',
 -                      'weight' => 45,
 -              );
 -      }
 -
 -      // docs inherited from interface
 -      /**
 -       * @return array
 -       */
 -      public function registerAdvancedSearchPane() {
 -              return array('title' => ts('Mailings'),
 -                      'weight' => 20,
 -              );
 -      }
 -
 -      // docs inherited from interface
 -      /**
 -       * @return null
 -       */
 -      public function getActivityTypes() {
 -              return NULL;
 -      }
 -
 -      // add shortcut to Create New
 -      /**
 -       * @param $shortCuts
 -       */
 -      public function creatNewShortcut(&$shortCuts) {}
 +    return $result;
 +  }
 +
 +  /**
 +   * @return bool
 +   */
 +  static function workflowEnabled() {
 +    $config = CRM_Core_Config::singleton();
 +
 +    // early exit, since not true for most
 +    if (!$config->userSystem->is_drupal ||
 +      !function_exists('module_exists')
 +    ) {
 +      return FALSE;
 +    }
 +
 +    if (!module_exists('rules')) {
 +      return FALSE;
 +    }
 +
 +    $enableWorkflow = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::MAILING_PREFERENCES_NAME,
 +      'civimail_workflow',
 +      NULL,
 +      FALSE
 +    );
 +
 +    return ($enableWorkflow &&
 +      $config->userSystem->is_drupal
 +    ) ? TRUE : FALSE;
 +  }
 +
 +  // docs inherited from interface
 +  /**
 +   * @param bool $getAllUnconditionally
 +   *
 +   * @return array
 +   */
 +  public function getPermissions($getAllUnconditionally = FALSE) {
 +    $permissions = array(
 +      'access CiviMail',
 +      'access CiviMail subscribe/unsubscribe pages',
 +      'delete in CiviMail',
 +      'view public CiviMail content',
 +    );
 +
 +    if (self::workflowEnabled() || $getAllUnconditionally) {
 +      $permissions[] = 'create mailings';
 +      $permissions[] = 'schedule mailings';
 +      $permissions[] = 'approve mailings';
 +    }
 +
 +    return $permissions;
 +  }
 +
 +
 +  // docs inherited from interface
 +  /**
 +   * @return null
 +   */
 +  public function getUserDashboardElement() {
 +    // no dashboard element for this component
 +    return NULL;
 +  }
 +
 +  /**
 +   * @return null
 +   */
 +  public function getUserDashboardObject() {
 +    // no dashboard element for this component
 +    return NULL;
 +  }
 +
 +  // docs inherited from interface
 +  /**
 +   * @return array
 +   */
 +  public function registerTab() {
 +    return array(
 +      'title' => ts('Mailings'),
 +      'id' => 'mailing',
 +      'url' => 'mailing',
 +      'weight' => 45,
 +    );
 +  }
 +
 +  // docs inherited from interface
 +  /**
 +   * @return array
 +   */
 +  public function registerAdvancedSearchPane() {
 +    return array('title' => ts('Mailings'),
 +      'weight' => 20,
 +    );
 +  }
 +
 +  // docs inherited from interface
 +  /**
 +   * @return null
 +   */
 +  public function getActivityTypes() {
 +    return NULL;
 +  }
 +
 +  // add shortcut to Create New
 +  /**
 +   * @param $shortCuts
 +   */
 +  public function creatNewShortcut(&$shortCuts) {}
  }
  
index adbd365f9858271d6d1a4ddf1614967594ffc380,261e45f9e5c2d153cad4aa1bd44a977f9d2ad6b8..b653d154a404b7361df595ecbeb8caef890b2e3f
mode 100755,100644..100755
@@@ -142,17 -163,9 +168,17 @@@ function _civicrm_api3_mailing_event_bo
   * @return array
   */
  function civicrm_api3_mailing_event_confirm($params) {
-   return civicrm_api('mailing_event_confirm', 'create', $params);
+       return civicrm_api('mailing_event_confirm', 'create', $params);
  }
  
 +/**
 + * @deprecated api notice
 + * @return array of deprecated actions
 + */
 +function _civicrm_api3_mailing_deprecation() {
 +  return array('event_confirm' => 'Mailing api "event_confirm" action is deprecated. Use the mailing_event_confirm api instead.');
 +}
 +
  /**
   * Handle a reply event
   *
@@@ -274,229 -279,133 +300,205 @@@ function civicrm_api3_mailing_event_cli
   */
  function civicrm_api3_mailing_event_open($params) {
  
-   civicrm_api3_verify_mandatory($params,
-     'CRM_Mailing_Event_DAO_Opened',
-     array('event_queue_id'),
-     FALSE
-   );
+       civicrm_api3_verify_mandatory($params,
+               'CRM_Mailing_Event_DAO_Opened',
+               array('event_queue_id'),
+               FALSE
+       );
  
-   $queue = $params['event_queue_id'];
-   $success = CRM_Mailing_Event_BAO_Opened::open($queue);
+       $queue = $params['event_queue_id'];
+       $success = CRM_Mailing_Event_BAO_Opened::open($queue);
  
-   if (!$success) {
-     return civicrm_api3_create_error('mailing open event failed');
-   }
+       if (!$success) {
+               return civicrm_api3_create_error('mailing open event failed');
+       }
  
-   return civicrm_api3_create_success($params);
+       return civicrm_api3_create_success($params);
  }
  
-   $details = CRM_Utils_Token::getTokenDetails($mailingParams, $returnProperties, TRUE, TRUE, NULL, $mailing->getFlattenedToken());
 +function civicrm_api3_mailing_preview($params) {
 +  civicrm_api3_verify_mandatory($params,
 +    'CRM_Mailing_DAO_Mailing',
 +    array('id'),
 +    FALSE
 +  );
 +
 +  $fromEmail = NULL;
 +  if (!empty($params['from_email'])) {
 +    $fromEmail = $params['from_email'];
 +  }
 +
 +  $session = CRM_Core_Session::singleton();
 +  $mailing = new CRM_Mailing_BAO_Mailing();
 +  $mailing->id = $params['id'];
 +  $mailing->find(TRUE);
 +
 +  CRM_Mailing_BAO_Mailing::tokenReplace($mailing);
 +
 +  // get and format attachments
 +  $attachments = CRM_Core_BAO_File::getEntityFile('civicrm_mailing', $mailing->id);
 +
 +  $returnProperties = $mailing->getReturnProperties();
 +  $contactID = CRM_Utils_Array::value('contact_id', $params);
 +  if (!$contactID) {
 +    $contactID = $session->get('userID');
 +  }
 +  $mailingParams = array('contact_id' => $contactID);
 +
- function civicrm_api3_mailing_get_token($params) {
-   if (!array_key_exists("usage", $params)) {
-     throw new API_Exception('Mandatory keys missing from params array: entity');
-   }
-   $tokens = CRM_Core_SelectValues::contactTokens();
-   switch ($params['usage']) {
-     case 'Mailing' :
-       $tokens = array_merge(CRM_Core_SelectValues::mailingTokens(), $tokens);
-       break;
-     case 'ScheduleEventReminder' :
-       $tokens = array_merge(CRM_Core_SelectValues::activityTokens(), $tokens);
-       $tokens = array_merge(CRM_Core_SelectValues::eventTokens(), $tokens);
-       $tokens = array_merge(CRM_Core_SelectValues::membershipTokens(), $tokens);
-       break;
-     case 'ManageEventScheduleReminder' :
-       $tokens = array_merge(CRM_Core_SelectValues::eventTokens(), $tokens);
-       break;
-   }
-   return CRM_Utils_Token::formatTokensForDisplay($tokens);
- }
++  $details = CRM_Utils_Token::getTokenDetails($mailingParams, $returnProperties, TRUE, TRUE, NULL, $mailing->getFlattenedTokens());
 +
 +  $mime = &$mailing->compose(NULL, NULL, NULL, $session->get('userID'), $fromEmail, $fromEmail,
 +    TRUE, $details[0][$contactID], $attachments
 +  );
 +
 +  return civicrm_api3_create_success(array('subject' => $mime->_headers['Subject'], 'html' => $mime->getHTMLBody(), 'text' => $mime->getTXTBody()));
 +}
 +
 +function civicrm_api3_mailing_send_test($params) {
 +  if (!array_key_exists('test_group', $params) && !array_key_exists('test_email', $params)) {
 +    throw new API_Exception("Mandatory key(s) missing from params array: test_group and/or test_email field are required" );
 +  }
 +  civicrm_api3_verify_mandatory($params,
 +    'CRM_Mailing_DAO_MailingJob',
 +    array('mailing_id'),
 +    FALSE
 +  );
 +
 +  $testEmailParams = _civicrm_api3_generic_replace_base_params($params);
 +  $testEmailParams['is_test'] = 1;
 +  $job = civicrm_api3('MailingJob', 'create', $testEmailParams);
 +  $testEmailParams['job_id'] = $job['id'];
 +  $testEmailParams['emails'] = explode(',', $testEmailParams['test_email']);
 +  if (!empty($params['test_email'])) {
 +    $query = "
 +SELECT     e.id, e.contact_id, e.email
 +FROM       civicrm_email e
 +INNER JOIN civicrm_contact c ON e.contact_id = c.id
 +WHERE      e.email IN ('" . implode("','", $testEmailParams['emails']) . "')
 +AND        e.on_hold = 0
 +AND        c.is_opt_out = 0
 +AND        c.do_not_email = 0
 +AND        c.is_deceased = 0
 +GROUP BY   e.id
 +ORDER BY   e.is_bulkmail DESC, e.is_primary DESC
 +";
 +    $dao = CRM_Core_DAO::executeQuery($query);
 +    $emailDetail = array();
 +    // fetch contact_id and email id for all existing emails
 +    while ($dao->fetch()) {
 +      $emailDetail[$dao->email] = array(
 +        'contact_id' => $dao->contact_id,
 +        'email_id' => $dao->id,
 +      );
 +    }
 +    $dao->free();
 +    foreach ($testEmailParams['emails'] as $key => $email) {
 +      $email = trim($email);
 +      $contactId = $emailId = NULL;
 +      if (array_key_exists($email, $emailDetail)) {
 +        $emailId = $emailDetail[$email]['email_id'];
 +        $contactId = $emailDetail[$email]['contact_id'];
 +      }
 +      if (!$contactId) {
 +        //create new contact.
 +        $contact   = civicrm_api3('Contact', 'create',
 +          array('contact_type' => 'Individual',
 +            'email' => $email,
 +            'api.Email.get' => array('return' => 'id')
 +          )
 +        );
 +        $contactId = $contact['id'];
 +        $emailId   = $contact['values'][$contactId]['api.Email.get']['id'];
 +      }
 +      civicrm_api3('MailingEventQueue', 'create',
 +        array('job_id' => $job['id'],
 +          'email_id' => $emailId,
 +          'contact_id' => $contactId
 +        )
 +      );
 +    }
 +  }
 +
 +  $isComplete = FALSE;
 +  while (!$isComplete) {
 +    $isComplete = CRM_Mailing_BAO_MailingJob::runJobs($testEmailParams);
 +  }
 +
 +  //return delivered mail info
 +  $mailDelivered = CRM_Mailing_Event_BAO_Delivered::getRows($params['mailing_id'], $job['id'], TRUE, NULL, NULL, NULL, TRUE);
 +
 +  return civicrm_api3_create_success($mailDelivered);
 +}
 +
 +/**
 + * Adjust Metadata for send_mail action
 + *
 + * The metadata is used for setting defaults, documentation & validation
 + * @param array $params array or parameters determined by getfields
 + */
 +function _civicrm_api3_mailing_stats_spec(&$params) {
 +  $params['date']['api.default'] = 'now';
 +}
 +
 +function civicrm_api3_mailing_stats($params) {
 +  civicrm_api3_verify_mandatory($params,
 +    'CRM_Mailing_DAO_MailingJob',
 +    array('mailing_id'),
 +    FALSE
 +  );
 +
 +  if ($params['date'] == 'now') {
 +    $params['date'] = date('YmdHis');
 +  }
 +  else {
 +    $params['date'] = CRM_Utils_Date::processDate($params['date'] . ' ' . $params['date_time']);
 +  }
 +
 +  $stats[$params['mailing_id']] = array();
 +  if (empty($params['job_id'])) {
 +    $params['job_id'] = NULL;
 +  }
 +  foreach (array('Delivered', 'Bounces', 'Unsubscribers', 'Unique Clicks', 'Opened') as $detail) {
 +    switch ($detail) {
 +      case 'Delivered':
 +        $stats[$params['mailing_id']] += array(
 +          $detail =>  CRM_Mailing_Event_BAO_Delivered::getTotalCount($params['mailing_id'], $params['job_id'], FALSE, $params['date'])
 +        );
 +        break;
 +      case 'Bounces':
 +        $stats[$params['mailing_id']] += array(
 +          $detail =>  CRM_Mailing_Event_BAO_Bounce::getTotalCount($params['mailing_id'], $params['job_id'], FALSE, $params['date'])
 +        );
 +        break;
 +      case 'Unsubscribers':
 +        $stats[$params['mailing_id']] += array(
 +          $detail =>  CRM_Mailing_Event_BAO_Unsubscribe::getTotalCount($params['mailing_id'], $params['job_id'], FALSE, NULL, $params['date'])
 +        );
 +        break;
 +      case 'Unique Clicks':
 +        $stats[$params['mailing_id']] += array(
 +          $detail =>  CRM_Mailing_Event_BAO_TrackableURLOpen::getTotalCount($params['mailing_id'], $params['job_id'], FALSE, NULL, $params['date'])
 +        );
 +        break;
 +      case 'Opened':
 +        $stats[$params['mailing_id']] += array(
 +          $detail =>  CRM_Mailing_Event_BAO_Opened::getTotalCount($params['mailing_id'], $params['job_id'], FALSE, $params['date'])
 +        );
 +        break;
 +    }
 +  }
 +  return civicrm_api3_create_success($stats);
 +}
 +
  /**
   * Fix the reset dates on the email record based on when a mail was last delivered
   * We only consider mailings that were completed and finished in the last 3 to 7 days
   * Both the min and max days can be set via the params
   */
  function civicrm_api3_mailing_update_email_resetdate($params) {
-   CRM_Mailing_Event_BAO_Delivered::updateEmailResetDate(
-     CRM_Utils_Array::value('minDays', $params, 3),
-     CRM_Utils_Array::value('maxDays', $params, 3)
-   );
-   return civicrm_api3_create_success();
+       CRM_Mailing_Event_BAO_Delivered::updateEmailResetDate(
+               CRM_Utils_Array::value('minDays', $params, 3),
+               CRM_Utils_Array::value('maxDays', $params, 3)
+       );
+       return civicrm_api3_create_success();
  }
 -
 -function civicrm_api3_mailing_preview($params) {
 -      civicrm_api3_verify_mandatory($params,
 -              'CRM_Mailing_DAO_Mailing',
 -              array('id'),
 -              FALSE
 -      );
 -      $session = CRM_Core_Session::singleton();
 -      $mailing = new CRM_Mailing_BAO_Mailing();
 -      $mailing->id = $params['id'];
 -      $mailing->find(TRUE);
 -      CRM_Mailing_BAO_Mailing::tokenReplace($mailing);
 -      // get and format attachments
 -      $attachments = CRM_Core_BAO_File::getEntityFile('civicrm_mailing', $mailing->id);
 -      $returnProperties = $mailing->getReturnProperties();
 -      $contactID = CRM_Utils_Array::value('contact_id', $params);
 -      if (!$contactID) {
 -              $contactID = $session->get('userID');
 -      }
 -      $mailingParams = array('contact_id' => $contactID);
 -      $details = CRM_Utils_Token::getTokenDetails($mailingParams, $returnProperties, TRUE, TRUE, NULL, $mailing->getFlattenedTokens());
 -      $mime = &$mailing->compose(NULL, NULL, NULL, $session->get('userID'), $fromEmail, $fromEmail,
 -              TRUE, $details[0][$session->get('userID')], $attachments
 -      );
 -      return civicrm_api3_create_success(array('subject' => $mime->_headers['Subject'], 'html' => $mime->getHTMLBody(), 'text' => $mime->getTXTBody()));
 -}
 -
 -function civicrm_api3_mailing_send_test($params) {
 -      if (!array_key_exists('test_group', $params) && !array_key_exists('test_email', $params)) {
 -              throw new API_Exception("Mandatory key(s) missing from params array: test_group and/or test_email field are required" );
 -      }
 -      civicrm_api3_verify_mandatory($params,
 -              'CRM_Mailing_DAO_MailingJob',
 -              array('mailing_id'),
 -              FALSE
 -      );
 -
 -      $testEmailParams = _civicrm_api3_generic_replace_base_params($params);
 -      $testEmailParams['is_test'] = 1;
 -      $job = civicrm_api3('MailingJob', 'create', $testEmailParams);
 -      $testEmailParams['job_id'] = $job['id'];
 -      $testEmailParams['emails'] = explode(',', $testEmailParams['test_email']);
 -      if (!empty($params['test_email'])) {
 -              $query = "
 -SELECT e.id, e.contact_id, e.email
 -FROM civicrm_email e
 -INNER JOIN civicrm_contact c ON e.contact_id = c.id
 -WHERE e.email IN ('" . implode("','", $testEmailParams['emails']) . "')
 -AND e.on_hold = 0
 -AND c.is_opt_out = 0
 -AND c.do_not_email = 0
 -AND c.is_deceased = 0
 -GROUP BY e.id
 -ORDER BY e.is_bulkmail DESC, e.is_primary DESC
 -";
 -              $dao = CRM_Core_DAO::executeQuery($query);
 -              $emailDetail = array();
 -              // fetch contact_id and email id for all existing emails
 -              while ($dao->fetch()) {
 -                      $emailDetail[$dao->email] = array(
 -                              'contact_id' => $dao->contact_id,
 -                              'email_id' => $dao->id,
 -                      );
 -              }
 -              $dao->free();
 -              foreach ($testEmailParams['emails'] as $key => $email) {
 -                      $email = trim($email);
 -                      $contactId = $emailId = NULL;
 -                      if (array_key_exists($email, $emailDetail)) {
 -                              $emailId = $emailDetail[$email]['email_id'];
 -                              $contactId = $emailDetail[$email]['contact_id'];
 -                      }
 -                      if (!$contactId) {
 -                              //create new contact.
 -                              $contact = civicrm_api3('Contact', 'create',
 -                                      array('contact_type' => 'Individual',
 -                                              'email' => $email,
 -                                              'api.Email.get' => array('return' => 'id')
 -                                      )
 -                              );
 -                              $contactId = $contact['id'];
 -                              $emailId = $contact['values'][$contactId]['api.Email.get']['id'];
 -                      }
 -                      civicrm_api3('MailingEventQueue', 'create',
 -                              array('job_id' => $job['id'],
 -                                      'email_id' => $emailId,
 -                                      'contact_id' => $contactId
 -                              )
 -                      );
 -              }
 -      }
 -
 -      $isComplete = FALSE;
 -      while (!$isComplete) {
 -              $isComplete = CRM_Mailing_BAO_MailingJob::runJobs($testEmailParams);
 -      }
 -
 -      //return delivered mail info
 -      $mailDelivered = CRM_Mailing_Event_BAO_Delivered::getRows($params['mailing_id'], $job['id'], TRUE, NULL, NULL, NULL, TRUE);
 -      return civicrm_api3_create_success($mailDelivered);
 -}
 -
index 9734fc9fe646f52d0b60013430247d49c0bdf481,546d2de80856a69ee2c7bba8563741fcb7714a04..edefc0843b086bc51a5529901e8c97676e5b12a8
@@@ -109,22 -101,22 +109,22 @@@ function civicrm_api3_mailing_group_del
  }
  
  function civicrm_api3_mailing_group_getfields($params) {
-   $dao = _civicrm_api3_get_DAO('Subscribe');
-   $d = new $dao();
-   $fields = $d->fields();
-   $d->free();
+       $dao = _civicrm_api3_get_DAO('Subscribe');
+       $d = new $dao();
+       $fields = $d->fields();
+       $d->free();
  
-   $dao = _civicrm_api3_get_DAO('Unsubscribe');
-   $d = new $dao();
-   $fields = $fields + $d->fields();
-   $d->free();
+       $dao = _civicrm_api3_get_DAO('Unsubscribe');
+       $d = new $dao();
+       $fields = $fields + $d->fields();
+       $d->free();
  
-   // CRM-13830 - prevent the api wrapper from helping out with pseudoconstants
-   // Since these fields don't belong to this entity it will fail
-   foreach ($fields as &$field) {
-     unset($field['pseudoconstant']);
-   }
+       // CRM-13830 - prevent the api wrapper from helping out with pseudoconstants
+       // Since these fields don't belong to this entity it will fail
+       foreach ($fields as &$field) {
+               unset($field['pseudoconstant']);
+       }
  
 -      return civicrm_api3_create_success($fields);
 +  return civicrm_api3_create_success($fields, $params, 'mailing_group', 'getfields');
  }