You are here

casetracker_actions.module in Case Tracker 6

Same filename and directory in other branches
  1. 7 casetracker_actions/casetracker_actions.module

casetracker_actions.module

Implements Actions integration for Case Tracker

File

casetracker_actions/casetracker_actions.module
View source
<?php

/**
 * casetracker_actions.module
 * @file
 * Implements Actions integration for Case Tracker
 */

/**
 * Implementation of hook_action_info()
 * Used to define new actions: 
 *   set priority, set status, set type, set project, set assign-to, take case.
 */
function casetracker_actions_action_info() {
  return array(
    'casetracker_actions_set_priority_action' => array(
      'description' => t('Set case priority'),
      'type' => 'node',
      'configurable' => TRUE,
      'hooks' => array(
        'any' => TRUE,
      ),
    ),
    'casetracker_actions_set_status_action' => array(
      'description' => t('Set case status'),
      'type' => 'node',
      'configurable' => TRUE,
      'hooks' => array(
        'any' => TRUE,
      ),
    ),
    'casetracker_actions_set_type_action' => array(
      'description' => t('Set case type'),
      'type' => 'node',
      'configurable' => TRUE,
      'hooks' => array(
        'any' => TRUE,
      ),
    ),
    'casetracker_actions_set_assign_to_action' => array(
      'description' => t('Set case assigned user'),
      'type' => 'node',
      'configurable' => TRUE,
      'hooks' => array(
        'any' => TRUE,
      ),
    ),
    'casetracker_actions_set_project_action' => array(
      'description' => t('Set case project'),
      'type' => 'node',
      'configurable' => TRUE,
      'hooks' => array(
        'any' => TRUE,
      ),
    ),
    'casetracker_actions_take_case_action' => array(
      'description' => t('Take over case'),
      'type' => 'node',
      'configurable' => FALSE,
      'hooks' => array(
        'any' => TRUE,
      ),
    ),
  );
}

/**
 * Definitions of Action Behaviors
 */

/** 
 * Set Priority action behavior.
 */
function casetracker_actions_set_priority_action(&$object, $context = array()) {
  $nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
  _casetracker_actions_act($nid, 'case_priority_id', $context['priority']);
}

/** 
 * Set Status action behavior.
 */
function casetracker_actions_set_status_action(&$object, $context = array()) {
  $nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
  _casetracker_actions_act($nid, 'case_status_id', $context['status']);
}

/** 
 * Set Type action behavior.
 */
function casetracker_actions_set_type_action(&$object, $context = array()) {
  $nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
  _casetracker_actions_act($nid, 'case_type_id', $context['type']);
}

/** 
 * Set Assign to action behavior.
 */
function casetracker_actions_set_assign_to_action(&$object, $context = array()) {
  $nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
  _casetracker_actions_act($nid, 'assign_to', $context['assign_to']);
}

/** 
 * Set Project action behavior.
 */
function casetracker_actions_set_project_action(&$object, $context = array()) {
  $nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
  _casetracker_actions_act($nid, 'pid', $context['project']);
}

/** 
 * Take Case action behavior.
 */
function casetracker_actions_take_case_action(&$object, $context = array()) {
  global $user;
  $nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
  _casetracker_actions_act($nid, 'assign_to', $user->name);
}

/**
 * Action Configuration Forms
 */

/**
 * Select a priority level for the Set Priority action.
 */
function casetracker_actions_set_priority_action_form($context) {
  $case_priority_options = casetracker_realm_load('priority');
  $default_priority = variable_get('casetracker_default_case_priority', key($case_priority_options));
  $form['casetracker_actions_priority'] = array(
    '#title' => t('Priority'),
    '#type' => 'select',
    '#description' => t('The case will be updated with the priority selected above.'),
    '#default_value' => $default_priority,
    '#options' => $case_priority_options,
  );
  return $form;
}
function casetracker_actions_set_priority_action_submit($form, $form_state) {
  return array(
    'priority' => $form_state['values']['casetracker_actions_priority'],
  );
}

/**
 * Select a status condition for the Set Status action.
 */
function casetracker_actions_set_status_action_form($context) {
  $case_status_options = casetracker_realm_load('status');
  $default_status = variable_get('casetracker_default_case_status', key($case_status_options));
  $form['casetracker_actions_status'] = array(
    '#title' => t('Status'),
    '#type' => 'select',
    '#description' => t('The case will be updated with the status selected above.'),
    '#default_value' => $default_status,
    '#options' => $case_status_options,
  );
  return $form;
}
function casetracker_actions_set_status_action_submit($form, $form_state) {
  return array(
    'status' => $form_state['values']['casetracker_actions_status'],
  );
}

/**
 * Select a type for the Set Type action.
 */
function casetracker_actions_set_type_action_form($context) {
  $case_type_options = casetracker_realm_load('type');
  $default_type = variable_get('casetracker_default_case_type', key($case_type_options));
  $form['casetracker_actions_type'] = array(
    '#title' => t('Type'),
    '#type' => 'select',
    '#description' => t('The case will be updated with the type selected above.'),
    '#default_value' => $default_type,
    '#options' => $case_type_options,
  );
  return $form;
}
function casetracker_actions_set_type_action_submit($form, $form_state) {
  return array(
    'type' => $form_state['values']['casetracker_actions_type'],
  );
}

/**
 * Select a user to assign for the Set Assign to action.
 */
