From cc90b26bedd73845c9aec56246054b51023650ba Mon Sep 17 00:00:00 2001
From: chaosphere2112 <samuelbfries@gmail.com>
Date: Mon, 25 Nov 2013 09:10:22 -0800
Subject: [PATCH 1/2] Applied patch from comment #33

---
 addons/nodequeue_rules/README.txt                |  14 ++
 addons/nodequeue_rules/nodequeue_rules.info      |   6 +
 addons/nodequeue_rules/nodequeue_rules.module    |  43 ++++++
 addons/nodequeue_rules/nodequeue_rules.rules.inc | 186 +++++++++++++++++++++++
 4 files changed, 249 insertions(+)
 create mode 100644 addons/nodequeue_rules/README.txt
 create mode 100644 addons/nodequeue_rules/nodequeue_rules.info
 create mode 100644 addons/nodequeue_rules/nodequeue_rules.module
 create mode 100644 addons/nodequeue_rules/nodequeue_rules.rules.inc

diff --git a/addons/nodequeue_rules/README.txt b/addons/nodequeue_rules/README.txt
new file mode 100644
index 0000000..93594bc
--- /dev/null
+++ b/addons/nodequeue_rules/README.txt
@@ -0,0 +1,14 @@
+-- SUMMARY --
+
+This module provides a basic rules integration for nodequeue.
+
+
+-- REQUIREMENTS --
+
+ - Nodequeue (http://drupal.org/project/nodequeue)
+ - Rules (http://drupal.org/project/rules)
+
+
+-- INSTALLATION --
+
+Install as usual, see http://drupal.org/node/895232 for further information.
diff --git a/addons/nodequeue_rules/nodequeue_rules.info b/addons/nodequeue_rules/nodequeue_rules.info
new file mode 100644
index 0000000..b6e09e8
--- /dev/null
+++ b/addons/nodequeue_rules/nodequeue_rules.info
@@ -0,0 +1,6 @@
+name = Nodequeue Rules
+core = 7.x
+description = "Provides a basic rules integration for nodequeue."
+package = Nodequeue
+dependencies[] = nodequeue
+dependencies[] = rules
diff --git a/addons/nodequeue_rules/nodequeue_rules.module b/addons/nodequeue_rules/nodequeue_rules.module
new file mode 100644
index 0000000..9ae66ed
--- /dev/null
+++ b/addons/nodequeue_rules/nodequeue_rules.module
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * @file
+ *
+ * @see nodequeue_rules.rules.inc
+ */
+
+/**
+ * Event: Node added to a nodequeue.
+ * Implements hook_nodequeue_add()
+ */
+function nodequeue_rules_nodequeue_add($sqid, $nid) {
+  $subqueue = nodequeue_load_subqueue($sqid);
+  $queue = nodequeue_load($subqueue->qid);
+  $node = node_load($nid);
+  rules_invoke_event('nodequeue_rules_event_add_node', $queue, $node);
+}
+
+/**
+ * Event: Node removed from a nodequeue.
+ * Implements hook_nodequeue_remove()
+ */
+function nodequeue_rules_nodequeue_remove($sqid, $nid) {
+  $subqueue = nodequeue_load_subqueue($sqid);
+  $queue = nodequeue_load($subqueue->qid);
+  $node = node_load($nid);
+  rules_invoke_event('nodequeue_rules_event_remove_node', $queue, $node);
+}
+
+/**
+ * Event: Nodes changed places in the nodequeue
+ * Implements hook_nodequeue_swap()
+ */
+function nodequeue_rules_nodequeue_save_subqueue_order_alter($sqid, $nids) {
+  $subqueue = nodequeue_load_subqueue($sqid);
+  $queue = nodequeue_load($subqueue->qid);
+  $nodes = array();
+  foreach ($nids as $data) {
+    $nodes[] = node_load($data['nid']);
+  }
+  rules_invoke_event('nodequeue_rules_event_save_subqueue_order_alter', $queue, $nodes);
+}
diff --git a/addons/nodequeue_rules/nodequeue_rules.rules.inc b/addons/nodequeue_rules/nodequeue_rules.rules.inc
new file mode 100644
index 0000000..69b744d
--- /dev/null
+++ b/addons/nodequeue_rules/nodequeue_rules.rules.inc
@@ -0,0 +1,186 @@
+<?php
+
+/**
+ * @file
+ * Rules integration for the nodequeue module.
+ */
+
+/**
+ * Implements hook_rules_condition_info()
+ */
+function nodequeue_rules_rules_condition_info() {
+  return array(
+    'nodequeue_rules_node_in_queue' => array(
+      'label' => t('Nodequeue the node belongs to'),
+      'group' => t('Nodequeue'),
+      'parameter' => array(
+        'queue' => array(
+          'type' => 'text',
+          'label' => t('Queue'),
+          'description' => t('The queue where the node was added.'),
+          'options list' => 'nodequeue_rules_get_queue_names',
+        ),
+        'node' => array(
+          'type' => 'node',
+          'label' => t('Node'),
+          'description' => t('The node that was added to the nodequeue.'),
+        ),
+      ),
+    ),
+  );
+}
+
+/**
+ * The callback for the condition 'nodequeue_rules_node_in_queue'
+ */
+function nodequeue_rules_node_in_queue($queue, $node) {
+  // Note that the order of the parameters is the same as in the declaration of
+  // the condition. Use the same variable names as in the declaration to avoid
+  // confusion.
+  $queue = nodequeue_load_queue_by_name($queue_name);
+  $node_in_queue = db_select('nodequeue_nodes', 'nodequeue_nodes')
+    ->fields('nodequeue_nodes', array('qid', 'nid'))
+    ->condition('nid', $node->nid, '=')
+    ->condition('qid', $queue->qid, '=')
+    ->execute()
+    ->fetchAssoc();
+  // All conditions return TRUE or FALSE.
+  return ($queue->qid == $node_in_queue['qid']) ? TRUE : FALSE;
+}
+
+/**
+* Implementation of hook_rules_event_info().
+*/
+function nodequeue_rules_rules_event_info() {
+  return array(
+    //Event: Node added to a nodequeue
+    'nodequeue_rules_event_add_node' => array(
+      'label' => t('After adding a node to a nodequeue'),
+      'group' => t('Nodequeue'),
+      'variables' => array(
+        'queue' => array('type' => 'text', 'label' => t('nodequeue the node was added in')),
+        'node' => array('type' => 'node', 'label' => t('the node that was added')),
+      ),
+    ),
+    'nodequeue_rules_event_remove_node' => array(
+      'label' => t('After removing a node from a nodequeue'),
+      'group' => t('Nodequeue'),
+      'variables' => array(
+        'queue' => array('type' => 'text', 'label' => t('nodequeue the node was removed from')),
+        'node' => array('type' => 'node', 'label' => t('the node that was removed')),
+      ),
+    ),
+    'nodequeue_rules_event_save_subqueue_order_alter' => array(
+      'label' => t('After swapping nodes in a nodequeue'),
+      'group' => t('Nodequeue'),
+      'variables' => array(
+        'queue' => array('type' => 'text', 'label' => t('nodequeue the nodes were swapped in')),
+        'nodes' => array('type' => 'nodes', 'label' => t('the nodes that were swapped')),
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_rules_action_info().
+ */
+function nodequeue_rules_rules_action_info() {
+  return array(
+    // Action: Add a given node to the given nodequeue.
+    'nodequeue_rules_action_add_node' => array(
+      'label' => t('Add node to nodequeue'),
+      'group' => t('Nodequeue'),
+      'parameter' => array(
+        'node' => array(
+          'type' => 'node',
+          'label' => t('Node'),
+          'description' => t('The node you want to add.'),
+        ),
+        'queue' => array(
+          'type' => 'text',
+          'label' => t('Queue'),
+          'description' => t('The queue where the node should be added to.'),
+          'options list' => 'nodequeue_rules_get_queue_names',
+        ),
+        'unique' => array(
+          'type' => 'boolean',
+          'label' => t('Prevent duplication'),
+          'description' => t('Selecting this option will prevent the node from being added more than once to any subqueue.'),
+          'default value' => TRUE,
+        )
+      ),
+    ),
+    // Action: Remove the given node from the given nodequeue.
+    'nodequeue_rules_action_remove_node' => array(
+      'label' => t('Remove node from nodequeue'),
+      'group' => t('Nodequeue'),
+      'parameter' => array(
+        'node' => array(
+          'type' => 'node',
+          'label' => t('Node'),
+          'description' => t('The node you want to remove.'),
+        ),
+        'queue' => array(
+          'type' => 'text',
+          'label' => t('Queue'),
+          'description' => t('The queue where the node should be removed from.'),
+          'options list' => 'nodequeue_rules_get_queue_names',
+        ),
+      ),
+    ),
+  );
+}
+
+/**
+ * Action: Add the given node to the given nodequeue.
+ */
+function nodequeue_rules_action_add_node($node, $queue_name, $unique) {
+  $queue = nodequeue_load_queue_by_name($queue_name);
+  $smartqueue_enabled = function_exists('smartqueue_taxonomy_nodequeue_subqueues') ? TRUE : FALSE;
+  if ($smartqueue_enabled) {
+    $references = smartqueue_taxonomy_nodequeue_subqueues($queue, $node);
+  }
+  $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
+  foreach($subqueues as $subqueue) {
+    $add = TRUE;
+    // unique means we don't add it if it's in the queue already
+    if ($unique) {
+      $add = nodequeue_subqueue_position($subqueue->sqid, $node->nid) === FALSE;
+    }
+    if ($add) {
+      if ($smartqueue_enabled) {
+        if (in_array($subqueue->reference, $references)) {
+          nodequeue_subqueue_add($queue, $subqueue, $node->nid);
+        }
+      }
+      else {
+        nodequeue_subqueue_add($queue, $subqueue, $node->nid);
+      }
+    }
+  }
+}
+
+/**
+ * Action: Remove the given node from the given nodequeue.
+ */
+function nodequeue_rules_action_remove_node($node, $queue_name) {
+  $queue = nodequeue_load_queue_by_name($queue_name);
+  $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
+  foreach ($subqueues as $subqueue) {
+    if (!$queue->i18n || (isset($node->tnid) && empty($node->tnid))) {
+      nodequeue_subqueue_remove_node($subqueue->sqid, $node->nid);
+    }
+  }
+}
+
+/**
+ * Return a list of nodequeue names.
+ */
+function nodequeue_rules_get_queue_names() {
+  $items = array();
+  $queues = nodequeue_load_queues(nodequeue_get_all_qids());
+  foreach ($queues as $queue) {
+    $items[$queue->name] = $queue->title;
+  }
+  return $items;
+}
-- 
1.8.1.2


From e9498a557e2e62b771db5009a0b1e23a9e8617bf Mon Sep 17 00:00:00 2001
From: chaosphere2112 <samuelbfries@gmail.com>
Date: Mon, 25 Nov 2013 09:11:40 -0800
Subject: [PATCH 2/2] Fix for return true when no nodequeue association found
 in nodequeue_rules

---
 addons/nodequeue_rules/nodequeue_rules.rules.inc | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/addons/nodequeue_rules/nodequeue_rules.rules.inc b/addons/nodequeue_rules/nodequeue_rules.rules.inc
index 69b744d..2b8eff8 100644
--- a/addons/nodequeue_rules/nodequeue_rules.rules.inc
+++ b/addons/nodequeue_rules/nodequeue_rules.rules.inc
@@ -45,7 +45,8 @@ function nodequeue_rules_node_in_queue($queue, $node) {
     ->execute()
     ->fetchAssoc();
   // All conditions return TRUE or FALSE.
-  return ($queue->qid == $node_in_queue['qid']) ? TRUE : FALSE;
+  // fetchAssoc returns false if no row is found; use implicit truthiness get around that case.
+  return $fetchAssoc() && ($queue->qid == $node_in_queue['qid']) ? TRUE : FALSE;
 }
 
 /**
-- 
1.8.1.2

