Index: revision_moderation.module =================================================================== RCS file: /usr/local/cvsroot/cvsr/drupal/code/sites/all/modules/revision_moderation/revision_moderation.module,v retrieving revision 1.1 diff -b -u -p -r1.1 revision_moderation.module --- revision_moderation.module 28 Feb 2009 02:11:36 -0000 1.1 +++ revision_moderation.module 1 Mar 2009 19:13:46 -0000 @@ -38,8 +38,8 @@ function revision_moderation_menu() { 'load arguments' => array(3), 'page callback' => 'revision_moderation_edit', 'page arguments' => array(1), - 'access callback' => '_node_revision_access', - 'access arguments' => array(1, 'update'), + 'access callback' => '_revision_moderation_node_revision_access', + 'access arguments' => array(1, 'edit'), 'file' => 'node.pages.inc', 'file path' => drupal_get_path('module', 'node'), 'type' => MENU_CALLBACK, @@ -51,8 +51,8 @@ function revision_moderation_menu() { 'load arguments' => array(3), 'page callback' => 'drupal_get_form', 'page arguments' => array('revision_moderation_publish_confirm', 1), - 'access callback' => '_node_revision_access', - 'access arguments' => array(1, 'update'), + 'access callback' => '_revision_moderation_node_revision_access', + 'access arguments' => array(1, 'publish'), 'type' => MENU_CALLBACK, ); @@ -60,6 +60,31 @@ function revision_moderation_menu() { } /** + * Implementation of hook_perm(). The node module already has permissions: + * + * view revisions + * revert revisions + * delete revisions + * + * Add in edit and publish permissions so that a user can edit revisions even + * though they cannot publish or revert or vice versa. + */ +function revision_moderation_perm() { + return array('edit revisions', 'publish revisions'); +} + +/** + * Access rules. Allow editing of revisions separately from publishing and + * reverting revisions. + */ +function _revision_moderation_node_revision_access($node, $op) { + $edit_revisions_access = ($op == 'edit' && user_access('edit revisions')); + $publish_revisions_access = ($op == 'publish' && user_access('publish revisions')); + $node_revision_access = _node_revision_access($node, 'update'); + return $edit_revisions_access || $publish_revisions_access || $node_revision_access; +} + +/** * Menu permission callback. */ function revision_moderation_admin_perm($nid) { @@ -143,14 +168,17 @@ function revision_moderation_nodeapi(&$n case 'view': // Cannot use _node_revision_access() here, it's static cached with 1 op - $access_update = user_access('revert revisions'); + $access_view = user_access('view revisions'); + $access_edit = user_access('edit revisions'); + $access_revert = user_access('revert revisions'); $access_delete = user_access('delete revisions'); + $access_publish = user_access('publish revisions'); // Display 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) { $links = array(); // Array of links to show along with the message. - if ($access_update) { + if ($access_view) { // Add a link directly to the diff if we have Diff module installed. if (module_exists('diff')) { if ($node->vid > $current_vid) { @@ -161,16 +189,18 @@ function revision_moderation_nodeapi(&$n } $links[] = l(t('Compare revisions'), $difflink); } + } + if ($access_edit) { $links[] = l(t('Edit revision'), "node/$node->nid/revisions/$node->vid/edit"); + } // If this revision is old, show an option to revert to it. // Otherwise, show an option to publish it. - if ($node->vid < $current_vid) { + if ($node->vid < $current_vid && $access_revert) { $links[] = l(t('Revert to revision'), "node/$node->nid/revisions/$node->vid/revert"); } - else { + elseif ($access_publish) { $links[] = l(t('Publish revision'), "node/$node->nid/revisions/$node->vid/publish"); } - } if ($access_delete) { $links[] = l(t('Delete revision'), "node/$node->nid/revisions/$node->vid/delete"); } @@ -180,7 +210,7 @@ function revision_moderation_nodeapi(&$n } elseif ($node->revision_moderation == 1 && !$teaser) { // Notify admin if a node has pending revisions. - if ($access_update && arg(2) != 'revisions' && revision_moderation_get_node_pending_revisions($node->nid)) { + if ($access_view && arg(2) != 'revisions' && revision_moderation_get_node_pending_revisions($node->nid)) { drupal_set_message(t('This post has one or more pending revisions: view list of revisions.', array('@list' => url("node/$node->nid/revisions")))); } } @@ -189,8 +219,8 @@ function revision_moderation_nodeapi(&$n // Only do this logic for non-admin users on nodes with revision moderation // turned on. - // And not editing a chose revision - if ($node->nid && $node->revision_moderation == 1 && arg(2) != 'revisions' + // And not editing a chosen revision + if ($node->nid && $node->revision_moderation == 1 && !(arg(2) == 'revisions' && arg(4) == 'publish') && (!user_access('administer nodes') || !variable_get('revision_moderation_exempt', 1))) { switch ($op) { case 'prepare': @@ -218,8 +248,10 @@ function revision_moderation_nodeapi(&$n // 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); + if (! user_access('publish revisions') && ! user_access('revert revisions')) { drupal_set_message(t('Your changes have been submitted for moderation.')); } + } break; } }