function casetracker_actions_set_assign_to_action_form($context) {
  $options = casetracker_user_options();
  $form['casetracker_actions_assign_to'] = array(
    '#type' => 'textfield',
    '#title' => t('Assign to'),
    '#autocomplete_path' => 'casetracker_autocomplete',
    '#required' => TRUE,
    '#size' => 12,
  );
  if (count($options) < 20) {
    $normalized = array();
    foreach ($options as $uid => $name) {
      $normalized[$uid] = $name;
    }
    $form['casetracker_actions_assign_to'] = array(
      '#type' => 'radios',
      '#title' => t('Assign to'),
      '#required' => TRUE,
      '#options' => $normalized,
    );
  }
  $form['casetracker_actions_assign_to']['#default_value'] = variable_get('casetracker_default_assign_to', t('Unassigned'));
  return $form;
}
function casetracker_actions_set_assign_to_action_submit($form, $form_state) {
  return array(
    'assign_to' => $form_state['values']['casetracker_actions_assign_to'],
  );
}

/**
 * Select a project for the Set Project action
 */
function casetracker_actions_set_project_action_form($context) {
  $project_options = casetracker_project_options();

  // if there's no project ID from the URL, or more than one project,
  // we'll create a select menu for the user; otherwise, we'll save
  // the passed (or only) project ID into a hidden field.
  if (count($project_options) > 1) {
    $form['casetracker_actions_pid'] = array(
      '#title' => t('Project'),
      '#type' => 'select',
      '#options' => $project_options,
    );
  }
  else {
    $form['casetracker']['pid'] = array(
      '#type' => 'value',
      '#value' => !empty($default_project) ? $default_project : key($project_options),
    );
  }
  return $form;
}
function casetracker_actions_set_project_action_submit($form, $form_state) {
  return array(
    'project' => $form_state['values']['casetracker_actions_pid'],
  );
}

/**
 * Helper Functions
 */

/**
 * generalized casetracker update function
 * All casetracker actions have the same fundamental behavior.
 */
function _casetracker_actions_act($nid, $field, $value) {
  if (!$nid) {
    return;
  }

  // make sure we have a valid case node
  $node = node_load(array(
    'nid' => $nid,
    'type' => 'casetracker_basic_case',
  ));
  $success = _casetracker_actions_update_by_comment($field, $value, $node);
  if ($success) {
    _casetracker_actions_log($field, $value, $nid);
  }
}

/**
 * Get nid from action invocation.
 * Failing that, grab it off the current node.
 */
function _casetracker_actions_get_nid($object_nid, $context_nid) {

  // get the nid from the object.
  if (isset($object_nid)) {
    $nid = $object_nid;
  }
  elseif (isset($context_nid)) {
    $nid = $context_nid;
  }
  elseif (arg(0) == 'node') {
    $nid = arg(1);
  }
  return $nid;
}

/**
 * Update case by programmatically inserting a comment posted by current user.
 */
function _casetracker_actions_update_by_comment($field, $value, $node) {
  global $user;
  if (user_access('post comments') && (user_access('administer comments') || node_comment_mode($nid) == COMMENT_NODE_READ_WRITE)) {
    $case_info = get_object_vars($node->casetracker);
    $case_info[$field] = $field == 'assign_to' ? casetracker_get_name($value) : $value;
    if ($field != 'assign_to') {
      $case_info['assign_to'] = casetracker_get_name($case_info['assign_to']);
    }

    // casetracker uses revision_id as a primary key for casetracker_case table.
    $edit = array(
      'nid' => $node->nid,
      'pid' => 0,
      // comment parent id
      'comment' => t('Case changed in bulk update.'),
      // comment body
      'subject' => t('Update'),
      'uid' => $user->uid,
      'revision_id' => $node->vid,
      'casetracker' => $case_info,
    );
    return comment_save($edit);
  }
  drupal_set_message(t('You may not post an update to case #%nid. Either you do not have the necessary permissions or the case has been locked.', array(
    '%nid' => $nid,
  )));
  return 0;
}

/**
 * Watchdog logging & verbose user message for actions
 */
function _casetracker_actions_log($field, $value, $nid) {
  watchdog('action', 'Case nid %nid: %field set to %value.', array(
    '%field' => $field,
    '%value' => $value,
    '%nid' => $nid,
  ));
  drupal_set_message(t("Case #%nid: %field set to %value", array(
    '%nid' => $nid,
    '%field' => $field,
    '%value' => $value,
  )));
}

Functions

Namesort descending Description
casetracker_actions_action_info Implementation of hook_action_info() Used to define new actions: set priority, set status, set type, set project, set assign-to, take case.
casetracker_actions_set_assign_to_action Set Assign to action behavior.
casetracker_actions_set_assign_to_action_form Select a user to assign for the Set Assign to action.
casetracker_actions_set_assign_to_action_submit
casetracker_actions_set_priority_action Set Priority action behavior.
casetracker_actions_set_priority_action_form Select a priority level for the Set Priority action.
casetracker_actions_set_priority_action_submit
casetracker_actions_set_project_action Set Project action behavior.
casetracker_actions_set_project_action_form Select a project for the Set Project action
casetracker_actions_set_project_action_submit
casetracker_actions_set_status_action Set Status action behavior.
casetracker_actions_set_status_action_form Select a status condition for the Set Status action.
casetracker_actions_set_status_action_submit
casetracker_actions_set_type_action Set Type action behavior.
casetracker_actions_set_type_action_form Select a type for the Set Type action.
casetracker_actions_set_type_action_submit
casetracker_actions_take_case_action Take Case action behavior.
_casetracker_actions_act generalized casetracker update function All casetracker actions have the same fundamental behavior.
_casetracker_actions_get_nid Get nid from action invocation. Failing that, grab it off the current node.
_casetracker_actions_log Watchdog logging & verbose user message for actions
_casetracker_actions_update_by_comment Update case by programmatically inserting a comment posted by current user.