http://www.mediawiki.org/wiki/Special:Code/MediaWiki/64126

Revision: 64126
Author:   aaron
Date:     2010-03-24 21:02:35 +0000 (Wed, 24 Mar 2010)

Log Message:
-----------
* Refactored addToDiff() and removed overcaching
* Removed inclusion change list for non-reviewers
* Improved behavoir for diffs from the stable to pending edits other than the 
current
* Refactored buildQuickReview(), moved to FlaggedRevsXML
* Split up revreview-update message

Modified Paths:
--------------
    trunk/extensions/FlaggedRevs/FlaggedArticleView.php
    trunk/extensions/FlaggedRevs/FlaggedRevsXML.php
    trunk/extensions/FlaggedRevs/language/FlaggedRevs.i18n.php

Modified: trunk/extensions/FlaggedRevs/FlaggedArticleView.php
===================================================================
--- trunk/extensions/FlaggedRevs/FlaggedArticleView.php 2010-03-24 20:34:05 UTC 
(rev 64125)
+++ trunk/extensions/FlaggedRevs/FlaggedArticleView.php 2010-03-24 21:02:35 UTC 
(rev 64126)
@@ -3,11 +3,15 @@
  * Class representing a web view of a MediaWiki page
  */
 class FlaggedArticleView {
+       protected $article = null;
+
        protected $isDiffFromStable = false;
        protected $isMultiPageDiff = false;
        protected $reviewNotice = '';
        protected $reviewNotes = '';
-       protected $article = null;
+       protected $diffNoticeBox = '';
+       protected $reviewFormRev = false;
+
        protected $loaded = false;
 
        protected static $instance = null;
@@ -575,7 +579,8 @@
                        $wgOut->addParserOutput( $parserOut );
                }
        }
