? mw.patch
? nodequeue_generate.info
? nodequeue_generate.module
? nodequeue_generate.module.txt
Index: nodequeue.actions.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/Attic/nodequeue.actions.inc,v
retrieving revision 1.1.2.1
diff -u -F^f -r1.1.2.1 nodequeue.actions.inc
--- nodequeue.actions.inc	2 Aug 2007 02:13:00 -0000	1.1.2.1
+++ nodequeue.actions.inc	10 Dec 2007 20:20:17 -0000
@@ -13,7 +13,7 @@ function action_nodequeue_add($op, $edit
   switch($op) {
     case 'metadata':
       return array(
-        'description' => t('Add to Node Queue'),
+        'description' => t('Add to Node Queues'),
         'type' => t('node'),
         'batchable' => true,
         'configurable' => true,
@@ -21,25 +21,48 @@ function action_nodequeue_add($op, $edit
       break;
 
     case 'do':
-      $qid = $edit['qid'];
-      nodequeue_queue_add($qid, $node->nid);
+      $queues = nodequeue_load_queues($edit['qids']);
+      // Filter out queues by node type. We choose not to use nodequeue_get_qids() because it checks for access control which only matters if we administering a queue.
+      $eligible_queues = array();
+      foreach ($queues as $queue) {
+        if (in_array($node->type, $queue->types)) {
+          $eligible_queues[$queue->qid] = $queue;
+        }
+      }
+      
+      if (!empty($eligible_queues)) {
+        // Remove the node from the eligible queues (if needed).
+        action_nodequeue_remove('do', array('qids' => array_keys($eligible_queues)), $node);
+
+        // Use API to get the eligible subqueues
+        $eligible_subqueues = nodequeue_get_subqueues_by_node($eligible_queues, $node);
+
+        // Add node to each subqueue.
+        foreach ($eligible_subqueues as $subqueue) {
+          nodequeue_subqueue_add($queues[$subqueue->qid], $subqueue, $node->nid);
+        }
+      }
       break;
 
     // return an HTML config form for the action
     case 'form':
       // default values for form
-      if (!isset($edit['qid'])) $edit['qid'] = '';
+      if (!isset($edit['qids'])) $edit['qids'] = '';
 
-      $result = db_query("SELECT * from {nodequeue_queue} ORDER BY title");
-      while ($obj = db_fetch_object($result))
-        $queues[$obj->qid] = $obj->title;
+      $queues = nodequeue_load_queues(nodequeue_get_all_qids(500));
+      foreach ($queues as $qid => $queue) {
+        $options[$qid] = $queue->title;
+      }
 
       // add form components
-      $form['qid'] = array(
+      $form['qids'] = array(
         '#type' => 'select',
         '#title' => t("Queue"),
-        '#default_value' => $edit['qid'],
-        '#options' => $queues,
+        '#default_value' => $edit['qids'],
+        '#multiple' => TRUE,
+        '#options' => $options,
+        '#required' => TRUE,
+        '#description' => t('Specify the queues into which the node should be submitted. If the queue is a smartqueue, the node shall be placed into every subqueue for which it is eligible.')
       );
       return $form;
 
@@ -48,7 +71,7 @@ function action_nodequeue_add($op, $edit
     // process the HTML form to store configuration
     case 'submit':
       $params = array(
-        'qid' => $edit['qid']
+        'qids' => $edit['qids']
       );
       return $params;
       break;
@@ -62,7 +85,7 @@ function action_nodequeue_remove($op, $e
   switch($op) {
     case 'metadata':
       return array(
-        'description' => t('Remove from Node Queue'),
+        'description' => t('Remove from Node Queues'),
         'type' => t('node'),
         'batchable' => true,
         'configurable' => true,
@@ -70,25 +93,38 @@ function action_nodequeue_remove($op, $e
       break;
 
     case 'do':
-      $qid = $edit['qid'];
-      nodequeue_queue_remove_node($qid, $node->nid);
+      $qids = $edit['qids'];
+      // If a node is being deleted, ensure it's also removed from any queues.
+      $placeholders = implode(',', array_fill(0, count($qids), '%d'));
+      $args = $qids;
+      $args[] = $node->nid;
+      $result = db_query("SELECT * FROM {nodequeue_nodes} WHERE qid IN ($placeholders) AND nid = %d", $args);
+      while ($obj = db_fetch_object($result)) {
+        // This removes by nid, not position, because if we happen to have a
+        // node in a queue twice, the 2nd position would be wrong.
+        nodequeue_subqueue_remove_node($obj->sqid, $node->nid);
+      }
       break;
 
     // return an HTML config form for the action
     case 'form':
       // default values for form
-      if (!isset($edit['qid'])) $edit['qid'] = '';
+      if (!isset($edit['qids'])) $edit['qids'] = array();
 
-      $result = db_query("SELECT * from {nodequeue_queue} ORDER BY title");
-      while ($obj = db_fetch_object($result))
-        $queues[$obj->qid] = $obj->title;
+      $queues = nodequeue_load_queues(nodequeue_get_all_qids(500));
+      foreach ($queues as $qid => $queue) {
+        $options[$qid] = $queue->title;
+      }
 
       // add form components
-      $form['qid'] = array(
+      $form['qids'] = array(
         '#type' => 'select',
-        '#title' => t("Queue"),
-        '#default_value' => $edit['qid'],
-        '#options' => $queues,
+        '#title' => t("Queues"),
+        '#default_value' => $edit['qids'],
+        '#multiple' => TRUE,
+        '#decription' => t('Specify the queues from which the node should be removed. If the queue is a smartqueue, the node shall be removed from all subqueues.'),
+        '#required' => TRUE,
+        '#options' => $options,
       );
       return $form;
       break;
@@ -98,7 +134,7 @@ function action_nodequeue_remove($op, $e
     // process the HTML form to store configuration
     case 'submit':
       $params = array(
-        'qid' => $edit['qid']
+        'qids' => $edit['qids']
       );
       return $params;
       break;
Index: nodequeue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue.module,v
retrieving revision 1.39.2.28.2.23
diff -u -F^f -r1.39.2.28.2.23 nodequeue.module
--- nodequeue.module	11 Oct 2007 23:36:19 -0000	1.39.2.28.2.23
+++ nodequeue.module	10 Dec 2007 20:20:17 -0000
@@ -1324,7 +1324,7 @@ function nodequeue_queue_access($queue, 
  * Fetch a list of available queues for a given location. These queues
  * will be fully loaded and ready to go.
  */
-function nodequeue_load_queues_by_type($type, $location = NULL) {
+function nodequeue_load_queues_by_type($type, $location = NULL, $account = NULL) {
   $qids = nodequeue_get_qids($type, $account);
   if ($location) {
     nodequeue_filter_qids($qids, $location);
@@ -1396,7 +1396,7 @@ function nodequeue_get_qids($type, $acco
     $roles = array();
 
     // superuser always has access.
-    if (!user_access('manipulate all queues')) {
+    if (!user_access('manipulate all queues', $account)) {
       $roles_join = "INNER JOIN {nodequeue_roles} nr ON nr.qid = nq.qid ";
       $roles = array_keys((array) $account->roles) + array(DRUPAL_AUTHENTICATED_RID);
       $role_args = array_fill(0, count($roles), '%d');
Index: nodequeue.views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/Attic/nodequeue.views.inc,v
retrieving revision 1.1.2.8
diff -u -F^f -r1.1.2.8 nodequeue.views.inc
--- nodequeue.views.inc	10 Oct 2007 23:00:32 -0000	1.1.2.8
+++ nodequeue.views.inc	10 Dec 2007 20:20:17 -0000
@@ -162,6 +162,7 @@ function nodequeue_views_arguments() {
       'option' => array(
         '#type' => 'select',
         '#options' => 'nodequeue_handler_queuelist',
+        '#any_ok' => TRUE,
       ),
       'help' => t('Filter the view to a specific Sub Queue. The subqueue reference is the ID that the subqueue is attached to; tax id for taxonomy or user id for user queues, etc.'),
     ),
@@ -247,6 +248,11 @@ function nodequeue_handler_queuelist($op
   if (isset($argument['#all_ok']) || isset($argument['value']['#all_ok'])) {
     $options[0] = t('<All>');
   }
+  
+  if (isset($argument['#any_ok']) || isset($argument['value']['#any_ok'])) {
+    $options[-1] = t('<Any>');
+  }
+  
   $queues = nodequeue_load_queues(nodequeue_get_all_qids(NULL));
   foreach ($queues as $queue) {
     // no check plain necessary as this goes into a fieldset which takes
@@ -359,7 +365,9 @@ function nodequeue_handler_arg_reference
       $query->add_field('title', 'nodequeue_subqueue');
       $query->add_field('reference', 'nodequeue_subqueue');
       $query->add_where('nodequeue_subqueue.reference IS NOT NULL');
-      $query->add_where('nodequeue_subqueue.qid = %d', $arg);
+      if ($argtype['options'] != -1) {
+        $query->add_where('nodequeue_subqueue.qid = %d', $arg);
+      }
       $fieldinfo['field'] = "nodequeue_subqueue.title";
       return $fieldinfo;
       break;
@@ -370,7 +378,9 @@ function nodequeue_handler_arg_reference
       // $argtype['options'] == $option
       $query->ensure_table('nodequeue_subqueue', true);
       $query->add_where("nodequeue_subqueue.reference = %d", $arg);
-      $query->add_where('nodequeue_subqueue.qid = %d', $argtype['options']);
+      if ($argtype['options'] != -1) {
+       $query->add_where('nodequeue_subqueue.qid = %d', $argtype['options']); 
+      };
       break;
     case 'link':
       return l($query->title, "$arg/" . intval($query->reference));
Index: smartqueue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/Attic/smartqueue.module,v
retrieving revision 1.1.2.4
diff -u -F^f -r1.1.2.4 smartqueue.module
--- smartqueue.module	16 Aug 2007 00:06:04 -0000	1.1.2.4
+++ smartqueue.module	10 Dec 2007 20:20:17 -0000
@@ -65,9 +65,21 @@ function smartqueue_taxonomy_nodequeue_s
     $vids[$vid] = array();
   }
 
-  foreach ($node->taxonomy as $tid => $term) {
-    if (isset($vids[$term->vid])) {
-      $vids[$term->vid][] = $tid;
+  foreach ($node->taxonomy as $key => $value) {
+    // This unfortunate scar is needed because $node->taxonomy looks different when saving a node versus loading.
+    if (!is_object($value)) {
+      // $node comes form a node form submission
+      foreach ($value as $tid) {
+        if (isset($vids[$key])) {
+          $vids[$key][] = $tid;
+        }
+      }
+    }
+    else {
+      // $node comes from node_load()
+      if (isset($vids[$value->vid])) {
+        $vids[$value->vid][] = $value->tid;
+      }
     }
   }
 
