diff --git a/sites/all/modules/casetracker/casetracker.install b/sites/all/modules/casetracker/casetracker.install index 9529627..4f49411 100644 --- a/sites/all/modules/casetracker/casetracker.install +++ b/sites/all/modules/casetracker/casetracker.install @@ -5,6 +5,48 @@ * Implementation of hook_schema(). */ function casetracker_schema() { + $schema['casetracker_case_realms'] = array( + 'fields' => array( + 'case_nid' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + ), + 'realm_csid' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + ), + 'realm_name' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + ), + ), + 'primary key' => array('case_nid','realm_name'), + ); + + $schema['casetracker_comment_status_realms'] = array( + 'fields' => array( + 'comment_cid' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + ), + 'realm_csid' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + ), + 'realm_name' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + ), + ), + 'primary key' => array('comment_cid','realm_name'), + ); + $schema['casetracker_case'] = array( 'fields' => array( 'nid' => array( diff --git a/sites/all/modules/casetracker/casetracker.module b/sites/all/modules/casetracker/casetracker.module index 4e2cf72..ab53617 100644 --- a/sites/all/modules/casetracker/casetracker.module +++ b/sites/all/modules/casetracker/casetracker.module @@ -143,19 +143,23 @@ function casetracker_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { break; case 'load': - $casetracker = db_fetch_object(db_query('SELECT pid, case_priority_id, case_type_id, assign_to, case_status_id FROM {casetracker_case} WHERE nid = %d AND vid = %d', $node->nid, $node->vid)); + $casetracker = db_fetch_object(db_query('SELECT pid, assign_to, nid FROM {casetracker_case} WHERE nid = %d AND vid = %d', $node->nid, $node->vid)); if ($casetracker) { + $casetracker = load_realm_associations($casetracker); return array('casetracker' => $casetracker); } break; case 'update': $record = (object) $node->casetracker; + $record->assign_to = casetracker_get_uid($record->assign_to); $record->nid = $node->nid; $record->vid = $node->vid; - $primary = $node->revision ? array('nid') : array('nid', 'vid'); + + $record = build_realm_associations($record); + drupal_write_record('casetracker_case', $record, $primary); break; @@ -244,8 +248,10 @@ function casetracker_comment(&$comment, $op) { db_query("DELETE FROM {casetracker_comment_status} WHERE cid = %d", $comment->cid); break; case 'view': - $results = db_query("SELECT * FROM {casetracker_comment_status} WHERE cid = %d", $comment->cid); + $results = db_query("SELECT cid, pid, title, assign_to, state + FROM {casetracker_comment_status} WHERE cid = %d", $comment->cid); while ($result = db_fetch_object($results)) { + $result = load_realm_associations($result); $state = $result->state ? 'new' : 'old'; $case_data[$state] = $result; } @@ -378,33 +384,30 @@ function casetracker_case_form_common(&$form, $default_project = NULL) { else { $form['casetracker']['assign_to']['#default_value'] = variable_get('casetracker_default_assign_to', variable_get('anonymous', t('Anonymous'))); } + $realms = casetracker_case_state_load('whatever'); - $case_status_options = casetracker_case_state_load('status'); - $default_status = !empty($node->casetracker->case_status_id) ? $node->casetracker->case_status_id : variable_get('casetracker_default_case_status', key($case_status_options)); - $form['casetracker']['case_status_id'] = array( - '#type' => 'select', - '#title' => t('Status'), - '#options' => $case_status_options, - '#default_value' => $default_status, - ); - - $case_priority_options = casetracker_case_state_load('priority'); - $default_priority = !empty($node->casetracker->case_priority_id) ? $node->casetracker->case_priority_id : variable_get('casetracker_default_case_priority', key($case_priority_options)); - $form['casetracker']['case_priority_id'] = array( - '#type' => 'select', - '#title' => t('Priority'), - '#options' => $case_priority_options, - '#default_value' => $default_priority, - ); + while (list($key, $val) = each($realms)) { + $options = array(); // suitable for form api. + if (!empty($val)) { + foreach ($val as $state) { + $options[$state['csid']] = $state['name']; + } + } - $case_type_options = casetracker_case_state_load('type'); - $default_type = !empty($node->casetracker->case_type_id) ? $node->casetracker->case_type_id : variable_get('casetracker_default_case_type', key($case_type_options)); - $form['casetracker']['case_type_id'] = array( - '#type' => 'select', - '#title' => t('Type'), - '#options' => $case_type_options, - '#default_value' => $default_type, - ); + if ( !empty($node->casetracker->{"case_{$key}_id"}) ) { + $default = $node->casetracker->{"case_{$key}_id"}; + } + else { + $default = variable_get("casetracker_default_case_{$key}", key($options)); + } + + $form['casetracker']["case_{$key}_id"] = array( + '#type' => 'select', + '#title' => t($key), + '#options' => $options, + '#default_value' => $default, + ); + } return $form; } @@ -418,7 +421,7 @@ function casetracker_case_form_common(&$form, $default_project = NULL) { * The number of parameters passed will determine the return value. * * @param $realm - * Optional; the name of the realm ('status', 'priority', or 'type'). + * Optional; the name of the realm. * @param $csid * Optional; the state ID to return from the passed $realm. * @return $values @@ -429,7 +432,9 @@ function casetracker_case_form_common(&$form, $default_project = NULL) { */ function casetracker_case_state_load($realm = NULL, $csid = NULL) { static $states_lookup = array(); - + + $returning = NULL; + if (!$states_lookup) { $results = db_query("SELECT csid, case_state_name, case_state_realm, weight FROM {casetracker_case_states} ORDER BY weight"); while ($result = db_fetch_object($results)) { // offer cached csid and realm lookups from a one-time query. @@ -439,25 +444,124 @@ function casetracker_case_state_load($realm = NULL, $csid = NULL) { 'weight' => (int)$result->weight, 'csid' => (int)$result->csid ); - $states_lookup[$result->csid] = $states_lookup[$result->case_state_realm][$result->csid]; + $csid_lookup[$result->csid] = $states_lookup[$result->case_state_realm][$result->csid]; } } - if ($csid && $realm) { - return $states_lookup[$csid]['name']; + if ( $csid and $realm ) { + $returning = $states_lookup[$realm][$csid]['name']; } - elseif ($csid && !$realm) { - return $states_lookup[$csid]; + elseif ( $csid ) { + $returning = $csid_lookup[$csid]['name']; } - elseif (!$csid && $realm) { - $options = array(); // suitable for form api. - if (!empty($states_lookup[$realm])) { - foreach ($states_lookup[$realm] as $state) { - $options[$state['csid']] = $state['name']; - } + else { + $returning = $states_lookup; + } + + if ($returning == NULL and $realm != 'type') { + echo "why the FUCK is it null"; + analyze($states_lookup[$realm][$csid]['name']); + } + + return $returning; + + // if ($csid && $realm) { + // return $states_lookup[$csid]['name']; + // } + // elseif ($csid && !$realm) { + // return $states_lookup[$csid]; + // } + // elseif (!$csid && $realm) { + // $options = array(); // suitable for form api. + // if (!empty($states_lookup[$realm])) { + // foreach ($states_lookup[$realm] as $state) { + // $options[$state['csid']] = $state['name']; + // } + // } + // return $options; + // } +} + +/** + * Gives you an array of all of the current realms. + * + * @return $realms + * has a pass through in the event this method + * was previously called in the current execution. + */ +function casetracker_case_state_realms() { + global $current_realms; + if ( !$current_realms ) { + $current_realms = array_keys(casetracker_case_state_load()); + } + return $current_realms; +} + +function realm_assocation_values($record) { + if ($record->cid) { + $table = 'casetracker_comment_status_realms'; + $col = 'comment_cid'; + $id = $record->cid; + } + else { + $table = 'casetracker_case_realms'; + $col = 'case_nid'; + $id = $record->nid; + } + + return array($table, $col, $id); +} + +/** + * Gives you an array of all of the current realms. + * + * @param $record + * processes the realm assocations on the passed record + * @return $record + * returns the record with all of the weird fields removed + */ +function build_realm_associations($record) { + $realms = casetracker_case_state_realms(); + list($table, $col, $id) = realm_assocation_values($record); + + foreach($realms as $realm) { + $record_realm->realm_csid = (int) $record->{"case_{$realm}_id"}; + $record_realm->{$col} = (int) $record->{$col}; + $record_realm->realm_name = (string) $realm; + $res = db_fetch_object( + db_query("SELECT %s, realm_name FROM {%s} WHERE (%s = '%s' AND realm_name = '%s')", + $col, $table, $col, $case_realm->case_nid, $case_realm->realm_name)); + if ( $res ) { + drupal_write_record('casetracker_case_realms', $case_realm,array_keys((array) $res)); + } + else { + drupal_write_record('casetracker_case_realms', $case_realm); } - return $options; } + + return $record; +} + +/** + * Gives you an array of all of the current realms. + * + * @param $record + * processes the realm assocations on the passed record + * @return $record + * returns the record with all of the weird fields removed + */ +function load_realm_associations($record) { + $realms = casetracker_case_state_realms(); + list($table, $col, $id) = realm_assocation_values($record); + + foreach($realms as $realm) { + $case_realm = db_fetch_object( + db_query("SELECT * FROM {%s} WHERE (%s = %d AND realm_name = '%s')", + $table, $col, $id, $realm)); + $record->{"case_{$realm}_id"} = $case_realm->realm_csid; + } + + return $record; } /** @@ -560,7 +664,7 @@ function _casetracker_get_og_query_string(&$project) { $querystring[] = 'gids[]='. $group; } } - + return (0 < count($querystring)) ? implode('&', $querystring) : NULL; @@ -595,41 +699,37 @@ function theme_casetracker_comment_changes($old, $new) { $fields = array( 'pid' => t('Project'), 'title' => t('Title'), - 'case_status_id' => t('Status'), 'assign_to' => t('Assigned'), - 'case_priority_id' => t('Priority'), - 'case_type_id' => t('Type'), ); + + $realms = casetracker_case_state_realms(); + + while (list($key, $val) = each($realms)) { + $field = "case_{$val}_id"; + $label = $val; + + if ($new->{$field} != $old->{$field}) { + $old->{$field} = casetracker_case_state_load($val, $old->{$field}); + $new->{$field} = casetracker_case_state_load($val, $new->{$field}); + $rows[] = array(t('!label: !old » !new', array('!label' => $label, '!old' => $old->{$field}, '!new' => $new->{$field}))); + } + } + foreach ($fields as $field => $label) { if ($new->{$field} != $old->{$field}) { - switch ($field) { - case 'pid': - $old_title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", $old->pid)); - $new_title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", $new->pid)); - $old->{$field} = l($old_title, "node/{$old->pid}"); - $new->{$field} = l($new_title, "node/{$new->pid}"); - break; - case 'case_status_id': - $old->{$field} = casetracker_case_state_load('status', $old->{$field}); - $new->{$field} = casetracker_case_state_load('status', $new->{$field}); - break; - case 'assign_to': - $old->{$field} = casetracker_get_name($old->{$field}); - $new->{$field} = casetracker_get_name($new->{$field}); - break; - case 'case_priority_id': - $old->{$field} = casetracker_case_state_load('priority', $old->{$field}); - $new->{$field} = casetracker_case_state_load('priority', $new->{$field}); - break; - case 'case_type_id': - $old->{$field} = casetracker_case_state_load('type', $old->{$field}); - $new->{$field} = casetracker_case_state_load('type', $new->{$field}); - break; + if ( $field == 'pid' ) { + $old_title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", $old->pid)); + $new_title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", $new->pid)); + $old->{$field} = l($old_title, "node/{$old->pid}"); + $new->{$field} = l($new_title, "node/{$new->pid}"); + } + elseif ( $field == 'assign_to' ) { + $old->{$field} = casetracker_get_name($old->{$field}); + $new->{$field} = casetracker_get_name($new->{$field}); } $rows[] = array(t('!label: !old » !new', array('!label' => $label, '!old' => $old->{$field}, '!new' => $new->{$field}))); } } - return theme('table', NULL, $rows, array('class' => 'case_changes')); } @@ -845,3 +945,11 @@ function casetracker_get_name($uid = NULL, $reset = FALSE) { } return !empty($users[$uid]) ? $users[$uid] : variable_get('casetracker_default_assign_to', variable_get('anonymous', t('Anonymous'))); } + +function analyze($var, $exiting = TRUE) { + echo "
"; + var_dump($var); + echo ""; + if ($exiting) + exit; +}