? batchy_patchy.patch
? includes/admin.inc
Index: issue.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/issue.inc,v
retrieving revision 1.354
diff -u -p -r1.354 issue.inc
--- issue.inc	18 Jun 2009 03:28:55 -0000	1.354
+++ issue.inc	16 Feb 2010 07:37:59 -0000
@@ -236,7 +236,13 @@ function project_issue_default_states() 
 }
 
 function project_issue_priority($priority = 0) {
-  $priorities = array(1 => t('critical'), t('normal'), t('minor'));
+  static $priorities;
+  if (!isset($priorities)) {
+    $result = db_query('SELECT priority, name FROM {project_issue_priorities} ORDER BY weight');
+    while ($object = db_fetch_object($result)) {
+      $priorities[$object->priority] = $object->name;
+    }
+  }
   return $priority ? $priorities[$priority] : $priorities;
 }
 
Index: project_issue.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/project_issue.install,v
retrieving revision 1.64
diff -u -p -r1.64 project_issue.install
--- project_issue.install	21 Aug 2009 22:51:31 -0000	1.64
+++ project_issue.install	16 Feb 2010 07:38:00 -0000
@@ -117,6 +117,13 @@ function project_issue_schema() {
         'not null' => TRUE,
         'default' => 0,
       ),
+      'priority_weight' => array(
+        'description' => 'The weight of the priority for this issue.',
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
       'rid' => array(
         'description' => 'The {project_release_nodes}.rid (version identifier) for this issue (only used in conjunction with the project_release module).',
         'type' => 'int',
@@ -249,6 +256,32 @@ function project_issue_schema() {
     ),
   );
 
+  $schema['project_issue_priorities'] = array(
+    'description' => 'The issue priorities.',
+    'fields' => array(
+      'priority' => array(
+        'description' => 'The priority for this issue after this comment was made.',
+        'type' => 'serial',
+        'not null' => TRUE,
+      ),
+      'name' => array(
+        'description' => 'Display-friendly name for this priority.',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'weight' => array(
+        'description' => 'Weight for this priority, used when ordering priorities.',
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('priority'),
+  );
+
   $schema['project_subscriptions'] = array(
     'description' => 'Table keeping track of per-user project_issue subscriptions.',
     'fields' => array(
@@ -364,6 +397,9 @@ function project_issue_install() {
   variable_set('comment_upload_project_issue', 1);
   // Enable file attachments for issues.
   variable_set('upload_project_issue', 1);
+  db_query("INSERT INTO {project_issue_priorities} (priority, name, weight) VALUES (1, 'critical', 1)");
+  db_query("INSERT INTO {project_issue_priorities} (priority, name, weight) VALUES (2, 'normal', 2)");
+  db_query("INSERT INTO {project_issue_priorities} (priority, name, weight) VALUES (3, 'minor', 3)");
 }
 
 /**
@@ -446,3 +482,51 @@ function project_issue_update_6002() {
   return $ret;
 }
 
+function project_issue_update_6003() {
+  $ret = array();
+  $table = array(
+    'description' => 'The issue priorities.',
+    'fields' => array(
+      'priority' => array(
+        'description' => 'The priority for this issue after this comment was made.',
+        'type' => 'serial',
+        'not null' => TRUE,
+      ),
+      'name' => array(
+        'description' => 'Display-friendly name for this priority.',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'weight' => array(
+        'description' => 'Weight for this priority, used when ordering priorities.',
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('priority'),
+  );
+  db_create_table($ret, 'project_issue_priorities', $table);
+  db_query("INSERT INTO {project_issue_priorities} (priority, name, weight) VALUES (1, 'critical', 1)");
+  db_query("INSERT INTO {project_issue_priorities} (priority, name, weight) VALUES (2, 'normal', 2)");
+  db_query("INSERT INTO {project_issue_priorities} (priority, name, weight) VALUES (3, 'minor', 3)");
+
+  db_add_field($ret, 'project_issues', 'priority_weight', array('type' => 'int', 'not null' => TRUE, 'default' => '0', 'size' => 'tiny'));
+  return $ret;
+}
+
+function project_issue_update_6004(&$sandbox) {
+  $ret = array();
+  // Reconstruct a batch context.
+  $context = array('sandbox' => &$sandbox);
+  // Load the include.
+  drupal_get_path('module', 'project_issue') .'/includes/admin.inc';
+  // Call the batch upgrade which will set its variables in the sandbox.
+  _project_issue_priorities_update('UPDATE project_issues SET priority_weight = priority WHERE nid BETWEEN %d AND %d', array(), $context);
+  // Pass back progress.
+  $ret['#finished'] = $context['finished'];
+  return $ret;
+}
Index: project_issue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/project_issue.module,v
retrieving revision 1.178
diff -u -p -r1.178 project_issue.module
--- project_issue.module	8 Feb 2010 18:02:59 -0000	1.178
+++ project_issue.module	16 Feb 2010 07:38:00 -0000
@@ -99,6 +99,27 @@ function project_issue_menu() {
     'file' => 'includes/admin.settings.inc',
   );
 
+  // Administrative pages
+  $items['admin/project/project-issue-priority'] = array(
+    'title' => 'Project issue priorities',
+    'description' => 'Configure what issue priorities should be used on your site.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('project_issue_admin_priorities_form'),
+    'access arguments' => array('administer projects'),
+    'weight' => 1,
+    'type' => MENU_NORMAL_ITEM,
+    'file' => 'includes/admin.inc',
+  );
+  $items['admin/project/project-issue-priority/delete'] = array(
+    'title' => 'Delete',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('project_issue_delete_state_confirm', 'priority', 'project_issue_priorities', 'priority', 'priority', 4),
+    'access arguments' => array('administer projects'),
+    'type' => MENU_CALLBACK,
+    'file' => 'includes/admin.inc'
+  );
+
+
   // Administer issue status settings
   $items['admin/project/project-issue-status'] = array(
     'title' => 'Project issue status options',
@@ -108,15 +129,15 @@ function project_issue_menu() {
     'access arguments' => array('administer projects'),
     'type' => MENU_NORMAL_ITEM,
     'weight' => 1,
-    'file' => 'includes/admin.issue_status.inc'
+    'file' => 'includes/admin.inc'
   );
   $items['admin/project/project-issue-status/delete'] = array(
     'title' => 'Delete',
     'page callback' => 'drupal_get_form',
-    'page arguments' => array('project_issue_delete_state_confirm', 4),
+    'page arguments' => array('project_issue_delete_state_confirm', 'state', 'project_issue_state', 'sid', 'state', 4),
     'access arguments' => array('administer projects'),
     'type' => MENU_CALLBACK,
-    'file' => 'includes/admin.issue_status.inc'
+    'file' => 'includes/admin.inc'
   );
 
   // Issues subtab on project node edit tab.
@@ -318,7 +339,13 @@ function project_issue_theme() {
       ),
     ),
     'project_issue_admin_states_form' => array(
-      'file' => 'includes/admin.issue_status.inc',
+      'file' => 'includes/admin.inc',
+      'arguments' => array(
+        'form' => NULL,
+      ),
+    ),
+    'project_issue_admin_priorities_form' => array(
+      'file' => 'includes/admin.inc',
       'arguments' => array(
         'form' => NULL,
       ),
@@ -525,7 +552,7 @@ function project_issue_access($op, $node
  * Helper to trim all elements in an array.
  */
 function project_issue_trim(&$item, $key) {
-  $item = trim($item);  
+  $item = trim($item);
 }
 
 /**
@@ -619,7 +646,7 @@ function project_issue_add_auto_followup
  *     );
  *
  * @return
- *   TRUE if the comment was successfully added to the requested issue, 
+ *   TRUE if the comment was successfully added to the requested issue,
  *   otherwise FALSE.
  */
 function project_issue_add_followup($changes) {
@@ -1770,4 +1797,3 @@ function project_issue_project_page_link
     $links['development']['links'] = $patches + $links['development']['links'];
   }
 }
-
Index: includes/admin.issue_status.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/includes/admin.issue_status.inc,v
retrieving revision 1.1
diff -u -p -r1.1 admin.issue_status.inc
--- includes/admin.issue_status.inc	4 Apr 2009 07:03:28 -0000	1.1
+++ includes/admin.issue_status.inc	16 Feb 2010 07:38:00 -0000
@@ -1,193 +0,0 @@
-<?php
-// $Id: admin.issue_status.inc,v 1.1 2009/04/04 07:03:28 dww Exp $
-
-/**
- * @file
- * Code for the issue status admin configuration form.
- */
-
-function theme_project_issue_admin_states_form($form) {
-  drupal_add_tabledrag('project-issue-status-admin-table', 'order', 'self', 'project-issue-status-weight');
-  $header = array(
-    array('data' => t('ID')),
-    array('data' => t('Name')),
-    array('data' => t('Weight')),
-    array('data' => t('Author may set')),
-    array('data' => t('In default queries')),
-    array('data' => t('Default status')),
-    array('data' => t('Operations'))
-  );
-  foreach (element_children($form['status']) as $key) {
-    $rows[] = array(
-      'class' => 'draggable',
-      'data' => array(
-        drupal_render($form['status'][$key]['sid']),
-        drupal_render($form['status'][$key]['name']),
-        drupal_render($form['status'][$key]['weight']),
-        drupal_render($form['status'][$key]['author_has']),
-        drupal_render($form['status'][$key]['default_query']),
-        drupal_render($form['default_state'][$key]),
-        drupal_render($form['delete'][$key]),
-      ),
-    );
-  }
-  $rows[] = array(
-    'class' => 'draggable',
-    'data' => array(
-      NULL,
-      drupal_render($form['status_add']['name']),
-      drupal_render($form['status_add']['weight']),
-      drupal_render($form['status_add']['author_has']),
-      drupal_render($form['status_add']['default_query']),
-      NULL, NULL,
-    ),
-  );
-  $output = '<div>' . theme('table', $header, $rows, array('id' => 'project-issue-status-admin-table')) . '</div>';
-  $output .= drupal_render($form);
-  return $output;
-}
-
-function project_issue_admin_states_form(&$form_state) {
-  $result = db_query('SELECT * FROM {project_issue_state} ORDER BY weight');
-  $default_state = variable_get('project_issue_default_state', 1);
-  $default_states = project_issue_default_states();
-  $form['status']['#tree'] = TRUE;
-  while ($state = db_fetch_object($result)) {
-    $options[$state->sid] = '';
-    $form['status'][$state->sid]['sid'] = array(
-      '#type' => 'markup',
-      '#value' => $state->sid,
-    );
-    $form['status'][$state->sid]['name'] = array(
-      '#type' => 'textfield',
-      '#default_value' => $state->name,
-      '#size' => 20,
-      '#maxlength' => 255,
-    );
-    $form['status'][$state->sid]['weight'] = array(
-      '#type' => 'weight',
-      '#default_value' => $state->weight,
-      '#delta' => 15,
-      '#attributes' => array('class' => 'project-issue-status-weight'),
-    );
-    $form['status'][$state->sid]['author_has'] = array(
-      '#type' => 'checkbox',
-      '#default_value' => $state->author_has,
-    );
-    $form['status'][$state->sid]['default_query'] = array(
-      '#type' => 'checkbox',
-      '#default_value' => in_array($state->sid, $default_states),
-    );
-    $del_link = ($state->sid != $default_state) ? l(t('Delete'), 'admin/project/project-issue-status/delete/'. $state->sid) : '';
-    $form['delete'][$state->sid] = array(
-      '#type' => 'markup',
-      '#value' => $del_link,
-    );
-  }
-  $form['default_state'] = array(
-    '#type' => 'radios',
-    '#options' => $options,
-    '#default_value' => $default_state,
-  );
-  $form['status_add']['name'] = array(
-    '#type' => 'textfield',
-    '#size' => 20,
-    '#maxlength' => 255,
-  );
-  $form['status_add']['weight'] = array(
-    '#type' => 'weight',
-    '#default_value' => 0,
-    '#delta' => 15,
-    '#attributes' => array('class' => 'project-issue-status-weight'),
-  );
-  $form['status_add']['author_has'] = array(
-    '#type' => 'checkbox',
-  );
-  $form['status_add']['default_query'] = array(
-    '#type' => 'checkbox',
-  );
-  $form['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Save'),
-  );
-  $form['#tree'] = TRUE;
-  return $form;
-}
-
-/**
- * Submit handler for project_issue_admin_states_form.
- */
-function project_issue_admin_states_form_submit($form, &$form_state) {
-  // Check for and apply changes or additions to project issue status options.
-  if (isset($form_state['values']['default_state'])) {
-    variable_set('project_issue_default_state', $form_state['values']['default_state']);
-  }
-  // Update existing status options.
-  if($form_state['values']['status']) {
-    foreach ($form_state['values']['status'] as $sid => $value) {
-      $state = db_fetch_object(db_query('SELECT name, weight, author_has, default_query FROM {project_issue_state} WHERE sid = %d', $sid));
-      // Check to see whether the record needs updating.
-      if (($state->name != $value['name']) || ($state->weight != $value['weight']) || ($state->author_has != $value['author_has']) || ($state->default_query != $value['default_query'])) {
-        db_query("UPDATE {project_issue_state} SET name = '%s', weight = %d, author_has = %d, default_query = %d WHERE sid = %d", $value['name'], $value['weight'], $value['author_has'], $value['default_query'], $sid);
-      }
-    }
-  }
-  // Add any new status options.
-  if (isset($form_state['values']['status_add']) && !empty($form_state['values']['status_add']['name'])) {
-    // Check to see whether the state already exists:
-    $issue_state = db_result(db_query("SELECT COUNT(*) FROM {project_issue_state} WHERE name = '%s'", $form_state['values']['status_add']['name']));
-    if (empty($issue_state)) {
-      db_query("INSERT INTO {project_issue_state} (name, weight, author_has, default_query) VALUES ('%s', %d, %d, %d)", $form_state['values']['status_add']['name'], $form_state['values']['status_add']['weight'], $form_state['values']['status_add']['author_has'], $form_state['values']['status_add']['default_query']);
-    }
-    else {
-      drupal_set_message(t('Status %status already exists.', array ('%status' => $form_state['values']['status_add']['name'])), 'error');
-    }
-  }
-}
-
-function project_issue_delete_state_confirm(&$form_state, $sid) {
-  $states = project_issue_state();
-  $name = $states[$sid];
-
-  $total = db_result(db_query('SELECT COUNT(nid) AS total FROM {project_issues} WHERE sid = %d', $sid));
-  if ($total > 0) {
-    $form['new_sid'] = array(
-      '#type' => 'select',
-      '#title' => t('Reassign status'),
-      '#default_value' => $sid,
-      '#options' => $states,
-      '#description' => t('There are !total existing issues with the status of @name. Please select a new status for these issues.', array('!total' => $total, '@name' => $name)),
-    );
-  }
-  $form['sid'] = array(
-    '#type' => 'value',
-    '#value' => $sid,
-  );
-  $form['name'] = array(
-    '#type' => 'hidden',
-    '#value' => $name,
-  );
-  return confirm_form(
-    $form,
-    t('Are you sure you want to delete the status option %name?', array('%name' => $name)),
-    'admin/project/project-issue-status',
-    t('This action cannot be undone.'),
-    t('Delete'), t('Cancel')
-  );
-}
-
-function project_issue_delete_state_confirm_validate($form, &$form_state) {
-  if ($form_state['values']['new_sid'] == $form_state['values']['sid']) {
-    form_set_error('new_sid', t('Choose a new issue status for existing issues of status %name.', array('%name' => $form_state['values']['name'])));
-  }
-}
-
-function project_issue_delete_state_confirm_submit($form, &$form_state) {
-  if ($form_state['values']['new_sid']) {
-    db_query('UPDATE {project_issues} SET sid = %d WHERE sid = %d', $form_state['values']['new_sid'], $form_state['values']['sid']);
-  }
-  db_query('DELETE FROM {project_issue_state} WHERE sid = %d', $form_state['values']['sid']);
-  drupal_set_message(t('Project issue status %issue deleted.', array('%issue' => $form_state['values']['name'])));
-  $form_state['redirect'] ='admin/project/project-issue-status';
-}
-
Index: includes/comment.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/includes/comment.inc,v
retrieving revision 1.156
diff -u -p -r1.156 comment.inc
--- includes/comment.inc	17 Jan 2010 00:26:58 -0000	1.156
+++ includes/comment.inc	16 Feb 2010 07:38:00 -0000
@@ -83,7 +83,7 @@ function project_issue_comment(&$arg, $o
       // We should also invalidate the block cache for whatever project is now
       // used for this issue, since we might be deleting a comment that moved
       // an issue from one project to another.
-      $affected_projects[$current_data->pid] = 1;      
+      $affected_projects[$current_data->pid] = 1;
       break;
 
     case 'view':
Index: includes/issue_node_form.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/includes/issue_node_form.inc,v
retrieving revision 1.5
diff -u -p -r1.5 issue_node_form.inc
--- includes/issue_node_form.inc	8 Oct 2009 23:36:16 -0000	1.5
+++ includes/issue_node_form.inc	16 Feb 2010 07:38:00 -0000
@@ -238,6 +238,7 @@ function _project_issue_form($node, $for
     );
   }
 
+  $priority = $node->project_issue['priority'] ? $node->project_issue['priority'] : variable_get('project_issue_priority_default', 2);
   if ($allow_metadata_changes) {
     $form['project_info'] = array(
       '#type' => 'fieldset',
@@ -286,7 +287,7 @@ function _project_issue_form($node, $for
     $form['issue_info']['priority'] = array(
       '#type' => 'select',
       '#title' => t('Priority'),
-      '#default_value' => $node->project_issue['priority'] ? $node->project_issue['priority'] : 2,
+      '#default_value' => $priority,
       '#options' => $priorities,
     );
     $form['issue_info']['assigned'] = array(
@@ -340,7 +341,7 @@ function _project_issue_form($node, $for
     );
     $form['project_issue']['priority'] = array(
       '#type' => 'value',
-      '#value' => $node->project_issue['priority'],
+      '#value' => $priority,
     );
     $form['project_issue']['assigned'] = array(
       '#type' => 'value',
@@ -351,6 +352,10 @@ function _project_issue_form($node, $for
       '#value' => $node->project_issue['sid'],
     );
   }
+  $form['project_issue']['priority_weight'] = array(
+    '#type' => 'value',
+    '#value' => db_result(db_query('SELECT weight FROM {project_issue_priorities} WHERE priority = %d', $priority)),
+  );
 
   $form['issue_details'] = array(
     '#type' => 'fieldset',
@@ -481,4 +486,3 @@ function _project_issue_insert($node) {
   // new issue will have altered the summary totals.
   cache_clear_all('project_issue_cockpit_block:'. $node->pid, 'cache');
 }
-
Index: views/project_issue.views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/views/project_issue.views.inc,v
retrieving revision 1.9
diff -u -p -r1.9 project_issue.views.inc
--- views/project_issue.views.inc	18 Jun 2009 03:48:53 -0000	1.9
+++ views/project_issue.views.inc	16 Feb 2010 07:38:00 -0000
@@ -114,7 +114,7 @@ function project_issue_views_data() {
       'click sortable' => TRUE,
     ),
     'sort' => array(
-      'handler' => 'views_handler_sort',
+      'handler' => 'project_issue_handler_sort_issue_priority_weight',
       'help' => t("Sort by the issue's priority."),
     ),
     'filter' => array(
@@ -220,6 +220,9 @@ function project_issue_views_handlers() 
       'project_issue_handler_filter_issue_version' => array(
         'parent' => 'views_handler_filter_in_operator',
       ),
+      'project_issue_handler_sort_issue_priority_weight' => array(
+        'parent' => 'views_handler_sort',
+      ),
     ),
   );
 }
Index: views/handlers/project_issue_handler_field_issue_priority.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/views/handlers/project_issue_handler_field_issue_priority.inc,v
retrieving revision 1.2
diff -u -p -r1.2 project_issue_handler_field_issue_priority.inc
--- views/handlers/project_issue_handler_field_issue_priority.inc	20 Jan 2009 18:38:04 -0000	1.2
+++ views/handlers/project_issue_handler_field_issue_priority.inc	16 Feb 2010 07:38:00 -0000
@@ -10,5 +10,10 @@ class project_issue_handler_field_issue_
     module_load_include('inc', 'project_issue', 'issue');
     return check_plain(project_issue_priority($values->{$this->field_alias}));
   }
+
+  function click_sort($order) {
+    // Override the sort field, since we are storing denormalized weight.
+    $this->query->add_orderby($this->table, 'priority_weight', $order);
+  }
 }
 
Index: views/handlers/project_issue_handler_sort_issue_priority_weight.inc
===================================================================
RCS file: views/handlers/project_issue_handler_sort_issue_priority_weight.inc
diff -N views/handlers/project_issue_handler_sort_issue_priority_weight.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ views/handlers/project_issue_handler_sort_issue_priority_weight.inc	16 Feb 2010 07:38:00 -0000
@@ -0,0 +1,17 @@
+<?php
+// $Id$
+
+/**
+ * Sort handler for issue priority, using denormalized priority_weight column.
+ */
+class project_issue_handler_sort_issue_priority_weight extends views_handler_sort {
+  /**
+   * Called to add the sort to a query.
+   */
+  function query() {
+    $this->ensure_my_table();
+    // Override the field name, since we are storing a denormalize weight.
+    $this->query->add_orderby($this->table_alias, 'priority_weight', $this->options['order']);
+  }
+
+}
\ No newline at end of file
