Index: includes/views/nodequeue.views.inc
=========================================================
--- includes/views/nodequeue.views.inc	(revision 1.4)
+++ includes/views/nodequeue.views.inc	Thu Oct 21 19:35:57 PDT 2010
@@ -172,6 +172,24 @@
     ),
   );
 
+  $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 @@
     ),
   );
 
+  $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
=========================================================
--- includes/views/nodequeue.views_default.inc	(revision 1.5)
+++ includes/views/nodequeue.views_default.inc	Thu Oct 21 19:35:57 PDT 2010
@@ -16,7 +16,7 @@
   $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 @@
           '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
=========================================================
--- includes/views/nodequeue_handler_relationship_nodequeue.inc	(revision 1.2)
+++ includes/views/nodequeue_handler_relationship_nodequeue.inc	Thu Oct 21 19:35:57 PDT 2010
@@ -8,7 +8,7 @@
     $options = parent::option_definition();
 
     $options['limit']['default'] = FALSE;
-    $options['qids']['default'] = array();
+    $options['names']['default'] = array();
     return $options;
   }
 
@@ -30,16 +30,16 @@
     $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 @@
       $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
Index: nodequeue.install
=========================================================
--- nodequeue.install	(revision 1.22)
+++ nodequeue.install	Thu Oct 21 21:55:48 PDT 2010
@@ -11,6 +11,11 @@
         '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',
@@ -80,6 +85,9 @@
       ),
     ), // fields
     'primary key' => array('qid'),
+    'unique keys' => array(
+      'name' => array('name')
+    ),
   ); // nodequeue_queue.
   $schema['nodequeue_roles'] = array(
     'description' => t('Defines the roles which are allowed to use a particular nodequeue.'),
@@ -126,7 +134,7 @@
       'type' => array('type'),
     ), // indexes
   ); // nodequeue_types
-  
+
   // Subqueues are minor queues that inherit all of the properties of
   // the parent queue. A parent queue must have at least 1 subqueue
   // to do anything. Reference is for the use of whatever is creating
@@ -146,6 +154,11 @@
         'unsigned' => TRUE,
         'not null' => TRUE,
       ),
+      'name' => array(
+        'description' => t('The machine name of the subqueue.'),
+        'type' => 'varchar',
+        'length' => 32,
+      ),
       'reference' => array(
         'description' => '',
         'type' => 'varchar',
@@ -162,6 +175,9 @@
       ),
     ), // fields
     'primary key' => array('sqid'),
+    'unique keys' => array(
+      'name' => array('name')
+    ),
     'indexes' => array(
       'qid' => array('qid'),
       'reference' => array('reference'),
@@ -210,7 +226,7 @@
       'qid_nid' => array('qid', 'nid'),
     ), // indexes
   ); // nodequeue_nodes
-  
+
   return $schema;
 }
 
@@ -280,7 +296,7 @@
 
   // Create the nodequeue_subqueue table.
   $ret[] = update_sql("UPDATE {nodequeue_queue} SET owner = 'nodequeue', show_in_ui = 1, show_in_tab = 1, show_in_links = 1, reference = 0");
-  
+
   db_create_table($ret, 'nodequeue_subqueue', array(
     'description' => t('Subqueues are minor queues that inherit all of the properties of the parent queue. A parent queue must have at least 1 subqueue to do anything. Reference is for the use of whatever is creating the subqueues in order to link it to some other ID easily.'),
     'fields' => array(
@@ -474,6 +490,45 @@
   }
 }
 
+/*
+ * Provide machine names, and auto-generation of machine names for existing
+ * queues/subqueues.
+ */
+function nodequeue_update_6007() {
+  $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
=========================================================
--- nodequeue.module	(revision 1.107)
+++ nodequeue.module	Thu Oct 21 22:01:04 PDT 2010
@@ -714,6 +714,35 @@
     '#description' => t('Enter the name of the queue'),
   );
 
+  // The name is required for setting up a new node queue.
+  // The name is disabled on edit, but this causes issues because no values are
+  // passes when a form element is disabled. To keep the form display from
+  // changing greatly, the display form name is changed and the real value is
+  // hidden.
+  $name_form_field = 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)"),
+  );
+  if (!isset($queue->name)) {
+    // New queue set up normally.
+    $form['name'] = $name_form_field;
+    $form['name']['#required'] = TRUE;
+  }
+  else {
+    // Editing a queue with a name that shall not be changed.
+    $form['name_display'] = $name_form_field;
+    $form['name_display']['#value'] = $queue->name;
+    $form['name_display']['#disabled'] = TRUE;
+
+    $form['name'] = array(
+      '#type' => 'hidden',
+      '#value' => $queue->name,
+    );
+  }
+
   // 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 +904,12 @@
  * 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 (!nodequeue_machine_name_available($form_state['values']['name'], $form_state['values']['qid'])) {
+    form_set_error('name', t("The queue's machine name is already in use. Please choose a different machine name."));
+  }
   if (empty($form_state['values']['title'])) {
     form_set_error('title', t('Please enter a title for this queue.'));
   }
@@ -925,6 +960,27 @@
 }
 
 /**
+ * Determine if the machine name is in use.
+ */
+function nodequeue_machine_name_available($machine_name, $qid = NULL) {
+  // Find all existing records for the given machine_name
+  $result = db_query("SELECT qid FROM {nodequeue_queue} WHERE `name` LIKE '%s'", $machine_name);
+  $existing_queues = array();
+  while ($record = db_fetch_object($result)) {
+    $existing_queues[] = $record->qid;
+  }
+  if (count($existing_queues) == 0) {
+    // Creating a new machine name queue
+    return TRUE;
+  }
+  else if (count($existing_queues) == 1 && !empty($qid) && $qid == $existing_queues[0]) {
+    // Checking an existing queue that has not changed its name.
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
  * Delete-validate function for the nodequeue_queue form.
  */
 function nodequeue_edit_queue_form_delete_validate($form, &$form_state) {
@@ -1480,6 +1536,20 @@
   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 +1852,20 @@
 
 }
 
+
+/**
+ * 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 +1969,20 @@
  */
 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);
+    // Allow nodequeue to save and not update the name unless supplied
+    if (isset($queue->name) && !empty($queue->name)) {
+      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);
+    }
+    else {
+      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 +2052,11 @@
   $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 +2066,13 @@
     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;
 }
 
@@ -2019,7 +2120,7 @@
     }
     if (module_exists('apachesolr')) {
       apachesolr_mark_node($nid);
-    }  
+    }
     //Invoke the hook to notify other modules of the node addition.
     module_invoke_all('nodequeue_add', $subqueue->sqid, $nid);
   }
@@ -2073,7 +2174,7 @@
   $diff = $end - $start + 1;
   db_query("DELETE FROM {nodequeue_nodes} WHERE sqid = %d AND position >= %d AND position <= %d", $sqid, $start, $end);
   db_query("UPDATE {nodequeue_nodes} SET position = position - %d WHERE sqid = %d AND position > %d",  $diff, $sqid, $end);
-  
+
   // Invoke the hook to let other modules know that the nodes were removed.
   while($node = db_fetch_object($result)) {
     module_invoke_all('nodequeue_remove', $sqid, $node->nid);
@@ -2553,7 +2654,7 @@
     $where = '(n.status = 1 || n.uid = %d) AND ';
     $where_args = array($user->uid);
   }
-  
+
   $where .= "n.type IN (". db_placeholders($queue->types, 'varchar') .')';
   $where_args = array_merge($where_args, $queue->types);
 