-       
+
+       // Get fancy redirect arrow and link HTML
        protected function getRedirectHtml( $text ) {
                $rTarget = $this->article->followRedirectText( $text );
                if ( $rTarget ) {
@@ -915,6 +920,9 @@
        public function addReviewForm( &$data ) {
                global $wgRequest, $wgUser, $wgOut;
                $this->load();
+               if ( $wgOut->isPrintable() ) {
+                       return false; // Must be on non-printable output 
+               }
                # User must have review rights
                if ( !$wgUser->isAllowed( 'review' ) ) {
                        return true;
@@ -926,11 +934,38 @@
                # Check action and if page is protected
                $action = $wgRequest->getVal( 'action', 'view' );
                # Must be view action...diffs handled elsewhere
-               if ( !self::isViewAction( $action ) || 
$wgRequest->getVal('diff') ) {
+               if ( !self::isViewAction( $action ) ) {
                        return true;
                }
-               # Place the form at the bottom of the page
-               $data .= $this->buildQuickReview();
+               # Get the revision being displayed
+               $rev = false;
+               if ( $this->reviewFormRev ) {
+                       $rev = $this->reviewFormRev; // $newRev for diffs 
stored here
+               } elseif( $wgOut->getRevisionId() ) {
+                       $rev = Revision::newFromId( $wgOut->getRevisionId() );
+               }
+               # Build the review form as needed
+               if ( $rev ) {
+                       $templateIDs = $fileSHA1Keys = null;
+                       # $wgOut may not already have the inclusion IDs, such 
as for diffonly=1.
+                       if ( $wgOut->getRevisionId() == $rev->getId()
+                               && isset( $wgOut->mTemplateIds )
+                               && isset( $wgOut->fr_ImageSHA1Keys ) )
+                       {
+                               $templateIDs = $wgOut->mTemplateIds;
+                               $fileSHA1Keys = $wgOut->fr_ImageSHA1Keys;
+                       }
+                       $form = FlaggedRevsXML::buildQuickReview( 
$this->article,
+                               $rev, $templateIDs, $fileSHA1Keys, 
$this->isDiffFromStable );
+                       # Diff action: place the form at the top of the page
+                       if ( $wgRequest->getVal( 'diff' ) ) {
+                               # Review notice box goes above form
+                               $wgOut->prependHTML( $this->diffNoticeBox . 
$form );
+                       # View action: place the form at the bottom of the page
+                       } else {
+                               $data .= $form;
+                       }
+               }
                return true;
        }
 
@@ -1012,9 +1047,10 @@
        public function setViewTabs( $skin, &$views ) {
                global $wgRequest;
                $this->load();
-               // Get the actual content page
-               $title = $this->article->getTitle()->getSubjectPage();
-               $fa = FlaggedArticle::getTitleInstance( $title );
+               if ( $skin->mTitle->isTalkPage() ) {
+                       return true; // leave talk pages alone
+               }
+               $fa = FlaggedArticle::getTitleInstance( $skin->mTitle );
                // Get the type of action requested
                $action = $wgRequest->getVal( 'action', 'view' );
                if ( !$fa->isReviewable() ) {
@@ -1029,7 +1065,7 @@
                $synced = FlaggedRevs::stableVersionIsSynced( $srev, $fa );
                $pendingEdits = !$synced && $fa->isStableShownByDefault();
                // Set the edit tab names as needed...
-               if ( !$skin->mTitle->isTalkPage() && $pendingEdits ) {
+               if ( $pendingEdits ) {
                        if ( isset( $views['edit'] ) ) {
                                $views['edit']['text'] = wfMsg( 
'revreview-edit' );
                        }
@@ -1037,29 +1073,40 @@
                                $views['viewsource']['text'] = wfMsg( 
'revreview-source' );
                        }
                }
-               if ( $synced ) {
-                       // Exit, since either the draft tab should not be shown
-                       // or the page is already the most current revision
-                       return true;
-               }
+               # Add "pending changes" tab if the page is not synced
+               if( !$synced ) {
+                       $this->addDraftTab( $fa, $views, $srev, $action );
+               }
+               return true;
+       }
+
+       // Add "pending changes" tab and set tab selection CSS
+       protected function addDraftTab( $fa, &$views, $srev, $action ) {
+               global $wgRequest, $wgOut;
                $tabs = array(
-                       'stable' => array( // view stable
+                       'read' => array( // view stable
                                'text'  => wfMsg( 'revreview-stable' ), // 
unused
-                               'href'  => $title->getLocalUrl( 'stable=1' ),
+                               'href'  => $fa->getTitle()->getLocalUrl( 
'stable=1' ),
                                'class' => ''
                        ),
                        'draft' => array( // view draft
                                'text'  => wfMsg( 'revreview-current' ),
-                               'href'  => $title->getLocalUrl( 
'stable=0&redirect=no' ),
+                               'href'  => $fa->getTitle()->getLocalUrl( 
'stable=0&redirect=no' ),
                                'class' => ''
                        ),
                );
+               // Set tab selection CSS
                if ( $this->pageOverride() || $wgRequest->getVal( 'stableid' ) 
) {
                        // We are looking a the stable version or an old 
reviewed one
-                       $tabs['stable']['class'] = 'selected';
-               } elseif ( self::isViewAction( $action ) && 
!$skin->mTitle->isTalkPage() ) {
-                       // We are looking at a draft revision
-                       $tabs['draft']['class'] = 'selected';
+                       $tabs['read']['class'] = 'selected';
+               } elseif ( self::isViewAction( $action ) ) {
+                       // Are we looking at a draft/current revision?
+                       if( $wgOut->getRevisionId() > $srev->getRevId() ) {
+                               $tabs['draft']['class'] = 'selected';
+                       // Otherwise, fallback to regular tab behavior
+                       } else {
+                               $tabs['read']['class'] = 'selected';
+                       }
                }
                $first = true;
                $newViews = array();
@@ -1071,35 +1118,27 @@
                                // 'view' tab? In this case, the 
"page"/"discussion" tabs are not
                                // part of $views. Also, both the page/talk 
page have a 'view' tab.
                                if( $tabAction == 'view' ) {
-                                       if( $skin->mTitle->isTalkPage() ) {
-                                               // 'view' for talk page; leave 
it alone
-                                               $newViews[$tabAction] = $data;
-                                       } else {
-                                               // 'view' for content page; 
make it go to the stable version
-                                               $newViews[$tabAction]['text'] = 
$data['text']; // keep tab name
-                                               $newViews[$tabAction]['href'] = 
$tabs['stable']['href'];
-                                               $newViews[$tabAction]['class'] 
= $tabs['stable']['class'];
-                                       }
+                                       // 'view' for content page; make it go 
to the stable version
+                                       $newViews[$tabAction]['text'] = 
$data['text']; // keep tab name
+                                       $newViews[$tabAction]['href'] = 
$tabs['read']['href'];
+                                       $newViews[$tabAction]['class'] = 
$tabs['read']['class'];
                                // 'page' tab? Make it go to the stable 
version...
                                } else {
                                        $newViews[$tabAction]['text'] = 
$data['text']; // keep tab name
-                                       $newViews[$tabAction]['href'] = 
$tabs['stable']['href'];
+                                       $newViews[$tabAction]['href'] = 
$tabs['read']['href'];
                                        $newViews[$tabAction]['class'] = 
$data['class']; // keep tab class
                                }
                        // All other tabs...
                        } else {
                                // Add 'draft' tab to content page to the left 
of 'edit'...
                                if( $tabAction == 'edit' || $tabAction == 
'viewsource' ) {
-                                       if( !$skin->mTitle->isTalkPage() ) {
-                                               $newViews['current'] = 
$tabs['draft'];
-                                       }
+                                       $newViews['current'] = $tabs['draft'];
                                }
                                $newViews[$tabAction] = $data;
                        }
                }
                // Replaces old tabs with new tabs
                $views = $newViews;
-               return true;
        }
        
        /**
@@ -1133,20 +1172,21 @@
                if ( $wgOut->isPrintable() ) {
                        return true;
                }
-               # Avoid multi-page diffs that are useless and misbehave (bug 
19327)
-               if ( $this->isMultiPageDiff ) {
+               # Avoid multi-page diffs that are useless and misbehave (bug 
19327).
+               # Also sanity check $newRev just in case.
+               if ( $this->isMultiPageDiff || !$newRev ) {
                        return true;
                }
                # Page must be reviewable. Sanity check $oldRev.
                if ( !$this->article->isReviewable() ) {
                        return true;
                }
+               $form = '';
                $frev = $this->article->getStableRev();
-               # Add link to diff-to-stable as needed
-               $form = $this->diffToStableLink( $frev );
-               # Check if this might be the diff to stable. If so, enhance it.
-               if ( $this->isDiffFromStable && $oldRev && $newRev ) {
-                       global $wgParserCacheExpireTime;
+               # Check if this might be a diff to stable (old rev is the 
stable rev).
+               # For reviewers, add a notice and list inclusion changes for 
this case.
+               if ( $this->isDiffFromStable && $wgUser->isAllowed( 'review' ) 
) {
+                       $this->reviewFormRev = $newRev;
                        # Check the page sync value cache...
                        $key = wfMemcKey( 'flaggedrevs', 'includesSynced', 
$this->article->getId() );
                        $value = FlaggedRevs::getMemcValue( $wgMemc->get( $key 
), $this->article );
@@ -1154,94 +1194,64 @@
                        $synced = ( $value === "true" ) ? true : false;
 
                        $changeList = array();
-
-                       # Try the cache. Uses format <page ID>-<UNIX timestamp>.
-                       $key = wfMemcKey( 'stableDiffs', 'templates', 
$this->article->getId() );
-                       $tmpChanges = FlaggedRevs::getMemcValue( $wgMemc->get( 
$key ), $this->article );
-                       if ( empty( $tmpChanges ) && !$synced ) {
-                               $tmpChanges = false; // don't use cache, it's 
not consistent
+                       if( !$synced ) {
+                               # Add a list of links to each changed 
template...
+                               $changeList += $this->fetchTemplateChanges( 
$frev );
+                               # Add a list of links to each changed file...
+                               $changeList += $this->fetchFileChanges( $frev );
                        }
-                       # Make a list of each changed template...
-                       if ( $tmpChanges === false ) {
-                               $tmpChanges = $this->fetchTemplateChanges( 
$frev );
-                               $wgMemc->set( $key, FlaggedRevs::makeMemcObj( 
$tmpChanges ),
-                                       $wgParserCacheExpireTime );
-                       }
-                       # Add change set to list
-                       $changeList += $tmpChanges;
 
-                       # Try the cache. Uses format <page ID>-<UNIX timestamp>.
-                       $key = wfMemcKey( 'stableDiffs', 'images', 
$this->article->getId() );
-                       $imgChanges = FlaggedRevs::getMemcValue( $wgMemc->get( 
$key ), $this->article );
-                       if ( empty( $imgChanges ) && !$synced ) {
-                               $imgChanges = false; // don't use cache, it's 
not consistent
-                       }
-                       // Get list of each changed image...
-                       if ( $imgChanges === false ) {
-                               $imgChanges = $this->fetchFileChanges( $frev );
-                               $wgMemc->set( $key, FlaggedRevs::makeMemcObj( 
$imgChanges ),
-                                       $wgParserCacheExpireTime );
-                       }
-                       # Add change set to list
-                       $changeList += $imgChanges;
-
-                       # Some important information...
+                       # Some important information about include version 
selection...
                        $notice = '';
                        if ( count( $changeList ) > 0 ) {
-                               $notice = '<br />' . wfMsgExt( 
'revreview-update-use', array( 'parseinline' ) );
+                               # We use the stable version of includes, unless 
set otherwise
+                               if( FlaggedRevs::inclusionSetting() != 
FR_INCLUDES_CURRENT ) {
+                                       $notice = wfMsgExt( 
'revreview-update-use', 'parse' );
+                               }
                        } elseif ( !$synced ) {
                                $diff->mTitle->invalidateCache(); // bad cache, 
said they were not synced
                        }
 
                        # If the user is allowed to review, prompt them!
                        # Only those if there is something to actually review.
-                       if ( count( $changeList ) || $newRev->getId() > 
$oldRev->getId() ) {
-                               $css = 'flaggedrevs_diffnotice plainlinks';
-                               if ( empty( $changeList ) && 
$wgUser->isAllowed( 'review' ) ) {
-                                       $form .= "<div id='mw-fr-difftostable' 
class='$css'>" .
-                                               wfMsgExt( 
'revreview-update-none', array( 'parseinline' ) ) .
-                                               $notice . '</div>';
-                               } elseif ( !empty( $changeList ) && 
$wgUser->isAllowed( 'review' ) ) {
-                                       $changeList = implode( ', ', 
$changeList );
-                                       $form .= "<div id='mw-fr-difftostable' 
class='$css'>" .
-                                               wfMsgExt( 'revreview-update', 
array( 'parseinline' ) ) .
-                                               '&nbsp;' . $changeList . 
$notice . '</div>';
-                               } elseif ( !empty( $changeList ) ) {
-                                       $changeList = implode( ', ', 
$changeList );
-                                       $form .= "<div id='mw-fr-difftostable' 
class='$css'>" .
-                                               wfMsgExt( 
'revreview-update-includes', array( 'parseinline' ) ) .
-                                               '&nbsp;' . $changeList . 
$notice . '</div>';
+                       if ( $newRev->getId() > $oldRev->getId() ) {
+                               # "Please review" notice...
+                               $changeDiv = wfMsgExt( 'revreview-update', 
'parse' );
+                               if ( count( $changeList ) ) {
+                                       # Add include change list...
+                                       $changeDiv .= '<p>' .
+                                               wfMsgExt( 
'revreview-update-includes', 'parseinline' ) .
+                                               '&nbsp;' . implode( ', ', 
$changeList ) . '</p>';
+                                       # Add include usage notice...
+                                       $changeDiv .= $notice;
                                }
+                               $css = 'flaggedrevs_diffnotice plainlinks';
+                               $form .= "<div id='mw-fr-difftostable' 
class='$css'>$changeDiv</div>\n";
                        }
 
                        # Set a key to note that someone is viewing this
-                       if ( $wgUser->isAllowed( 'review' ) ) {
-                               $this->markDiffUnderReview( $oldRev, $newRev );
-                       }
+                       $this->markDiffUnderReview( $oldRev, $newRev );
                }
-
-               # Add diff review form
-               if ( $wgUser->isAllowed( 'review' ) ) {
-                       $form .= $this->buildQuickReview();
+               # Add a link to diff from stable to current as needed
+               if ( $frev ) {
+                       $wgOut->addHTML( $this->diffToStableLink( $frev, 
$newRev ) );
                }
-
                # Show review status of the diff revision(s). Uses a <table>.
-               $form .= $this->diffReviewMarkers( $oldRev, $newRev );
+               $wgOut->addHTML( $this->diffReviewMarkers( $oldRev, $newRev ) );
 
-               $wgOut->addHtml( $form );
-
+               $this->diffNoticeBox = $form;
                return true;
        }
 
        /**
        * Add a link to diff-to-stable for reviewable pages
        */
-       protected function diffToStableLink( $frev ) {
+       protected function diffToStableLink( $frev, $newRev ) {
                global $wgUser, $wgOut;
                $this->load();
                $review = '';
-               # Make a link to the diff-to-stable if this is not already that 
diff
-               if ( $frev && !$this->isDiffFromStable ) {
+               # Make a link to the full diff-to-stable as needed
+               if ( !$this->isDiffFromStable || !$newRev->isCurrent() ) {
                        $review = $wgUser->getSkin()->makeKnownLinkObj(
                                $this->article->getTitle(),
                                wfMsgHtml( 'review-diff2stable' ),
@@ -1380,6 +1390,7 @@
                return $imgChanges;
        }
 
+       // Mark that someone is viewing a portion or all of the diff-to-stable
        protected function markDiffUnderReview( $oldRev, $newRev ) {
                global $wgMemc;
                $key = wfMemcKey( 'stableDiffs', 'underReview', 
$oldRev->getID(), $newRev->getID() );
@@ -1396,10 +1407,10 @@
                        if ( $newRev->getPage() != $oldRev->getPage() ) {
                                $this->isMultiPageDiff = true;
                        // Is there a stable version?
-                       } else if ( $this->article->isReviewable() ) {
-                               $frev = $this->article->getStableRev();
-                               // Is this a diff of the draft rev against the 
stable rev?
-                               if ( $frev && $frev->getRevId() == 
$oldRev->getId() && $newRev->isCurrent() ) {
+                       } elseif ( $this->article->isReviewable() ) {
+                               $srev = $this->article->getStableRev();
+                               // Is this a diff of a draft rev against the 
stable rev?
+                               if ( $srev && $oldRev->getId() == 
$srev->getRevId() ) {
                                        $this->isDiffFromStable = true;
                                }
                        }
@@ -1498,185 +1509,6 @@
                return true;
        }
 
-        /**
-        * Generates a brief review form for a page.
-        * @return mixed (string/false)
-        */
-       public function buildQuickReview() {
-               global $wgOut, $wgUser, $wgRequest;
-               $this->load();
-               if ( $wgOut->isPrintable() ) {
-                       return false; // Must be on non-printable output 
-               }
-               # Get the revision being displayed
-               $id = $wgOut->getRevisionId();
-               if ( !$id ) {
-                       if ( $this->isDiffFromStable ) {
-                               $rev = Revision::newFromTitle( 
$this->article->getTitle() );
-                               $id = $rev->getId(); // if diff-to-stable, we 
know the revision is the current
-                       } else {
-                               return false; // only safe to assume current if 
diff-to-stable
-                       }
-               } else {
-                       $rev = Revision::newFromTitle( 
$this->article->getTitle(), $id );
-               }
-               # The revision must be valid and public
-               if ( !$rev || $rev->isDeleted( Revision::DELETED_TEXT ) ) {
-                       return false;
-               }
-               $useCurrent = false;
-               if ( !isset( $wgOut->mTemplateIds ) || !isset( 
$wgOut->fr_ImageSHA1Keys ) ) {
-                       $useCurrent = true; // we need to get Ids from parser 
output
-               }
-               $skin = $wgUser->getSkin();
-
-               $config = $this->article->getVisibilitySettings();
-               # Variable for sites with no flags, otherwise discarded
-               $approve = $wgRequest->getBool( 'wpApprove' );
-               # See if the version being displayed is flagged...
-               $frev = FlaggedRevision::newFromTitle( 
$this->article->getTitle(), $id );
-               $oldFlags = $frev
-                       ? $frev->getTags() // existing tags
-                       : FlaggedRevision::expandRevisionTags( '' ); // unset 
tags
-               # If we are reviewing updates to a page, start off with the 
stable revision's
-               # flags. Otherwise, we just fill them in with the selected 
revision's flags.
-               if ( $this->isDiffFromStable ) {
-                       $srev = $this->article->getStableRev();
-                       $flags = $srev->getTags();
-                       # Check if user is allowed to renew the stable version.
-                       # If not, then get the flags for the new revision 
itself.
-                       if ( !RevisionReview::userCanSetFlags( $oldFlags ) ) {
-                               $flags = $oldFlags;
-                       }
-                       $reviewNotes = $srev->getComment();
-                       # Re-review button is need for template/file only 
review case
-                       $allowRereview = ($srev->getRevId() == $id)
-                               && !FlaggedRevs::stableVersionIsSynced( $srev, 
$this->article );
-               } else {
-                       $flags = $oldFlags;
-                       // Get existing notes to pre-fill field
-                       $reviewNotes = $frev ? $frev->getComment() : "";
-                       $allowRereview = false; // re-review button
-               }
-
-               # Begin form...
-               $reviewTitle = SpecialPage::getTitleFor( 'RevisionReview' );
-               $action = $reviewTitle->getLocalUrl( 'action=submit' );
-               $params = array( 'method' => 'post', 'action' => $action, 'id' 
=> 'mw-fr-reviewform' );
-               $form = Xml::openElement( 'form', $params );
-               $form .= Xml::openElement( 'fieldset',
-                       array( 'class' => 'flaggedrevs_reviewform noprint' ) );
-               # Add appropriate legend text
-               $legendMsg = ( FlaggedRevs::binaryFlagging() && $allowRereview )
-                       ? 'revreview-reflag'
-                       : 'revreview-flag';
-               $form .= Xml::openElement( 'legend', array( 'id' => 
'mw-fr-reviewformlegend' ) );
-               $form .= "<strong>" . wfMsgHtml( $legendMsg ) . "</strong>";
-               $form .= Xml::closeElement( 'legend' ) . "\n";
-               # Show explanatory text
-               if ( !FlaggedRevs::lowProfileUI() ) {
-                       $form .= wfMsgExt( 'revreview-text', array( 'parse' ) );
-               }
-
-               # Disable form for unprivileged users
-               $uneditable = !$this->article->getTitle()->quickUserCan( 'edit' 
);
-               $disabled = !RevisionReview::userCanSetFlags( $flags ) || 
$uneditable;
-               if ( $disabled ) {
-                       $form .= Xml::openElement( 'div', array( 'class' => 
'fr-rating-controls-disabled',
-                               'id' => 'fr-rating-controls-disabled' ) );
-                       $toggle = array( 'disabled' => "disabled" );
-               } else {
-                       $form .= Xml::openElement( 'div', array( 'class' => 
'fr-rating-controls',
-                               'id' => 'fr-rating-controls' ) );
-                       $toggle = array();
-               }
-
-               # Add main checkboxes/selects
-               $form .= Xml::openElement( 'span', array( 'id' => 
'mw-fr-ratingselects' ) );
-               $form .= FlaggedRevsXML::ratingInputs( $flags, $config, 
$disabled, (bool)$frev );
-               $form .= Xml::closeElement( 'span' );
-               # Add review notes input
-               if ( FlaggedRevs::allowComments() && $wgUser->isAllowed( 
'validate' ) ) {
-                       $form .= "<div id='mw-fr-notebox'>\n";
-                       $form .= "<p>" . wfMsgHtml( 'revreview-notes' ) . 
"</p>\n";
-                       $form .= Xml::openElement( 'textarea', array( 'name' => 
'wpNotes', 'id' => 'wpNotes',
-                               'class' => 'fr-notes-box', 'rows' => '2', 
'cols' => '80' ) ) .
-                               htmlspecialchars( $reviewNotes ) .
-                               Xml::closeElement( 'textarea' ) . "\n";
-                       $form .= "</div>\n";
-               }
-
-               # Get versions of templates/files used
-               $imageParams = $templateParams = $fileVersion = '';
-               if ( $useCurrent ) {
-                       # Get parsed current version
-                       $parserCache = ParserCache::singleton();
-                       $article = $this->article;
-                       $currentOutput = $parserCache->get( $article, $wgUser );
-                       if ( $currentOutput == false ) {
-                               global $wgParser, $wgEnableParserCache;
-                               $text = $article->getContent();
-                               $title = $article->getTitle();
-                               $options = FlaggedRevs::makeParserOptions();
-                               $currentOutput = $wgParser->parse( $text, 
$title, $options );
-                               # Might as well save the cache while we're at it
-                               if ( $wgEnableParserCache )
-                                       $parserCache->save( $currentOutput, 
$article, $wgUser );
-                       }
-                       $templateIDs = $currentOutput->mTemplateIds;
-                       $imageSHA1Keys = $currentOutput->fr_ImageSHA1Keys;
-               } else {
-                       $templateIDs = $wgOut->mTemplateIds;
-                       $imageSHA1Keys = $wgOut->fr_ImageSHA1Keys;
-               }
-               list( $templateParams, $imageParams, $fileVersion ) =
-                       FlaggedRevs::getIncludeParams( $this->article, 
$templateIDs, $imageSHA1Keys );
-
-               $form .= Xml::openElement( 'span', array( 'style' => 
'white-space: nowrap;' ) );
-               # Hide comment input if needed
-               if ( !$disabled ) {
-                       if ( count( FlaggedRevs::getDimensions() ) > 1 )
-                               $form .= "<br />"; // Don't put too much on one 
line
-                       $form .= "<span id='mw-fr-commentbox' 
style='clear:both'>" .
-                               Xml::inputLabel( wfMsg( 'revreview-log' ), 
'wpReason', 'wpReason', 35, '',
-                                       array( 'class' => 'fr-comment-box' ) ) 
. "&nbsp;&nbsp;&nbsp;</span>";
-               }
-               # Add the submit buttons
-               $form .= FlaggedRevsXML::ratingSubmitButtons( $frev, 
(bool)$toggle, $allowRereview );
-               # Show stability log if there is anything interesting...
-               if( $this->article->isPageLocked() ) {
-                       $form .= ' ' . 
FlaggedRevsXML::logToggle('revreview-log-toggle-show');
-               }
-               $form .= Xml::closeElement( 'span' );
-               # ..add the actual stability log body here
-           if( $this->article->isPageLocked() ) {
-                       $form .= FlaggedRevsXML::stabilityLogExcerpt( 
$this->article );
-               }
-               $form .= Xml::closeElement( 'div' ) . "\n";
-
-               # Hidden params
-               $form .= Xml::hidden( 'title', $reviewTitle->getPrefixedText() 
) . "\n";
-               $form .= Xml::hidden( 'target', 
$this->article->getTitle()->getPrefixedDBKey() ) . "\n";
-               $form .= Xml::hidden( 'oldid', $id ) . "\n";
-               $form .= Xml::hidden( 'action', 'submit' ) . "\n";
-               $form .= Xml::hidden( 'wpEditToken', $wgUser->editToken() ) . 
"\n";
-               # Add review parameters
-               $form .= Xml::hidden( 'templateParams', $templateParams ) . 
"\n";
-               $form .= Xml::hidden( 'imageParams', $imageParams ) . "\n";
-               $form .= Xml::hidden( 'fileVersion', $fileVersion ) . "\n";
-               # Pass this in if given; useful for new page patrol
-               $form .= Xml::hidden( 'rcid', $wgRequest->getVal( 'rcid' ) ) . 
"\n";
-               # Special token to discourage fiddling...
-               $checkCode = RevisionReview::validationKey(
-                       $templateParams, $imageParams, $fileVersion, $id
-               );
-               $form .= Xml::hidden( 'validatedParams', $checkCode ) . "\n";
-
-               $form .= Xml::closeElement( 'fieldset' );
-               $form .= Xml::closeElement( 'form' );
-               return $form;
-       }
-
        /**
        * Updates parser cache output to included needed versioning params.
        */

Modified: trunk/extensions/FlaggedRevs/FlaggedRevsXML.php
===================================================================
--- trunk/extensions/FlaggedRevs/FlaggedRevsXML.php     2010-03-24 20:34:05 UTC 
(rev 64125)
+++ trunk/extensions/FlaggedRevs/FlaggedRevsXML.php     2010-03-24 21:02:35 UTC 
(rev 64126)
@@ -577,4 +577,176 @@
                        $article->getTitle()->getPrefixedText(), '', $params );
                return "<div id=\"mw-fr-logexcerpt\">$logHtml</div>";
        }
+       
+
+        /**
+        * Generates a brief review form for a page.
+        * @param FlaggedArticle $article
+        * @param Revision $rev
+        * @param array $templateIDs
+        * @param array $imageSHA1Keys
+        * @param bool $stableDiff this is a diff-to-stable 
+        * @return mixed (string/false)
+        */
+       public static function buildQuickReview(
+               $article, $rev, $templateIDs, $imageSHA1Keys, $stableDiff = 
false
+       ) {
+               global $wgUser, $wgRequest;
+               # The revision must be valid and public
+               if ( !$rev || $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+                       return false;
+               }
+               $id = $rev->getId();
+               $skin = $wgUser->getSkin();
+               # Do we need to get inclusion IDs from parser output?
+               $getPOut = ( $templateIDs && $imageSHA1Keys );
+
+               $config = $article->getVisibilitySettings();
+               # Variable for sites with no flags, otherwise discarded
+               $approve = $wgRequest->getBool( 'wpApprove' );
+               # See if the version being displayed is flagged...
+               $frev = FlaggedRevision::newFromTitle( $article->getTitle(), 
$id );
+               $oldFlags = $frev
+                       ? $frev->getTags() // existing tags
+                       : FlaggedRevision::expandRevisionTags( '' ); // unset 
tags
+               # If we are reviewing updates to a page, start off with the 
stable revision's
+               # flags. Otherwise, we just fill them in with the selected 
revision's flags.
+               if ( $stableDiff ) {
+                       $srev = $article->getStableRev();
+                       $flags = $srev->getTags();
+                       # Check if user is allowed to renew the stable version.
+                       # If not, then get the flags for the new revision 
itself.
+                       if ( !RevisionReview::userCanSetFlags( $oldFlags ) ) {
+                               $flags = $oldFlags;
+                       }
+                       $reviewNotes = $srev->getComment();
+                       # Re-review button is need for template/file only 
review case
+                       $allowRereview = ($srev->getRevId() == $id)
+                               && !FlaggedRevs::stableVersionIsSynced( $srev, 
$article );
+               } else {
+                       $flags = $oldFlags;
+                       // Get existing notes to pre-fill field
+                       $reviewNotes = $frev ? $frev->getComment() : "";
+                       $allowRereview = false; // re-review button
+               }
+
+               # Begin form...
+               $reviewTitle = SpecialPage::getTitleFor( 'RevisionReview' );
+               $action = $reviewTitle->getLocalUrl( 'action=submit' );
+               $params = array( 'method' => 'post', 'action' => $action, 'id' 
=> 'mw-fr-reviewform' );
+               $form = Xml::openElement( 'form', $params );
+               $form .= Xml::openElement( 'fieldset',
+                       array( 'class' => 'flaggedrevs_reviewform noprint' ) );
+               # Add appropriate legend text
+               $legendMsg = ( FlaggedRevs::binaryFlagging() && $allowRereview )
+                       ? 'revreview-reflag'
+                       : 'revreview-flag';
+               $form .= Xml::openElement( 'legend', array( 'id' => 
'mw-fr-reviewformlegend' ) );
+               $form .= "<strong>" . wfMsgHtml( $legendMsg ) . "</strong>";
+               $form .= Xml::closeElement( 'legend' ) . "\n";
+               # Show explanatory text
+               if ( !FlaggedRevs::lowProfileUI() ) {
+                       $form .= wfMsgExt( 'revreview-text', array( 'parse' ) );
+               }
+
+               # Disable form for unprivileged users
+               $uneditable = !$article->getTitle()->quickUserCan( 'edit' );
+               $disabled = !RevisionReview::userCanSetFlags( $flags ) || 
$uneditable;
+               if ( $disabled ) {
+                       $form .= Xml::openElement( 'div', array( 'class' => 
'fr-rating-controls-disabled',
+                               'id' => 'fr-rating-controls-disabled' ) );
+                       $toggle = array( 'disabled' => "disabled" );
+               } else {
+                       $form .= Xml::openElement( 'div', array( 'class' => 
'fr-rating-controls',
+                               'id' => 'fr-rating-controls' ) );
+                       $toggle = array();
+               }
+
+               # Add main checkboxes/selects
+               $form .= Xml::openElement( 'span', array( 'id' => 
'mw-fr-ratingselects' ) );
+               $form .= FlaggedRevsXML::ratingInputs( $flags, $config, 
$disabled, (bool)$frev );
+               $form .= Xml::closeElement( 'span' );
+               # Add review notes input
+               if ( FlaggedRevs::allowComments() && $wgUser->isAllowed( 
'validate' ) ) {
+                       $form .= "<div id='mw-fr-notebox'>\n";
+                       $form .= "<p>" . wfMsgHtml( 'revreview-notes' ) . 
"</p>\n";
+                       $form .= Xml::openElement( 'textarea',
+                               array( 'name' => 'wpNotes', 'id' => 'wpNotes',
+                                       'class' => 'fr-notes-box', 'rows' => 
'2', 'cols' => '80' ) ) .
+                               htmlspecialchars( $reviewNotes ) .
+                               Xml::closeElement( 'textarea' ) . "\n";
+                       $form .= "</div>\n";
+               }
+
+               # Get versions of templates/files used
+               $imageParams = $templateParams = $fileVersion = '';
+               if ( $getPOut ) {
+                       $pOutput = false; 
+                       # Current version: try parser cache
+                       if( $rev->isCurrent() ) {
+                               $parserCache = ParserCache::singleton();
+                               $pOutput = $parserCache->get( $article, $wgUser 
);
+                       }
+                       # Otherwise (or on cache miss), parse the rev text...
+                       if ( $pOutput == false ) {
+                               global $wgParser, $wgEnableParserCache;
+                               $text = $rev->getText();
+                               $title = $article->getTitle();
+                               $options = FlaggedRevs::makeParserOptions();
+                               $pOutput = $wgParser->parse( $text, $title, 
$options );
+                               # Might as well save the cache while we're at it
+                               if ( $rev->isCurrent() && $wgEnableParserCache 
) {
+                                       $parserCache->save( $pOutput, $article, 
$wgUser );
+                               }
+                       }
+                       $templateIDs = $pOutput->mTemplateIds;
+                       $imageSHA1Keys = $pOutput->fr_ImageSHA1Keys;
+               }
+               list( $templateParams, $imageParams, $fileVersion ) =
+                       FlaggedRevs::getIncludeParams( $article, $templateIDs, 
$imageSHA1Keys );
+
+               $form .= Xml::openElement( 'span', array( 'style' => 
'white-space: nowrap;' ) );
+               # Hide comment input if needed
+               if ( !$disabled ) {
+                       if ( count( FlaggedRevs::getDimensions() ) > 1 )
+                               $form .= "<br />"; // Don't put too much on one 
line
+                       $form .= "<span id='mw-fr-commentbox' 
style='clear:both'>" .
+                               Xml::inputLabel( wfMsg( 'revreview-log' ), 
'wpReason', 'wpReason', 35, '',
+                                       array( 'class' => 'fr-comment-box' ) ) 
. "&nbsp;&nbsp;&nbsp;</span>";
+               }
+               # Add the submit buttons
+               $form .= FlaggedRevsXML::ratingSubmitButtons( $frev, 
(bool)$toggle, $allowRereview );
+               # Show stability log if there is anything interesting...
+               if( $article->isPageLocked() ) {
+                       $form .= ' ' . 
FlaggedRevsXML::logToggle('revreview-log-toggle-show');
+               }
+               $form .= Xml::closeElement( 'span' );
+               # ..add the actual stability log body here
+           if( $article->isPageLocked() ) {
+                       $form .= FlaggedRevsXML::stabilityLogExcerpt( $article 
);
+               }
+               $form .= Xml::closeElement( 'div' ) . "\n";
+
+               # Hidden params
+               $form .= Xml::hidden( 'title', $reviewTitle->getPrefixedText() 
) . "\n";
+               $form .= Xml::hidden( 'target', 
$article->getTitle()->getPrefixedDBKey() ) . "\n";
+               $form .= Xml::hidden( 'oldid', $id ) . "\n";
+               $form .= Xml::hidden( 'action', 'submit' ) . "\n";
+               $form .= Xml::hidden( 'wpEditToken', $wgUser->editToken() ) . 
"\n";
+               # Add review parameters
+               $form .= Xml::hidden( 'templateParams', $templateParams ) . 
"\n";
+               $form .= Xml::hidden( 'imageParams', $imageParams ) . "\n";
+               $form .= Xml::hidden( 'fileVersion', $fileVersion ) . "\n";
+               # Pass this in if given; useful for new page patrol
+               $form .= Xml::hidden( 'rcid', $wgRequest->getVal( 'rcid' ) ) . 
"\n";
+               # Special token to discourage fiddling...
+               $checkCode = RevisionReview::validationKey(
+                       $templateParams, $imageParams, $fileVersion, $id
+               );
+               $form .= Xml::hidden( 'validatedParams', $checkCode ) . "\n";
+
+               $form .= Xml::closeElement( 'fieldset' );
+               $form .= Xml::closeElement( 'form' );
+               return $form;
+       }
 }

Modified: trunk/extensions/FlaggedRevs/language/FlaggedRevs.i18n.php
===================================================================
--- trunk/extensions/FlaggedRevs/language/FlaggedRevs.i18n.php  2010-03-24 
20:34:05 UTC (rev 64125)
+++ trunk/extensions/FlaggedRevs/language/FlaggedRevs.i18n.php  2010-03-24 
21:02:35 UTC (rev 64126)
@@ -170,10 +170,8 @@
 To deprecate a revision, set all fields to "unapproved".
 
 Please hit the "back" button in your browser and try again.',
-       'revreview-update'             => 'Please 
[[{{MediaWiki:Validationpage}}|review]] any changes \'\'(shown below)\'\' made 
since the published version was 
[{{fullurl:{{#Special:Log}}|type=review&page={{FULLPAGENAMEE}}}} approved].<br 
/>
-\'\'\'Some templates/files were updated:\'\'\'',
+       'revreview-update'             => 'Please 
[[{{MediaWiki:Validationpage}}|review]] any pending changes \'\'(shown 
below)\'\' made to the published version.',
        'revreview-update-includes'    => '\'\'\'Some templates/files were 
updated:\'\'\'',
-       'revreview-update-none'        => 'Please 
[[{{MediaWiki:Validationpage}}|review]] any changes \'\'(shown below)\'\' made 
since the published version was 
[{{fullurl:{{#Special:Log}}|type=review&page={{FULLPAGENAMEE}}}} approved].',
        'revreview-update-use'         => '\'\'\'NOTE:\'\'\' The published 
version of each of these templates/files is used in the published version of 
this page.',
        'revreview-visibility'         => '\'\'\'This page has an updated 
[[{{MediaWiki:Validationpage}}|published version]]; page stability settings can 
be [{{fullurl:{{#Special:Stabilization}}|page={{FULLPAGENAMEE}}}} 
configured].\'\'\'',
        'revreview-visibility2'        => '\'\'\'This page has an outdated 
[[{{MediaWiki:Validationpage}}|published version]]; page stability settings can 
be [{{fullurl:{{#Special:Stabilization}}|page={{FULLPAGENAMEE}}}} 
configured].\'\'\'',



_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to