? machine-names.patch
Index: nodequeue.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue.install,v
retrieving revision 1.21
diff -u -p -r1.21 nodequeue.install
--- nodequeue.install	23 Mar 2010 16:50:56 -0000	1.21
+++ nodequeue.install	10 Jun 2010 17:39:46 -0000
@@ -11,6 +11,11 @@ function nodequeue_schema() {
         'unsigned' => TRUE,
         'not null' => TRUE
       ),
+      'name' => array(
+        'description' => t('The machine name for the queue'),
+        'type' => 'varchar',
+        'length' => 32,
+      ),
       'title' => array(
         'description' => t('Title of a queue.'),
         'type' => 'varchar',
@@ -146,6 +151,11 @@ function nodequeue_schema() {
         'unsigned' => TRUE,
         'not null' => TRUE,
       ),
+      'name' => array(
+        'description' => t('The machine name of the subqueue.'),
+        'type' => 'varchar',
+        'length' => 32,
+      ),
       'reference' => array(
         'description' => '',
         'type' => 'varchar',
@@ -424,6 +434,45 @@ function nodequeue_update_6005() {
   return $ret;
 }
 
+/*
+ * Provide machine names, and auto-generation of machine names for existing
+ * queues/subqueues.
+ */
+function nodequeue_update_6006() {
+  $ret = array();
+  db_add_field($ret, 'nodequeue_queue', 'name', array(
+    'type' => 'varchar',
+    'length' => 32,
+  ));
+  db_add_unique_key($ret, 'nodequeue_queue', 'name', array('name'));
+
+  db_add_field($ret, 'nodequeue_subqueue', 'name', array(
+    'type' => 'varchar',
+    'length' => 32,
+  ));
+  db_add_unique_key($ret, 'nodequeue_subqueue', 'name', array('name'));
+
+  // Auto-generate machine names for existing queues and subqueues. Existing
+  // queues will be named "queue{$qid}" while subqueues will be named
+  // "queue{$qid}_subqueue{$sqid}"
+  global $db_type;
+
+  if ($db_type == 'mysql' || $db_type == 'mysqli') {
+    $queue_update_sql = "UPDATE {nodequeue_queue} SET name = CONCAT('queue', qid)";
+    $subqueue_update_sql = "UPDATE {nodequeue_subqueue} SET name = CONCAT('queue', qid, '_subqueue', sqid)";
+  }
+  else {
+    $queue_update_sql = "UPDATE {nodequeue_queue} SET name = 'queue'||qid";
+    $subqueue_update_sql = "UPDATE {nodequeue_subqueue} SET name = 'queue'||qid||'_subqueue'||sqid";
+  }
+
+  $ret[] = update_sql($queue_update_sql);
+  $ret[] = update_sql($subqueue_update_sql);
+
+  return $ret;
+
+}
+
 function nodequeue_install() {
   drupal_install_schema('nodequeue');
 }
Index: nodequeue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue.module,v
retrieving revision 1.106
diff -u -p -r1.106 nodequeue.module
--- nodequeue.module	16 Mar 2010 22:10:45 -0000	1.106
+++ nodequeue.module	10 Jun 2010 17:39:46 -0000
@@ -714,6 +714,20 @@ function nodequeue_edit_queue_form(&$for
     '#description' => t('Enter the name of the queue'),
   );
 
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Name'),
+    '#size' => 50,
+    '#maxlength' => 32,
+    '#description' => t("This is the unique name of the queue. It must contain only alphanumeric characters and underscores. It is used to identify the queue internally. This name cannot change. The machine name of the subqueue will be automatically generated using the queue's machines name and the subqueue title (if provided). If no title is provided for the subqueue, the subqueue's machine name will be numeric. (e.g. machinename_subqueue1)"),
+    '#required' => TRUE,
+    '#default_value' => isset($queue->name) ? $queue->name : NULL,
+  );
+
+  if (isset($queue->name)) {
+    $form['name']['#disabled'] = TRUE;
+  }
+
   // This is a value; as the default nodequeue implementation has just one
   // queue per nodequeue, this field is totally redundant. Plugins can
   // override this.
@@ -875,6 +889,9 @@ function nodequeue_edit_queue_form(&$for
  * Validate function for the nodequeue_queue form.
  */
 function nodequeue_edit_queue_form_validate($form, &$form_state) {
+  if (preg_match("/[^[:alnum:]_]/", $form_state['values']['name'])) {
+    form_set_error('name', t("The queue's machine name must consist of alphanumeric or underscore characters only."));
+  }
   if (empty($form_state['values']['title'])) {
     form_set_error('title', t('Please enter a title for this queue.'));
   }
@@ -1480,6 +1497,20 @@ function nodequeue_load_queues_by_type($
   return nodequeue_load_queues(array_keys($qids), $bypass_cache);
 }
 
+
+/**
+ * Return a queue by its machine name. This is obviously not ideal due to the
+ * extra queries, but probably preferable to changing current API calls.
+ *
+ * @param $name
+ *   The queue's machine name
+ */
+function nodequeue_load_queue_by_name($name) {
+  $queue = db_fetch_object(db_query("SELECT qid FROM {nodequeue_queue} WHERE name = '%s'", $name) );
+  return isset($queue->qid) ? nodequeue_load_queues(array($queue->qid) ) : array(); 
+}
+
+
 /**
  * Used by menu system to determine access to the node and the queue in question.
  *
@@ -1782,6 +1813,20 @@ function nodequeue_load_subqueue($sqid, 
 
 }
 
+
+/**
+ * Return a subqueue by its machine name. This is obviously not ideal due to
+ * the extra queries, but probably preferable to changing current API calls.
+ *
+ * @param $name
+ *   The subqueue's machine name
+ */
+function nodequeue_load_subqueue_by_name($name) {
+  $subqueue = db_fetch_object(db_query("SELECT sqid FROM {nodequeue_subqueue} WHERE name = '%s'", $name) );
+  return isset($subqueue->sqid) ? nodequeue_load_subqueues(array($subqueue->sqid) ) : array(); 
+}
+
+
 /**
  * Load the entire set of subqueues for a queue.
  *
@@ -1885,14 +1930,14 @@ function nodequeue_load_subqueues_by_ref
  */
 function nodequeue_save(&$queue) {
   if (!isset($queue->qid)) {
-    db_query("INSERT INTO {nodequeue_queue} (title, subqueue_title, size, link, link_remove, owner, show_in_links, show_in_tab, show_in_ui, i18n, reverse, reference) VALUES ('%s', '%s', %d, '%s', '%s', '%s', %d, %d, %d, %d, %d, '%s')", $queue->title, $queue->subqueue_title, $queue->size, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference);
+    db_query("INSERT INTO {nodequeue_queue} (title, name, subqueue_title, size, link, link_remove, owner, show_in_links, show_in_tab, show_in_ui, i18n, reverse, reference) VALUES ('%s', '%s', '%s', %d, '%s', '%s', '%s', %d, %d, %d, %d, %d, '%s')", $queue->title, $queue->name, $queue->subqueue_title, $queue->size, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference);
     $queue->qid = db_last_insert_id('nodequeue_queue', 'qid');
     if (function_exists('views_invalidate_cache')) {
       views_invalidate_cache();
     }
   }
   else {
-    db_query("UPDATE {nodequeue_queue} set size = %d, title = '%s', subqueue_title = '%s', link = '%s', link_remove = '%s', owner = '%s', show_in_links = %d, show_in_tab = %d, show_in_ui = %d, i18n = %d, reverse = %d, reference = '%s' WHERE qid = %d", $queue->size, $queue->title, $queue->subqueue_title, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference, $queue->qid);
+    db_query("UPDATE {nodequeue_queue} set size = %d, title = '%s', name = '%s', subqueue_title = '%s', link = '%s', link_remove = '%s', owner = '%s', show_in_links = %d, show_in_tab = %d, show_in_ui = %d, i18n = %d, reverse = %d, reference = '%s' WHERE qid = %d", $queue->size, $queue->title, $queue->name, $queue->subqueue_title, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference, $queue->qid);
     db_query("DELETE FROM {nodequeue_roles} WHERE qid = %d", $queue->qid);
     db_query("DELETE FROM {nodequeue_types} WHERE qid = %d", $queue->qid);
   }
@@ -1962,7 +2007,11 @@ function nodequeue_add_subqueue(&$queue,
   $subqueue->qid = $queue->qid;
   $subqueue->title = $title;
 
-  db_query("INSERT INTO {nodequeue_subqueue} (qid, reference, title) VALUES (%d, '%s', '%s')", $queue->qid, $insert_reference, $title);
+  if ($title) {
+    $subqueue->name = sprintf('%s_%s', $queue->name, preg_replace('/[^[:alnum:]_]/', '_', $subqueue->title));
+  }
+
+  db_query("INSERT INTO {nodequeue_subqueue} (qid, reference, title, name) VALUES (%d, '%s', '%s', '%s')", $queue->qid, $insert_reference, $title, $subqueue->name);
 
   $subqueue->sqid = db_last_insert_id('nodequeue_subqueue', 'sqid');
 
@@ -1972,6 +2021,13 @@ function nodequeue_add_subqueue(&$queue,
     db_query("UPDATE {nodequeue_subqueue} SET reference = '%s' WHERE sqid = %d", $subqueue->sqid, $subqueue->sqid);
   }
 
+  // If $title is null, we'll use the sqid. This will guarantee us uniqueness
+  // on this particular install.
+  if (!$title) {
+    $subqueue->name = sprintf('%s_%s', $queue->name, 'queue' . $subqueue->squid);
+    db_query("UPDATE {nodequeue_subqueue} SET name = '%s' WHERE sqid = %d", $subqueue->name, $subqueue->squid);
+  }
+
   return $subqueue;
 }
 
Index: includes/views/nodequeue.views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/includes/views/nodequeue.views.inc,v
retrieving revision 1.4
diff -u -p -r1.4 nodequeue.views.inc
--- includes/views/nodequeue.views.inc	23 Dec 2008 18:59:55 -0000	1.4
+++ includes/views/nodequeue.views.inc	10 Jun 2010 17:39:46 -0000
@@ -172,6 +172,24 @@ function nodequeue_views_data() {
     ),
   );
 
+  $data['nodequeue_queue']['name'] = array(
+    'title' => t('Queue machine name'),
+    'help' => t('The machine name of the queue.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+    ),
+  );
+
   // ----------------------------------------------------------------
   // nodequeue_subqueue table
   $data['nodequeue_subqueue']['table']['group'] = t('Nodequeue');
@@ -202,6 +220,24 @@ function nodequeue_views_data() {
     ),
   );
 
+  $data['nodequeue_subqueue']['name'] = array(
+    'title' => t('Subqueue machine name'),
+    'help' => t('The machine name of the subqueue.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+    ),
+  );
+
   $data['nodequeue_subqueue']['reference'] = array(
     'title' => t('Subqueue reference'),
     'help' => t('The reference that defines a subqueue; what this actually is depends upon the type of subqueue, but is a taxonomy tid for smartqueue taxonomy, or a uid for authorview.'),
Index: includes/views/nodequeue.views_default.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/includes/views/nodequeue.views_default.inc,v
retrieving revision 1.5
diff -u -p -r1.5 nodequeue.views_default.inc
--- includes/views/nodequeue.views_default.inc	16 Mar 2010 22:07:26 -0000	1.5
+++ includes/views/nodequeue.views_default.inc	10 Jun 2010 17:39:46 -0000
@@ -16,7 +16,7 @@ function nodequeue_views_default_views()
   $queues = nodequeue_load_queues(nodequeue_get_all_qids(NULL));
   foreach ($queues as $queue) {
     $view = new view;
-    $view->name = "nodequeue_$queue->qid";
+    $view->name = "nodequeue_$queue->name";
     $view->description = t("Display a list of all nodes in queue '@queue'", array('@queue' => $queue->title));
     $view->tag = t('nodequeue');
     $view->view_php = '';
@@ -46,7 +46,7 @@ function nodequeue_views_default_views()
           'label' => 'queue',
           'required' => 1,
           'limit' => TRUE,
-          'qids' => array($queue->qid => $queue->qid),
+          'names' => array($queue->name => $queue->name),
           'relationship' => 'none',
         ),
       ),
Index: includes/views/nodequeue_handler_relationship_nodequeue.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/includes/views/nodequeue_handler_relationship_nodequeue.inc,v
retrieving revision 1.2
diff -u -p -r1.2 nodequeue_handler_relationship_nodequeue.inc
--- includes/views/nodequeue_handler_relationship_nodequeue.inc	31 Jan 2010 23:17:53 -0000	1.2
+++ includes/views/nodequeue_handler_relationship_nodequeue.inc	10 Jun 2010 17:39:46 -0000
@@ -8,7 +8,7 @@ class nodequeue_handler_relationship_nod
     $options = parent::option_definition();
 
     $options['limit']['default'] = FALSE;
-    $options['qids']['default'] = array();
+    $options['names']['default'] = array();
     return $options;
   }
 
@@ -30,16 +30,16 @@ class nodequeue_handler_relationship_nod
     $options = array();
     $queues = nodequeue_load_queues(nodequeue_get_all_qids(NULL));
     foreach ($queues as $queue) {
-      $options[$queue->qid] = $queue->title;
+      $options[$queue->name] = $queue->title;
     }
 
-    $form['qids'] = array(
-      '#prefix' => '<div><div id="edit-options-qids">',
+    $form['names'] = array(
+      '#prefix' => '<div><div id="edit-options-names">',
       '#suffix' => '</div></div>',
       '#type' => 'checkboxes',
       '#title' => t('Queues'),
       '#options' => $options,
-      '#default_value' => $this->options['qids'],
+      '#default_value' => $this->options['names'],
       '#process' => array('expand_checkboxes', 'views_process_dependency'),
       '#dependency' => array('edit-options-limit' => array(TRUE)),
     );
@@ -62,18 +62,32 @@ class nodequeue_handler_relationship_nod
       $join->definition['type'] = 'INNER';
     }
 
+    $join->construct();
+    $alias = $join->definition['table'] . '_' . $join->definition['left_table'];
+    $this->alias = $this->query->add_relationship($alias, $join, 'nodequeue_nodes', $this->relationship);
+
+    // Add our nodequeue_queues table too
+    $join = new views_join();
+    $join->definition = array(
+      'table' => 'nodequeue_queue',
+      'field' => 'qid',
+      'left_table' => 'nodequeue_nodes_node',
+      'left_field' => 'qid',
+    );
+
+    if (!empty($this->options['required'])) {
+      $join->definition['type'] = 'INNER';
+    }
+
     if (!empty($this->options['limit'])) {
       $join->definition['extra'] = array(array(
-        'field' => 'qid',
-        'value' => array_filter($this->options['qids']),
-        'numeric' => TRUE,
+        'field' => 'name',
+        'value' => array_filter($this->options['names']),
       ));
     }
 
     $join->construct();
+    $this->query->add_relationship('nodequeue_queue_nodequeue_nodes', $join, 'nodequeue_queue');
 
-    $alias = $join->definition['table'] . '_' . $join->definition['left_table'];
-
-    $this->alias = $this->query->add_relationship($alias, $join, 'nodequeue_nodes', $this->relationship);
   }
 }
\ No newline at end of file
