Index: revision_moderation/revision_moderation.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/revision_moderation/revision_moderation.module,v
retrieving revision 1.26.2.10
diff -u -p -r1.26.2.10 revision_moderation.module
--- revision_moderation/revision_moderation.module	20 Feb 2007 15:55:17 -0000	1.26.2.10
+++ revision_moderation/revision_moderation.module	21 Aug 2008 16:26:44 -0000
@@ -74,6 +74,18 @@ function revision_moderation_settings() 
     '#default_value' => variable_get('revision_moderation_exempt', 1),
     '#description' => t('With this option enabled, users with the "administer nodes" privilege will bypass the moderation system, and their revisions will be published immediately.'),
   );
+  // Form for choosing whether to allow revision
+  // moderation on either published nodes, unpublished nodes, or both.
+  $form['revision_node_status'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Moderate node statuses'),
+    '#default_value' => variable_get('revision_node_status', array('published', 'unpublished')),
+    '#options' => array(
+      'published' => t('Published nodes'),
+      'unpublished' => t('Unpublished nodes'),
+    ),
+    '#description' => t('Use these options to provide moderation for revisions created under the different statuses that a node can be in.'),
+  );
   return system_settings_form($form);
 }
 
@@ -116,26 +128,47 @@ function revision_moderation_form_alter(
  * Implementation of hook_nodeapi().
  */
 function revision_moderation_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
+  $status = variable_get('revision_node_status', array('published', 'unpublished'));
+  //drupal_set_message('<pre>' . print_r($published, TRUE) . '</pre>');
   switch ($op) {
     case 'insert':
       // Store revision moderation setting of this node.
-      db_query('INSERT INTO {revision_moderation} (nid, revision_moderation) VALUES (%d, %d)', $node->nid, $node->revision_moderation);
+      if (($status['published'] && $node->status) || ($status['unpublished'] && !$node->status)) {
+        db_query('INSERT INTO {revision_moderation} (nid, revision_moderation) VALUES (%d, %d)', $node->nid, $node->revision_moderation);
+      }
       break;
     case 'update':
       // Update revision moderation setting of this node.
-      db_query('DELETE FROM {revision_moderation} WHERE nid = %d', $node->nid);
-      db_query('INSERT INTO {revision_moderation} (nid, revision_moderation) VALUES (%d, %d)', $node->nid, $node->revision_moderation);
+      if (($status['published'] && $node->status) || ($status['unpublished'] && !$node->status)) {
+        db_query('DELETE FROM {revision_moderation} WHERE nid = %d', $node->nid);
+        db_query('INSERT INTO {revision_moderation} (nid, revision_moderation) VALUES (%d, %d)', $node->nid, $node->revision_moderation);
+        drupal_set_message(t('Revision queued for moderation.'));
+        drupal_set_message(t('Pub: @a; Unpub: @b; Status: @c', array('@a' => $status['published'], '@b' => $status['unpublished'], '@c' => $node->status)));
+      }
       break;
     case 'delete':
       // Delete record from revision_moderation table when node is deleted.
-      db_query('DELETE FROM {revision_moderation} WHERE nid = %d', $node->nid);
+      if (($status['published'] && $node->status) || ($status['unpublished'] && !$node->status)) {
+        db_query('DELETE FROM {revision_moderation} WHERE nid = %d', $node->nid);
+      }
       break;
     case 'load':
       // Set a revision_moderation property which can be checked later.
-      $node->revision_moderation = db_result(db_query('SELECT revision_moderation FROM {revision_moderation} WHERE nid = %d', $node->nid));
+      if (($status['published'] && $node->status) || ($status['unpublished'] && !$node->status)) {
+        $node->revision_moderation = db_result(db_query('SELECT revision_moderation FROM {revision_moderation} WHERE nid = %d', $node->nid));
+      }
       break;
     case 'view':
-      // Display more descriptive message at the top of node revision views, including operations
+      // To save the readability of the code, we do the inverse of the logic
+      // in the cases above.
+      if (!($status['published'] && $node->status) && !($status['unpublished'] && !$node->status)) {
+        // Logic: "If it is not the case that (revisions of published nodes are to be moderated and the 
+        // node status is published) AND it is also not the case that (revisions of unpublished nodes are to 
+        // be moderated and the node status is unpublished)".
+        break;
+      }
+      // Display a more descriptive message at the 
+      // top of node revision views, including operations
       // that the current user has available to them.
       $current_vid = db_result(db_query('SELECT vid FROM {node} WHERE nid = %d', $node->nid));
       if ($node->vid != $current_vid) {
@@ -171,26 +204,32 @@ function revision_moderation_nodeapi(&$n
       case 'prepare':
         // If user has a pending revision for this node, load the latest version of
         // it instead.
-        if ($revisions = revision_moderation_get_node_pending_revisions($node->nid)) {
-          global $user;
-          foreach ($revisions as $revision) {
-            if ($revision->uid == $user->uid) {
-              drupal_set_message(t('Editing your latest revision, which is still pending moderation.'));
-              $node = node_load($node->nid, $revision->vid);
-              break;
+        if (($status['published'] && $node->status) || ($status['unpublished'] && !$node->status)) {
+          if ($revisions = revision_moderation_get_node_pending_revisions($node->nid)) {
+            global $user;
+            foreach ($revisions as $revision) {
+              if ($revision->uid == $user->uid) {
+                drupal_set_message(t('Editing your latest revision, which is still pending moderation.'));
+                $node = node_load($node->nid, $revision->vid);
+                break;
+              }
             }
           }
         }
         break;
       case 'submit':
-        $current_vid = db_result(db_query('SELECT vid FROM {node} WHERE nid = %d', $node->nid));
-        $node->original_node = node_load($node->nid, $current_vid);
+        if (($status['published'] && $node->status) || ($status['unpublished'] && !$node->status)) {
+          $current_vid = db_result(db_query('SELECT vid FROM {node} WHERE nid = %d', $node->nid));
+          $node->original_node = node_load($node->nid, $current_vid);
+        }
         break;
       case 'update':
-        if (isset($node->original_node)) {
-          // Update node table's vid to the original value.
-          db_query("UPDATE {node} SET vid = %d, title = '%s', status = %d, moderate = %d WHERE nid = %d", $node->original_node->vid, $node->original_node->title, $node->original_node->status, $node->original_node->moderate, $node->nid);
-          drupal_set_message(t('Your changes have been submitted for moderation.'));
+        if (($status['published'] && $node->status) || ($status['unpublished'] && !$node->status)) {
+          if (isset($node->original_node)) {
+            // Update node table's vid to the original value.
+            db_query("UPDATE {node} SET vid = %d, title = '%s', status = %d, moderate = %d WHERE nid = %d", $node->original_node->vid, $node->original_node->title, $node->original_node->status, $node->original_node->moderate, $node->nid);
+            drupal_set_message(t('Your changes have been submitted for moderation.'));
+          }
         }
         break;
     }
