
aaron at svn
May 11, 2008, 2:31 PM
Post #1 of 1
(18 views)
Permalink
|
|
SVN: [34632] trunk/extensions/FlaggedRevs
|
|
Revision: 34632 Author: aaron Date: 2008-05-11 21:31:04 +0000 (Sun, 11 May 2008) Log Message: ----------- Scap done already - bring back commits reverted in r34615 Modified Paths: -------------- trunk/extensions/FlaggedRevs/FlaggedArticle.php trunk/extensions/FlaggedRevs/FlaggedRevision.php trunk/extensions/FlaggedRevs/FlaggedRevs.php trunk/extensions/FlaggedRevs/FlaggedRevsPage.i18n.php trunk/extensions/FlaggedRevs/FlaggedRevsPage.php trunk/extensions/FlaggedRevs/FlaggedRevsXML.php trunk/extensions/FlaggedRevs/README.txt Modified: trunk/extensions/FlaggedRevs/FlaggedArticle.php =================================================================== --- trunk/extensions/FlaggedRevs/FlaggedArticle.php 2008-05-11 21:07:33 UTC (rev 34631) +++ trunk/extensions/FlaggedRevs/FlaggedArticle.php 2008-05-11 21:31:04 UTC (rev 34632) @@ -1,9 +1,8 @@ <?php -class FlaggedArticle { +class FlaggedArticle extends Article { public $isDiffFromStable = false; public $skipReviewDiff = false; - public $skipAutoReview = false; public $stableRev = null; public $pageconfig = null; public $flags = null; @@ -75,9 +74,7 @@ * Is this article reviewable? */ public function isReviewable() { - global $wgTitle; - - return FlaggedRevs::isPageReviewable( $wgTitle ); + return FlaggedRevs::isPageReviewable( $this->getTitle() ); } /** @@ -85,12 +82,7 @@ */ private function displayTag() { global $wgOut; - - if( !$this->reviewNotice ) { - return false; - } $wgOut->appendSubtitle( $this->reviewNotice ); - return true; } @@ -176,13 +168,7 @@ // behavior below, since it is the same as ("&stable=1"). if( $old ) { $revs_since = FlaggedRevs::getRevCountSince( $article, $frev->getRevId() ); - global $wgUseStableTemplates; - if( $wgUseStableTemplates ) { - $rev = Revision::newFromId( $frev->getRevId() ); - $text = $rev->getText(); - } else { - $text = $frev->getExpandedText(); - } + $text = $frev->getTextForParse(); $parserOut = FlaggedRevs::parseStableText( $article, $text, $frev->getRevId() ); # Construct some tagging for non-printable outputs. Note that the pending # notice has all this info already, so don't do this if we added that already. @@ -286,13 +272,7 @@ # Get parsed stable version $parserOut = FlaggedRevs::getPageCache( $article ); if( $parserOut==false ) { - global $wgUseStableTemplates; - if( $wgUseStableTemplates ) { - $rev = Revision::newFromId( $frev->getRevId() ); - $text = $rev->getText(); - } else { - $text = $frev->getExpandedText(); - } + $text = $frev->getTextForParse(); $parserOut = FlaggedRevs::parseStableText( $article, $text, $frev->getRevId() ); # Update the stable version cache FlaggedRevs::updatePageCache( $article, $parserOut ); @@ -314,6 +294,7 @@ // Standard UI } else { $msg = $quality ? 'revreview-quality' : 'revreview-basic'; + $msg .= ($revs_since == 0) ? '-i' : ''; $msg = $synced ? "{$msg}-same" : $msg; $tag = "<span class='{$css} plainlinks' title=\"{$tooltip}\"></span>" . @@ -405,7 +386,7 @@ * Adds latest stable version tag to page when editing */ public function addToEditView( $editform ) { - global $wgRequest, $wgTitle, $wgOut; + global $wgRequest, $wgOut; # Talk pages cannot be validated if( !$editform->mArticle || !$this->isReviewable() ) return false; @@ -422,7 +403,7 @@ $tag = $warning = ''; # Check the newest stable version $frev = $this->getStableRev(); - if( !is_null($frev) && $frev->getRevId() != $revid ) { + if( !is_null($frev) ) { global $wgLang, $wgUser, $wgFlaggedRevsAutoReview; $time = $wgLang->date( $frev->getTimestamp(), true ); @@ -441,26 +422,28 @@ wfMsgExt($msg,array('parseinline')) . "</div>"; } } - # Streamlined UI - if( FlaggedRevs::useSimpleUI() ) { - $msg = $quality ? 'revreview-newest-quality' : 'revreview-newest-basic'; - $tag = "<span class='fr-checkbox'></span>" . - wfMsgExt( $msg, array('parseinline'), $frev->getRevId(), $time, $revs_since ); - $tag = "<div id='mw-revisiontag-edit' class='flaggedrevs_editnotice plainlinks'>$tag</div>"; - # Standard UI - } else { - $msg = $quality ? 'revreview-newest-quality' : 'revreview-newest-basic'; - $tag = "<span class='fr-checkbox'></span>" . - wfMsgExt( $msg, array('parseinline'), $frev->getRevId(), $time, $revs_since ); - # Hide clutter - if( !empty($flags) ) { - $tag .= " <span id='mw-revisiontoggle' class='flaggedrevs_toggle' style='display:none;'" . - " onclick='toggleRevRatings()' title='" . wfMsgHtml('revreview-toggle-title') . "' >" . - wfMsg( 'revreview-toggle' ) . "</span>"; - $tag .= '<span id="mw-revisionratings" style="display:block;">' . - wfMsg('revreview-oldrating') . FlaggedRevsXML::addTagRatings( $flags ) . '</span>'; + if( $frev->getRevId() != $revid ) { + # Streamlined UI + if( FlaggedRevs::useSimpleUI() ) { + $msg = $quality ? 'revreview-newest-quality' : 'revreview-newest-basic'; + $tag = "<span class='fr-checkbox'></span>" . + wfMsgExt( $msg, array('parseinline'), $frev->getRevId(), $time, $revs_since ); + $tag = "<div id='mw-revisiontag-edit' class='flaggedrevs_editnotice plainlinks'>$tag</div>"; + # Standard UI + } else { + $msg = $quality ? 'revreview-newest-quality' : 'revreview-newest-basic'; + $tag = "<span class='fr-checkbox'></span>" . + wfMsgExt( $msg, array('parseinline'), $frev->getRevId(), $time, $revs_since ); + # Hide clutter + if( !empty($flags) ) { + $tag .= " <span id='mw-revisiontoggle' class='flaggedrevs_toggle' style='display:none;'" . + " onclick='toggleRevRatings()' title='" . wfMsgHtml('revreview-toggle-title') . "' >" . + wfMsg( 'revreview-toggle' ) . "</span>"; + $tag .= '<span id="mw-revisionratings" style="display:block;">' . + wfMsg('revreview-oldrating') . FlaggedRevsXML::addTagRatings( $flags ) . '</span>'; + } + $tag = "<div id='mw-revisiontag-edit' class='flaggedrevs_editnotice plainlinks'>$tag</div>"; } - $tag = "<div id='mw-revisiontag-edit' class='flaggedrevs_editnotice plainlinks'>$tag</div>"; } $wgOut->addHTML( $tag . $warning ); # Show diff to stable, to make things less confusing @@ -536,7 +519,7 @@ * Add link to stable version setting to protection form */ public function addVisibilityLink( $out ) { - global $wgUser, $wgRequest, $wgTitle; + global $wgUser, $wgRequest; if( !$this->isReviewable() ) return true; @@ -906,108 +889,6 @@ return true; } - - /** - * When a new page is made by a reviwer, try to automatically review it. - */ - public function maybeMakeNewPageReviewed( $article, $user, $text, $c, $flags, $a, $b, $flags, $rev ) { - global $wgFlaggedRevsAutoReviewNew; - - if( $this->skipAutoReview || !$wgFlaggedRevsAutoReviewNew || !$user->isAllowed('autoreview') ) - return true; - # Must be in reviewable namespace - if( !FlaggedRevs::isPageReviewable( $article->getTitle() ) ) - return true; - # Revision will be null for null edits - if( !$rev ) { - $this->skipReviewDiff = true; // Don't jump to diff... - return true; - } - # Assume basic flagging level - $flags = array(); - foreach( FlaggedRevs::$dimensions as $tag => $minQL ) { - $flags[$tag] = 1; - } - FlaggedRevs::autoReviewEdit( $article, $user, $text, $rev, $flags ); - - $this->skipReviewDiff = true; // Don't jump to diff... - $this->skipAutoReview = true; // Be sure not to do stuff twice - - return true; - } - - /** - * When an edit is made by a reviewer, if the current revision is the stable - * version, try to automatically review it. - */ - public function maybeMakeEditReviewed( $article, $user, $text, $c, $m, $a, $b, $flags, $rev ) { - global $wgFlaggedRevsAutoReview, $wgRequest; - - if( $this->skipAutoReview || !$wgFlaggedRevsAutoReview || !$user->isAllowed('autoreview') ) - return true; - # Must be in reviewable namespace - if( !FlaggedRevs::isPageReviewable( $article->getTitle() ) ) - return true; - # Revision will be null for null edits - if( !$rev ) { - $this->skipReviewDiff = true; // Don't jump to diff... - return true; - } - # Get the revision the incoming one was based off - $baseRevID = $wgRequest->getVal('baseRevId'); - $frev = FlaggedRevs::getFlaggedRev( $article->getTitle(), $baseRevID ); - # Is this an edit directly to the stable version? - if( is_null($frev) ) - return true; - # Assume basic flagging level - $flags = array(); - foreach( FlaggedRevs::$dimensions as $tag => $minQL ) { - $flags[$tag] = 1; - } - FlaggedRevs::autoReviewEdit( $article, $user, $text, $rev, $flags ); - - $this->skipReviewDiff = true; // Don't jump to diff... - $this->skipAutoReview = true; // Be sure not to do stuff twice - - return true; - } - - /** - * When a rollback is made by a reviwer, try to automatically review it. - */ - public function maybeMakeRollbackReviewed( $article, $user, $rev ) { - global $wgFlaggedRevsAutoReview; - - if( $this->skipAutoReview || !$wgFlaggedRevsAutoReview || !$user->isAllowed('autoreview') ) - return true; - # Must be in reviewable namespace - if( !FlaggedRevs::isPageReviewable( $article->getTitle() ) ) - return true; - # Was this revision flagged? - $frev = FlaggedRevs::getFlaggedRev( $article->getTitle(), $rev->getId() ); - if( is_null($frev) ) - return true; - # Grab the flags for this revision - $flags = FlaggedRevs::getRevisionTags( $article->getTitle(), $rev->getID() ); - # Check if user is allowed to renew the stable version. - if( !RevisionReview::userCanSetFlags( $flags ) ) { - # Assume basic flagging level - $flags = array(); - foreach( FlaggedRevs::$dimensions as $tag => $minQL ) { - $flags[$tag] = 1; - } - } - # Select the version that is now current. Create a new article object - # to avoid using one with outdated field data. - $article = new Article( $article->getTitle() ); - $newRev = Revision::newFromId( $article->getLatest() ); - FlaggedRevs::autoReviewEdit( $article, $user, $rev->getText(), $newRev, $flags ); - - $this->skipReviewDiff = true; // Don't jump to diff... - $this->skipAutoReview = true; // Be sure not to do stuff twice - - return true; - } /** * Add a hidden revision ID field to edit form. @@ -1047,8 +928,7 @@ return $this->stableRev; } # Get the content page, skip talk - global $wgTitle; - $title = $wgTitle->getSubjectPage(); + $title = $this->getTitle()->getSubjectPage(); # Do we have one? $srev = FlaggedRevs::getStablePageRev( $title, $getText, $forUpdate ); if( $srev ) { @@ -1066,13 +946,12 @@ * @returns Array (select,override) */ public function getVisibilitySettings( $forUpdate=false ) { - global $wgTitle; # Cached results available? if( !is_null($this->pageconfig) ) { return $this->pageconfig; } # Get the content page, skip talk - $title = $wgTitle->getSubjectPage(); + $title = $this->getTitle()->getSubjectPage(); $config = FlaggedRevs::getPageVisibilitySettings( $title, $forUpdate ); $this->pageconfig = $config; @@ -1085,12 +964,12 @@ * @eturns Array, output of the flags for a given revision */ public function getFlagsForRevision( $rev_id ) { - global $wgFlaggedRevTags, $wgTitle; + global $wgFlaggedRevTags; # Cached results? if( isset($this->flags[$rev_id]) && $this->flags[$rev_id] ) return $this->flags[$rev_id]; # Get the flags - $flags = FlaggedRevs::getRevisionTags( $wgTitle, $rev_id ); + $flags = FlaggedRevs::getRevisionTags( $this->getTitle(), $rev_id ); # Try to cache results $this->flags[$rev_id] = $flags; @@ -1104,7 +983,7 @@ * @param bool $top, should this form always go on top? */ public function addQuickReview( $out, $top = false ) { - global $wgOut, $wgTitle, $wgUser, $wgRequest, $wgFlaggedRevComments, $wgFlaggedRevsOverride; + global $wgOut, $wgUser, $wgRequest, $wgFlaggedRevComments, $wgFlaggedRevsOverride; # User must have review rights if( !$wgUser->isAllowed( 'review' ) ) { return; @@ -1233,16 +1112,16 @@ } } # For image pages, note the current image version - if( $wgTitle->getNamespace() == NS_IMAGE ) { - $file = wfFindFile( $wgTitle ); + if( $this->getTitle()->getNamespace() == NS_IMAGE ) { + $file = wfFindFile( $this->getTitle() ); if( $file ) { - $imageParams .= $wgTitle->getDBkey() . "|" . $file->getTimestamp() . "|" . $file->getSha1() . "#"; + $imageParams .= $this->getTitle()->getDBkey() . "|" . $file->getTimestamp() . "|" . $file->getSha1() . "#"; } } # Hidden params $form .= Xml::hidden( 'title', $reviewtitle->getPrefixedText() ) . "\n"; - $form .= Xml::hidden( 'target', $wgTitle->getPrefixedText() ) . "\n"; + $form .= Xml::hidden( 'target', $this->getTitle()->getPrefixedText() ) . "\n"; $form .= Xml::hidden( 'oldid', $id ) . "\n"; $form .= Xml::hidden( 'action', 'submit') . "\n"; $form .= Xml::hidden( 'wpEditToken', $wgUser->editToken() ) . "\n"; @@ -1310,11 +1189,18 @@ * If viewing a stable version, adjust the last modified header */ public function setLastModified( $sktmp, &$tpl ) { - global $wgArticle, $wgLang; + global $wgArticle, $wgLang, $wgRequest; # Non-content pages cannot be validated - if( !$this->pageOverride() ) + if( !$this->isReviewable() ) return true; + # Old stable versions + if( $wgRequest->getIntOrNull('stableid') ) { + $tpl->set('lastmod', false); + return true; + } # Check for an overridabe revision + if( !$this->pageOverride() ) + return true; $frev = $this->getStableRev( true ); if( !$frev || $frev->getRevId() == $wgArticle->getLatest() ) return true; @@ -1359,5 +1245,3 @@ return true; } } - - Modified: trunk/extensions/FlaggedRevs/FlaggedRevision.php =================================================================== --- trunk/extensions/FlaggedRevs/FlaggedRevision.php 2008-05-11 21:07:33 UTC (rev 34631) +++ trunk/extensions/FlaggedRevs/FlaggedRevision.php 2008-05-11 21:31:04 UTC (rev 34632) @@ -101,6 +101,13 @@ public function getComment() { return $this->mComment; } + + /** + * @returns Integer the user ID of the reviewer + */ + public function getUser() { + return $this->mUser; + } /** * @returns Integer revision timestamp in MW format @@ -123,12 +130,20 @@ $this->loadText(); // load if not loaded return $this->mText; } - + /** - * @returns Integer the user ID of the reviewer + * @returns mixed (string/false) expanded text or revision text. + * Depends on whether $wgUseStableTemplates is on or not. */ - public function getUser() { - return $this->mUser; + public function getTextForParse() { + global $wgUseStableTemplates; + if( $wgUseStableTemplates ) { + $rev = Revision::newFromId( $this->getRevId() ); + $text = $rev->getText(); + } else { + $text = $this->getExpandedText(); + } + return $text; } /** Modified: trunk/extensions/FlaggedRevs/FlaggedRevs.php =================================================================== --- trunk/extensions/FlaggedRevs/FlaggedRevs.php 2008-05-11 21:07:33 UTC (rev 34631) +++ trunk/extensions/FlaggedRevs/FlaggedRevs.php 2008-05-11 21:31:04 UTC (rev 34632) @@ -14,7 +14,7 @@ $wgExtensionCredits['specialpage'][] = array( 'name' => 'Flagged Revisions', 'author' => array( 'Aaron Schulz', 'Joerg Baach' ), - 'version' => '1.041', + 'version' => '1.042', 'url' => 'http://www.mediawiki.org/wiki/Extension:FlaggedRevs', 'descriptionmsg' => 'flaggedrevs-desc', ); @@ -223,7 +223,7 @@ global $wgOut, $wgHooks, $wgLang, $wgFlaggedArticle, $wgUseRCPatrol; # Initialize FlaggedRevs::load(); - $wgFlaggedArticle = new FlaggedArticle(); + $wgFlaggedArticle = null; wfLoadExtensionMessages( 'FlaggedRevsPage' ); @@ -238,28 +238,8 @@ define( 'FLAGGED_JS', $wgScriptPath . '/extensions/FlaggedRevs/flaggedrevs.js?' . $wgFlaggedRevStyleVersion ); ######### Hook attachments ######### - $wgHooks['OutputPageParserOutput'][] = 'FlaggedRevs::InjectStyleAndJS'; - $wgHooks['EditPage::showEditForm:initial'][] = 'FlaggedRevs::InjectStyleAndJS'; - $wgHooks['PageHistoryBeforeList'][] = 'FlaggedRevs::InjectStyleAndJS'; - # Main hooks, overrides pages content, adds tags, sets tabs and permalink - $wgHooks['SkinTemplateTabs'][] = array( $wgFlaggedArticle, 'setActionTabs' ); - # Change last-modified footer - $wgHooks['SkinTemplateOutputPageBeforeExec'][] = array( $wgFlaggedArticle, 'setLastModified' ); - # Update older, incomplete, page caches (ones that lack template Ids/image timestamps) - $wgHooks['ArticleViewHeader'][] = array( $wgFlaggedArticle, 'maybeUpdateMainCache' ); - $wgHooks['ArticleViewHeader'][] = array( $wgFlaggedArticle, 'setPageContent' ); - $wgHooks['ArticleViewHeader'][] = array( $wgFlaggedArticle, 'addPatrolLink' ); - # Set image version - $wgHooks['ArticleFromTitle'][] = array( $wgFlaggedArticle, 'setImageVersion' ); - # Add page notice - $wgHooks['SkinTemplateBuildNavUrlsNav_urlsAfterPermalink'][] = array( $wgFlaggedArticle, 'setPermaLink' ); - # Add tags do edit view - $wgHooks['EditPage::showEditForm:initial'][] = array( $wgFlaggedArticle, 'addToEditView' ); - # Add review form - $wgHooks['BeforePageDisplay'][] = array( $wgFlaggedArticle, 'addReviewForm' ); - $wgHooks['BeforePageDisplay'][] = array( $wgFlaggedArticle, 'addVisibilityLink' ); - # Mark of items in page history - $wgHooks['PageHistoryLineEnding'][] = array( $wgFlaggedArticle, 'addToHistLine' ); + # Set $wgFlaggedArticle + $wgHooks['ArticleFromTitle'][] = 'wfInitFlaggedArticle'; # Autopromote Editors $wgHooks['ArticleSaveComplete'][] = 'FlaggedRevs::autoPromoteUser'; # Adds table link references to include ones from the stable version @@ -281,17 +261,10 @@ # Additional parser versioning $wgHooks['ParserAfterTidy'][] = 'FlaggedRevs::parserInjectTimestamps'; $wgHooks['OutputPageParserOutput'][] = 'FlaggedRevs::outputInjectTimestamps'; - # Page review on edit - $wgHooks['ArticleUpdateBeforeRedirect'][] = array( $wgFlaggedArticle, 'injectReviewDiffURLParams' ); - $wgHooks['DiffViewHeader'][] = array( $wgFlaggedArticle, 'addPatrolAndDiffLink' ); - $wgHooks['DiffViewHeader'][] = array( $wgFlaggedArticle, 'addDiffNoticeAndIncludes' ); - # Autoreview stuff - $wgHooks['EditPage::showEditForm:fields'][] = array( $wgFlaggedArticle, 'addRevisionIDField' ); - $wgHooks['ArticleInsertComplete'][] = array( $wgFlaggedArticle, 'maybeMakeNewPageReviewed' ); - $wgHooks['ArticleSaveComplete'][] = array( $wgFlaggedArticle, 'maybeMakeEditReviewed' ); - $wgHooks['ArticleRollbackComplete'][] = array( $wgFlaggedArticle, 'maybeMakeRollbackReviewed' ); + # Auto-reviewing $wgHooks['ArticleSaveComplete'][] = 'FlaggedRevs::autoMarkPatrolled'; - $wgHooks['RevisionInsertComplete'][] = 'FlaggedRevs::maybeMakeNullEditReviewed'; + $wgHooks['RevisionInsertComplete'][] = 'FlaggedRevs::maybeMakeEditReviewed'; + $wgHooks['ArticleRollbackComplete'][] = 'FlaggedRevs::maybeMakeRollbackReviewed'; # Disallow moves of stable pages $wgHooks['userCan'][] = 'FlaggedRevs::userCanMove'; $wgHooks['userCan'][] = 'FlaggedRevs::userCanView'; @@ -307,6 +280,44 @@ ######### } +function wfInitFlaggedArticle( $title, $article ) { + global $wgFlaggedArticle, $wgHooks; + if( !FlaggedRevs::isPageReviewable( $title ) ) + return true; + # Initialize and set article hooks + $wgFlaggedArticle = new FlaggedArticle( $title ); + # Main hooks, overrides pages content, adds tags, sets tabs and permalink + $wgHooks['SkinTemplateTabs'][] = array( $wgFlaggedArticle, 'setActionTabs' ); + # Change last-modified footer + $wgHooks['SkinTemplateOutputPageBeforeExec'][] = array( $wgFlaggedArticle, 'setLastModified' ); + # Update older, incomplete, page caches (ones that lack template Ids/image timestamps) + $wgHooks['ArticleViewHeader'][] = array( $wgFlaggedArticle, 'maybeUpdateMainCache' ); + $wgHooks['ArticleViewHeader'][] = array( $wgFlaggedArticle, 'setPageContent' ); + $wgHooks['ArticleViewHeader'][] = array( $wgFlaggedArticle, 'addPatrolLink' ); + # Set image version + $wgHooks['ArticleFromTitle'][] = array( $wgFlaggedArticle, 'setImageVersion' ); + # Add page notice + $wgHooks['SkinTemplateBuildNavUrlsNav_urlsAfterPermalink'][] = array( $wgFlaggedArticle, 'setPermaLink' ); + # Add tags do edit view + $wgHooks['EditPage::showEditForm:initial'][] = array( $wgFlaggedArticle, 'addToEditView' ); + # Add review form + $wgHooks['BeforePageDisplay'][] = array( $wgFlaggedArticle, 'addReviewForm' ); + $wgHooks['BeforePageDisplay'][] = array( $wgFlaggedArticle, 'addVisibilityLink' ); + # Mark of items in page history + $wgHooks['PageHistoryLineEnding'][] = array( $wgFlaggedArticle, 'addToHistLine' ); + # Page review on edit + $wgHooks['ArticleUpdateBeforeRedirect'][] = array( $wgFlaggedArticle, 'injectReviewDiffURLParams' ); + $wgHooks['DiffViewHeader'][] = array( $wgFlaggedArticle, 'addPatrolAndDiffLink' ); + $wgHooks['DiffViewHeader'][] = array( $wgFlaggedArticle, 'addDiffNoticeAndIncludes' ); + # Autoreview stuff + $wgHooks['EditPage::showEditForm:fields'][] = array( $wgFlaggedArticle, 'addRevisionIDField' ); + # Add CSS/JS + $wgHooks['OutputPageParserOutput'][] = 'FlaggedRevs::InjectStyleAndJS'; + $wgHooks['EditPage::showEditForm:initial'][] = 'FlaggedRevs::InjectStyleAndJS'; + $wgHooks['PageHistoryBeforeList'][] = 'FlaggedRevs::InjectStyleAndJS'; + return true; +} + # Add review log and such $wgLogTypes[] = 'review'; $wgLogNames['review'] = 'review-logpage'; @@ -326,25 +337,6 @@ $wgHooks['LoadExtensionSchemaUpdates'][] = 'efFlaggedRevsSchemaUpdates'; -function efFlaggedRevsSchemaUpdates() { - global $wgDBtype, $wgExtNewFields, $wgExtPGNewFields, $wgExtNewIndexes, $wgExtNewTables; - - $base = dirname(__FILE__); - if( $wgDBtype == 'mysql' ) { - $wgExtNewFields[] = array( 'flaggedpage_config', 'fpc_expiry', "$base/archives/patch-fpc_expiry.sql" ); - $wgExtNewIndexes[] = array('flaggedpage_config', 'fpc_expiry', "$base/archives/patch-expiry-index.sql" ); - $wgExtNewTables[] = array( 'flaggedrevs_promote', "$base/archives/patch-flaggedrevs_promote.sql" ); - $wgExtNewTables[] = array( 'flaggedpages', "$base/archives/patch-flaggedpages.sql" ); - } else if( $wgDBtype == 'postgres' ) { - $wgExtPGNewFields[] = array('flaggedpage_config', 'fpc_expiry', "TIMESTAMPTZ NULL" ); - $wgExtNewIndexes[] = array('flaggedpage_config', 'fpc_expiry', "$base/postgres/patch-expiry-index.sql" ); - $wgExtNewTables[] = array( 'flaggedrevs_promote', "$base/postgres/patch-flaggedrevs_promote.sql" ); - $wgExtNewTables[] = array( 'flaggedpages', "$base/postgres/patch-flaggedpages.sql" ); - } - - return true; -} - class FlaggedRevs { public static $dimensions = array(); public static $styleLoaded = false; @@ -434,14 +426,14 @@ */ public static function parseStableText( $article, $text='', $id, $reparsed = true ) { global $wgParser; + $title = $article->getTitle(); // avoid pass-by-reference error # Make our hooks to trigger $wgParser->fr_isStable = true; $wgParser->fr_includesMatched = true; # Don't show section-edit links, they can be old and misleading $options = self::makeParserOptions(); - $options->setEditSection( $id==$article->getLatest() ); + $options->setEditSection( $id == $title->getLatestRevID(GAID_FOR_UPDATE) ); # Parse the new body, wikitext -> html - $title = $article->getTitle(); // avoid pass-by-reference error $parserOut = $wgParser->parse( $text, $title, $options, true, true, $id ); $parserOut->fr_includesMatched = $wgParser->fr_includesMatched; # Done with parser! @@ -490,14 +482,14 @@ /** * @param FlaggedRevision $frev * @param Article $article - * @param ParserOutput $flaggedOutput, will fetch if not given + * @param ParserOutput $stableOutput, will fetch if not given * @param ParserOutput $currentOutput, will fetch if not given * @return bool * See if a flagged revision is synced with the current */ - public static function flaggedRevIsSynced( $frev, $article, $flaggedOutput=null, $currentOutput=null ) { + public static function flaggedRevIsSynced( $frev, $article, $stableOutput=null, $currentOutput=null ) { # Must be the same revision - if( $frev->getRevId() != $article->getLatest() ) { + if( $frev->getRevId() != $article->getTitle()->getLatestRevID(GAID_FOR_UPDATE) ) { return false; } global $wgMemc; @@ -513,20 +505,14 @@ } } # If parseroutputs not given, fetch them... - if( is_null($flaggedOutput) || !isset($flaggedOutput->fr_newestTemplateID) ) { + if( is_null($stableOutput) || !isset($stableOutput->fr_newestTemplateID) ) { # Get parsed stable version - $flaggedOutput = FlaggedRevs::getPageCache( $article ); - if( $flaggedOutput==false ) { - global $wgUseStableTemplates; - if( $wgUseStableTemplates ) { - $rev = Revision::newFromId( $frev->getRevId() ); - $text = $rev->getText(); - } else { - $text = $frev->getExpandedText(); - } - $flaggedOutput = FlaggedRevs::parseStableText( $article, $text, $frev->getRevId() ); + $stableOutput = self::getPageCache( $article ); + if( $stableOutput==false ) { + $text = $frev->getTextForParse(); + $stableOutput = self::parseStableText( $article, $text, $frev->getRevId() ); # Update the stable version cache - FlaggedRevs::updatePageCache( $article, $flaggedOutput ); + self::updatePageCache( $article, $stableOutput ); } } if( is_null($currentOutput) || !isset($currentOutput->fr_newestTemplateID) ) { @@ -540,15 +526,17 @@ $options = self::makeParserOptions( $wgUser ); $currentOutput = $wgParser->parse( $text, $title, $options ); # Might as well save the cache while we're at it - $parserCache->save( $currentOutput, $article, $wgUser ); + global $wgEnableParserCache; + if( $wgEnableParserCache ) + $parserCache->save( $currentOutput, $article, $wgUser ); } } # Only current of revisions of inclusions can be reviewed. Since the stable and current revisions # have the same text, the only thing that can make them different is updating a template or image. # If this is the case, the current revision will have a newer template or image version used somewhere. - if( $currentOutput->fr_newestImageTime > $flaggedOutput->fr_newestImageTime ) { + if( $currentOutput->fr_newestImageTime > $stableOutput->fr_newestImageTime ) { $synced = false; - } else if( $currentOutput->fr_newestTemplateID > $flaggedOutput->fr_newestTemplateID ) { + } else if( $currentOutput->fr_newestTemplateID > $stableOutput->fr_newestTemplateID ) { $synced = false; } else { $synced = true; @@ -558,7 +546,7 @@ global $wgParserCacheExpireTime; $syncData = $synced ? "true" : "false"; $wgMemc->set( $key, $syncData, $wgParserCacheExpireTime ); - + return $synced; } @@ -658,7 +646,6 @@ if( $row ) { return new FlaggedRevision( $title, $row ); } - return null; } @@ -670,11 +657,13 @@ */ public static function getRevQuality( $title, $rev_id, $db = NULL ) { $db = $db ? $db : wfGetDB( DB_SLAVE ); - $quality = $db->selectField( 'flaggedrevs', 'fr_quality', + $quality = $db->selectField( 'flaggedrevs', + 'fr_quality', array( 'fr_page_id' => $title->getArticleID(), 'fr_rev_id' => $rev_id ), __METHOD__, - array( 'FORCE INDEX' => 'PRIMARY' ) ); + array( 'FORCE INDEX' => 'PRIMARY' ) + ); return $quality; } @@ -765,7 +754,7 @@ # Check if the count is zero by using $article->getLatest(). # I don't trust using memcache and PHP for values like '0' # as it may confuse "expired" with "0". -aaron - if( $article->getLatest()==$from_rev ) { + if( $article->getTitle()->getLatestRevID(GAID_FOR_UPDATE) == $from_rev ) { return 0; } global $wgMemc; @@ -873,7 +862,7 @@ public static function getRevisionTags( $title, $rev_id ) { $dbr = wfGetDB( DB_SLAVE ); $tags = $dbr->selectField( 'flaggedrevs', 'fr_tags', - array('fr_rev_id' => $rev_id, + array( 'fr_rev_id' => $rev_id, 'fr_page_id' => $title->getArticleId() ), __METHOD__ ); if( !$tags ) @@ -1045,10 +1034,10 @@ /** * Add FlaggedRevs css/js. Attached to two different hooks, neglect inputs. */ - public static function InjectStyleAndJS( $a=false, $b=false ) { + public static function InjectStyleAndJS() { global $wgOut, $wgJsMimeType, $wgFlaggedArticle; # Don't double-load - if( self::$styleLoaded ) + if( self::$styleLoaded || !$wgFlaggedArticle ) return true; # UI CSS $wgOut->addLink( array( @@ -1104,19 +1093,18 @@ $quality = self::isPristine($flags) ? 2 : 1; } $tmpset = $imgset = array(); + $poutput = false; # Try the parser cache, should be set on the edit before this is called. # If not set or up to date, then parse it. Use master to avoid lag issues. - $poutput = false; $latestID = $article->getTitle()->getLatestRevID(GAID_FOR_UPDATE); - if( $latestID == $rev->getId() ) { - $parserCache = ParserCache::singleton(); - $poutput = $parserCache->get( $article, $user ); - } - if( $poutput==false ) { + if( $poutput == false ) { $options = self::makeParserOptions( $user ); - $poutput = $wgParser->parse( $text, $article->getTitle(), $options, true, true, $rev->getId() ); + $title = $article->getTitle(); // avoid pass-by-ref error + $poutput = $wgParser->parse( $text, $title, $options, true, true, $latestID ); # Might as well save the cache while we're at it - if( $latestID == $rev->getId() ) { + global $wgEnableParserCache; + if( $wgEnableParserCache && $latestID == $rev->getId() ) { + $parserCache = ParserCache::singleton(); $parserCache->save( $poutput, $article, $user ); } } @@ -1163,7 +1151,7 @@ $textFlags = self::compressText( $fulltext ); # Write to external storage if required - $storage = FlaggedRevs::getExternalStorage(); + $storage = self::getExternalStorage(); if( $storage ) { if( is_array($storage) ) { # Distribute storage across multiple clusters @@ -1219,7 +1207,7 @@ $sv = self::getStablePageRev( $article->getTitle(), false, true ); if( $sv && $sv->getRevId() == $rev->getId() ) { # Update stable cache - FlaggedRevs::updatePageCache( $article, $poutput ); + self::updatePageCache( $article, $poutput ); # Update page fields self::updateArticleOn( $article, $rev->getId(), $rev->getId() ); # Purge squid for this page only @@ -1353,7 +1341,9 @@ $options = self::makeParserOptions( $wgUser ); $poutput = $wgParser->parse($text, $article->getTitle(), $options); # Might as well save the cache while we're at it - $parserCache->save( $poutput, $article, $wgUser ); + global $wgEnableParserCache; + if( $wgEnableParserCache ) + $parserCache->save( $poutput, $article, $wgUser ); } $u = new LinksUpdate( $article->getTitle(), $poutput ); $u->doUpdate(); // this will trigger our hook to add stable links too... @@ -1390,12 +1380,7 @@ # Try stable version cache. This should be updated before this is called. $parserOut = self::getPageCache( $article ); if( $parserOut==false ) { - if( $wgUseStableTemplates ) { - $rev = Revision::newFromId( $sv->getRevId() ); - $text = $rev->getText(); - } else { - $text = $sv->getExpandedText(); - } + $text = $sv->getTextForParse(); # Parse the text $parserOut = self::parseStableText( $article, $text, $sv->getRevId() ); } @@ -1714,13 +1699,12 @@ * Don't let users vandalize pages by moving them. */ public static function userCanMove( $title, $user, $action, $result ) { - global $wgTitle; + global $wgTitle, $wgFlaggedArticle; if( $action != 'move' || !self::isPageReviewable( $title ) ) return true; # See if there is a stable version - if( $wgTitle && $wgTitle->equals( $title ) ) { - global $wgFlaggedArticle; + if( $wgFlaggedArticle && $wgTitle && $wgTitle->equals( $title ) ) { // Cache stable version while we are at it. $frev = $wgFlaggedArticle->getStableRev( true ); } else { @@ -1741,7 +1725,7 @@ * Allow users to view reviewed pages. */ public static function userCanView( $title, $user, $action, $result ) { - global $wgFlaggedRevsVisible, $wgFlaggedRevsTalkVisible, $wgTitle; + global $wgFlaggedRevsVisible, $wgFlaggedRevsTalkVisible, $wgTitle, $wgFlaggedArticle; # Assume $action may still not be set, in which case, treat it as 'view'... if( $action != 'read' ) return true; @@ -1757,7 +1741,7 @@ } # See if there is a stable version. Also, see if, given the page # config and URL params, the page can be overriden. - if( $wgTitle && $wgTitle->equals( $title ) ) { + if( $wgFlaggedArticle && $wgTitle && $wgTitle->equals( $title ) ) { global $wgFlaggedArticle; // Cache stable version while we are at it. if( $wgFlaggedArticle->pageOverride() && $wgFlaggedArticle->getStableRev( true ) ) { @@ -1772,42 +1756,89 @@ } /** - * When a null edit is made, autoreview if necessary + * When an edit is made by a reviewer, if the current revision is the stable + * version, try to automatically review it. */ - public static function maybeMakeNullEditReviewed( $rev ) { - $title = $rev->getTitle(); + public static function maybeMakeEditReviewed( $rev ) { + global $wgFlaggedRevsAutoReview, $wgFlaggedRevsAutoReviewNew, $wgFlaggedArticle, $wgRequest; + # Get the user + $user = User::newFromId( $rev->getUser() ); + if( !$wgFlaggedRevsAutoReview || !$user->isAllowed('autoreview') ) + return true; # GetTitle() for revisions uses slaves and wants page_id,rev_id to # match...this is bad if we *just* added it. - $title = $title ? $title : Title::newFromID( $rev->getPage() ); + $title = $rev->getTitle() ? $rev->getTitle() : Title::newFromID( $rev->getPage(), GAID_FOR_UPDATE ); + # Must be in reviewable namespace if( !$title || !self::isPageReviewable( $title ) ) { return true; } - $prevRevID = $title->getPreviousRevisionId( $rev->getId() ); - if( !$prevRevID ) - return true; - $prevRev = Revision::newFromID( $prevRevID ); - # Check for null edits - if( $prevRev && $prevRev->getTextId() == $rev->getTextId() ) { - $frev = FlaggedRevs::getFlaggedRev( $title, $prevRev->getId() ); - if( !is_null($frev) ) { - $article = new Article( $title ); - $flags = $frev->getTags(); - # Check if user is allowed to renew the stable version. - if( !RevisionReview::userCanSetFlags( $flags ) ) { - # Assume basic flagging level - $flags = array(); - foreach( FlaggedRevs::$dimensions as $tag => $minQL ) { - $flags[$tag] = 1; - } + $article = new Article( $title ); + # Revision will be null for null edits + if( $rev ) { + $frev = null; + $reviewableNewPage = false; + # Get the revision the incoming one was based off + $baseRevID = $wgRequest->getVal('baseRevId'); + if( $baseRevID ) { + $frev = self::getFlaggedRev( $article->getTitle(), $baseRevID ); + } else { + $prevRevID = $article->getTitle()->getPreviousRevisionId( $rev->getId() ); + $prevRev = $prevRevID ? Revision::newFromID( $prevRevID ) : null; + # Check for null edits + if( $prevRev && $prevRev->getTextId() == $rev->getTextId() ) { + $frev = self::getFlaggedRev( $title, $prevRev->getId() ); + # Check for new pages + } else if( !$prevRev ) { + $reviewableNewPage = $wgFlaggedRevsAutoReviewNew; } - $user = User::newFromId( $rev->getUser() ); - FlaggedRevs::autoReviewEdit( $article, $user, $rev->getText(), $rev, $flags ); } + # Is this an edit directly to the stable version? + if( $reviewableNewPage || !is_null($frev) ) { + # Assume basic flagging level + $flags = array(); + foreach( self::$dimensions as $tag => $minQL ) { + $flags[$tag] = 1; + } + self::autoReviewEdit( $article, $user, $rev->getText(), $rev, $flags ); + } } + if( $wgFlaggedArticle ) { + $wgFlaggedArticle->skipReviewDiff = true; // Don't jump to diff... + } return true; } /** + * When a rollback is made by a reviwer, try to automatically review it. + */ + public static function maybeMakeRollbackReviewed( $article, $user, $rev ) { + global $wgFlaggedRevsAutoReview, $wgFlaggedArticle; + if( !$wgFlaggedRevsAutoReview || !$user->isAllowed('autoreview') ) + return true; + # Must be in reviewable namespace + if( !self::isPageReviewable( $article->getTitle() ) ) + return true; + # Was this revision flagged? + $frev = self::getFlaggedRev( $article->getTitle(), $rev->getId() ); + if( !is_null($frev) ) { + # Assume basic flagging level + $flags = array(); + foreach( self::$dimensions as $tag => $minQL ) { + $flags[$tag] = 1; + } + $newRev = Revision::newFromId( $article->getTitle()->getLatestRevID(GAID_FOR_UPDATE) ); + if( $newRev ) { + self::autoReviewEdit( $article, $user, $rev->getText(), $newRev, $flags ); + self::articleLinksUpdate( $article ); // lame... + } + } + if( $wgFlaggedArticle ) { + $wgFlaggedArticle->skipReviewDiff = true; // Don't jump to diff... + } + return true; + } + + /** * When an edit is made to a page that can't be reviewed, autopatrol if allowed. * This is not loggged for perfomance reasons and no one cares if talk pages and such * are autopatrolled. @@ -2114,46 +2145,8 @@ * Add user preference to form HTML */ public static function injectPreferences( $form, $out ) { - global $wgUser; - - $out->addHTML( - Xml::openElement( 'fieldset' ) . - Xml::element( 'legend', null, wfMsgHtml('flaggedrevs-prefs') ) . - Xml::openElement( 'table' ) . - Xml::openElement( 'tr' ) . - '<td>' . wfCheck( 'wpFlaggedRevsStable', $form->mFlaggedRevsStable, - array('id' => 'wpFlaggedRevsStable') ) . '</td><td> ' . - wfLabel( wfMsg( 'flaggedrevs-prefs-stable' ), 'wpFlaggedRevsStable' ) . '</td>' . - Xml::closeElement( 'tr' ) . - Xml::openElement( 'tr' ) . - '<td>' . - Xml::radio( 'wpFlaggedRevsSUI', 0, $form->mFlaggedRevsSUI==0, array('id' => 'standardUI') ) . - '</td><td> ' . - Xml::label( wfMsgHtml('flaggedrevs-pref-UI-0'), 'standardUI' ) . - '</td>' . - Xml::closeElement( 'tr' ) . - Xml::openElement( 'tr' ) . - '<td>' . - Xml::radio( 'wpFlaggedRevsSUI', 1, $form->mFlaggedRevsSUI==1, array('id' => 'simpleUI') ) . - '</td><td> ' . - Xml::label( wfMsgHtml('flaggedrevs-pref-UI-1'), 'simpleUI' ) . - '</td>' - ); - if( $wgUser->isAllowed( 'review' ) ) { - $out->addHTML( - Xml::closeElement( 'tr' ) . - Xml::openElement( 'tr' ) . '<td><br/></td>' . Xml::closeElement( 'tr' ) . - Xml::openElement( 'tr' ) . - '<td>' . wfCheck( 'wpFlaggedRevsWatch', $form->mFlaggedRevsWatch, array('id' => 'wpFlaggedRevsWatch') ) . - '</td><td> ' . wfLabel( wfMsg( 'flaggedrevs-prefs-watch' ), 'wpFlaggedRevsWatch' ) . '</td>' - ); - } - $out->addHTML( - Xml::closeElement( 'tr' ) . - Xml::closeElement( 'table' ) . - Xml::closeElement( 'fieldset' ) - ); - + $prefsHtml = FlaggedRevsXML::stabilityPreferences( $form ); + $out->addHTML( $prefsHtml ); return true; } @@ -2213,4 +2206,21 @@ } } +function efFlaggedRevsSchemaUpdates() { + global $wgDBtype, $wgExtNewFields, $wgExtPGNewFields, $wgExtNewIndexes, $wgExtNewTables; + $base = dirname(__FILE__); + if( $wgDBtype == 'mysql' ) { + $wgExtNewFields[] = array( 'flaggedpage_config', 'fpc_expiry', "$base/archives/patch-fpc_expiry.sql" ); + $wgExtNewIndexes[] = array('flaggedpage_config', 'fpc_expiry', "$base/archives/patch-expiry-index.sql" ); + $wgExtNewTables[] = array( 'flaggedrevs_promote', "$base/archives/patch-flaggedrevs_promote.sql" ); + $wgExtNewTables[] = array( 'flaggedpages', "$base/archives/patch-flaggedpages.sql" ); + } else if( $wgDBtype == 'postgres' ) { + $wgExtPGNewFields[] = array('flaggedpage_config', 'fpc_expiry', "TIMESTAMPTZ NULL" ); + $wgExtNewIndexes[] = array('flaggedpage_config', 'fpc_expiry', "$base/postgres/patch-expiry-index.sql" ); + $wgExtNewTables[] = array( 'flaggedrevs_promote', "$base/postgres/patch-flaggedrevs_promote.sql" ); + $wgExtNewTables[] = array( 'flaggedpages', "$base/postgres/patch-flaggedpages.sql" ); + } + + return true; +} Modified: trunk/extensions/FlaggedRevs/FlaggedRevsPage.i18n.php =================================================================== --- trunk/extensions/FlaggedRevs/FlaggedRevsPage.i18n.php 2008-05-11 21:07:33 UTC (rev 34631) +++ trunk/extensions/FlaggedRevs/FlaggedRevsPage.i18n.php 2008-05-11 21:31:04 UTC (rev 34632) @@ -41,7 +41,7 @@ 'tooltip-ca-default' => 'Quality assurance settings', 'revreview-edited' => "'''Edits will be incorporated into the [[{{MediaWiki:Validationpage}}|stable version]] once an established user reviews them. -The ''draft'' is shown below.''' [{{fullurl:{{FULLPAGENAMEE}}|oldid=$1&diff=cur}} $2 {{plural:$2|change|changes}}] await review.", +The ''draft'' is shown below.''' [{{fullurl:{{FULLPAGENAMEE}}|oldid=$1&diff=cur}} $2 {{plural:$2|change awaits|changes await}}] review.", 'validationpage' => '{{ns:help}}:Article validation', @@ -66,6 +66,10 @@ The [{{fullurl:{{FULLPAGENAMEE}}|stable=0}} draft] has [{{fullurl:{{FULLPAGENAMEE}}|oldid=$1&diff=cur}} $3 {{plural:$3|change|changes}}] awaiting review.', 'revreview-quality' => 'This is the latest [[{{MediaWiki:Validationpage}}|quality]] revision, [{{fullurl:Special:Log|type=review&page={{FULLPAGENAMEE}}}} approved] on <i>$2</i>. The [{{fullurl:{{FULLPAGENAMEE}}|stable=0}} draft] has [{{fullurl:{{FULLPAGENAMEE}}|oldid=$1&diff=cur}} $3 {{plural:$3|change|changes}}] awaiting review.', + 'revreview-basic-i' => 'This is the latest [[{{MediaWiki:Validationpage}}|sighted]] revision, [{{fullurl:Special:Log|type=review&page={{FULLPAGENAMEE}}}} approved] on <i>$2</i>. +The [{{fullurl:{{FULLPAGENAMEE}}|stable=0}} draft] has [{{fullurl:{{FULLPAGENAMEE}}|oldid=$1&diff=cur}} template/image changes] awaiting review.', + 'revreview-quality-i' => 'This is the latest [[{{MediaWiki:Validationpage}}|quality]] revision, [{{fullurl:Special:Log|type=review&page={{FULLPAGENAMEE}}}} approved] on <i>$2</i>. +The [{{fullurl:{{FULLPAGENAMEE}}|stable=0}} draft] has [{{fullurl:{{FULLPAGENAMEE}}|oldid=$1&diff=cur}} template/image changes] awaiting review.', 'revreview-basic-same' => 'This is the latest [[{{MediaWiki:Validationpage}}|sighted]] revision ([{{fullurl:Special:Stableversions|page={{FULLPAGENAMEE}}}} list all]), [{{fullurl:Special:Log|type=review&page={{FULLPAGENAMEE}}}} approved] on <i>$2</i>.', 'revreview-quality-same' => 'This is the latest [[{{MediaWiki:Validationpage}}|quality]] revision ([{{fullurl:Special:Stableversions|page={{FULLPAGENAMEE}}}} list all]), [{{fullurl:Special:Log|type=review&page={{FULLPAGENAMEE}}}} approved] on <i>$2</i>.', 'revreview-basic-old' => 'This is a [[{{MediaWiki:Validationpage}}|sighted]] revision ([{{fullurl:Special:Stableversions|page={{FULLPAGENAMEE}}}} list all]), [{{fullurl:Special:Log|type=review&page={{FULLPAGENAMEE}}}} approved] on <i>$2</i>. Modified: trunk/extensions/FlaggedRevs/FlaggedRevsPage.php =================================================================== --- trunk/extensions/FlaggedRevs/FlaggedRevsPage.php 2008-05-11 21:07:33 UTC (rev 34631) +++ trunk/extensions/FlaggedRevs/FlaggedRevsPage.php 2008-05-11 21:31:04 UTC (rev 34632) @@ -594,7 +594,9 @@ $u = new LinksUpdate( $this->page, $poutput ); $u->doUpdate(); // Will trigger our hook to add stable links too... # Might as well save the cache, since it should be the same - $parserCache->save( $poutput, $article, $wgUser ); + global $wgEnableParserCache; + if( $wgEnableParserCache ) + $parserCache->save( $poutput, $article, $wgUser ); # Purge squid for this page only $article->getTitle()->purgeSquid(); @@ -646,7 +648,9 @@ # Clear the cache... $this->page->invalidateCache(); # Might as well save the cache - $parserCache->save( $poutput, $article, $wgUser ); + global $wgEnableParserCache; + if( $wgEnableParserCache ) + $parserCache->save( $poutput, $article, $wgUser ); # Purge squid for this page only $this->page->purgeSquid(); @@ -897,15 +901,17 @@ ' ' . Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "</p>\n" . "</fieldset></form>" ); - - $pager = new UnreviewedPagesPager( $this, $namespace, $category ); - if( $pager->getNumRows() ) { - $wgOut->addHTML( wfMsgExt('unreviewed-list', array('parse') ) ); - $wgOut->addHTML( $pager->getNavigationBar() ); - $wgOut->addHTML( "<ul>" . $pager->getBody() . "</ul>" ); - $wgOut->addHTML( $pager->getNavigationBar() ); - } else { - $wgOut->addHTML( wfMsgExt('unreviewed-none', array('parse') ) ); + # This will start to get slower... + if( $category || self::generalQueryOK() ) { + $pager = new UnreviewedPagesPager( $this, $namespace, $category ); + if( $pager->getNumRows() ) { + $wgOut->addHTML( wfMsgExt('unreviewed-list', array('parse') ) ); + $wgOut->addHTML( $pager->getNavigationBar() ); + $wgOut->addHTML( "<ul>" . $pager->getBody() . "</ul>" ); + $wgOut->addHTML( $pager->getNavigationBar() ); + } else { + $wgOut->addHTML( wfMsgExt('unreviewed-none', array('parse') ) ); + } } } @@ -945,6 +951,22 @@ array( 'LIMIT' => 5 ) ); return $res->numRows(); } + + /** + * There may be many pages, most of which are reviewed + */ + public static function generalQueryOK() { + global $wgFlaggedRevsNamespaces; + if( !wfQueriesMustScale() ) + return true; + # Get est. of fraction of pages that are reviewed + $dbr = wfGetDB( DB_SLAVE ); + $reviewedpages = $dbr->estimateRowCount( 'flaggedpages', '*', array(), __METHOD__ ); + $pages = $dbr->estimateRowCount( 'page', '*', array('page_namespace' => $wgFlaggedRevsNamespaces), __METHOD__ ); + $ratio = $pages/($pages - $reviewedpages); + # If dist. is normalized, # of rows scanned = $ratio * LIMIT (or until list runs out) + return ($ratio <= 100); + } } /** @@ -977,7 +999,6 @@ function getQueryInfo() { $conds = $this->mConds; - $tables = array( 'page', 'flaggedpages' ); $fields = array('page_namespace','page_title','page_len','fp_stable'); $conds[] = 'fp_reviewed IS NULL'; # Reviewable pages only @@ -986,69 +1007,26 @@ $conds['page_is_redirect'] = 0; # Filter by category if( $this->category ) { - $tables[] = 'categorylinks'; + $tables = array( 'categorylinks', 'page', 'flaggedpages' ); $fields[] = 'cl_sortkey'; $conds['cl_to'] = $this->category; $conds[] = 'cl_from = page_id'; $this->mIndexField = 'cl_sortkey'; + $useIndex = array( 'categorylinks' => 'cl_sortkey' ); } else { + $tables = array( 'page', 'flaggedpages' ); $fields[] = 'page_id'; $this->mIndexField = 'page_title'; + $useIndex = array( 'page' => 'name_title' ); } return array( 'tables' => $tables, 'fields' => $fields, 'conds' => $conds, - 'options' => array() + 'options' => array( 'USE INDEX' => $useIndex ), + 'join_conds' => array( 'flaggedpages' => array('LEFT JOIN','fp_page_id=page_id') ) ); } - - /** - * Do a query with specified parameters, rather than using the object - * context - * - * @param string $offset Index offset, inclusive - * @param integer $limit Exact query limit - * @param boolean $descending Query direction, false for ascending, true for descending - * @return ResultWrapper - */ - function reallyDoQuery( $offset, $limit, $descending ) { - $fname = __METHOD__ . ' (' . get_class( $this ) . ')'; - $info = $this->getQueryInfo(); - $tables = $info['tables']; - $fields = $info['fields']; - $conds = isset( $info['conds'] ) ? $info['conds'] : array(); - $options = isset( $info['options'] ) ? $info['options'] : array(); - if ( $descending ) { - $options['ORDER BY'] = $this->mIndexField; - $operator = '>'; - } else { - $options['ORDER BY'] = $this->mIndexField . ' DESC'; - $operator = '<'; - } - if ( $offset != '' ) { - $conds[] = $this->mIndexField . $operator . $this->mDb->addQuotes( $offset ); - } - $options['LIMIT'] = intval( $limit ); - # Get table names - list($flaggedpages,$page,$categorylinks) = $this->mDb->tableNamesN('flaggedpages','page','categorylinks'); - # Are we filtering via category? - if( in_array('categorylinks',$tables) ) { - $index = $this->mDb->useIndexClause('cl_sortkey'); // *sigh*... - $fromClause = "$categorylinks $index, $page"; - } else { - $index = $this->mDb->useIndexClause('name_title'); // *sigh*... - $fromClause = "$page $index"; - } - $sql = "SELECT ".implode(',',$fields). - " FROM $fromClause". - " LEFT JOIN $flaggedpages ON (fp_page_id=page_id)". - " WHERE ".$this->mDb->makeList($conds,LIST_AND). - " ORDER BY ".$options['ORDER BY']." LIMIT ".$options['LIMIT']; - # Do query! - $res = $this->mDb->query( $sql ); - return new ResultWrapper( $this->mDb, $res ); - } function getIndexField() { return $this->mIndexField; Modified: trunk/extensions/FlaggedRevs/FlaggedRevsXML.php =================================================================== --- trunk/extensions/FlaggedRevs/FlaggedRevsXML.php 2008-05-11 21:07:33 UTC (rev 34631) +++ trunk/extensions/FlaggedRevs/FlaggedRevsXML.php 2008-05-11 21:31:04 UTC (rev 34632) @@ -28,7 +28,7 @@ $name = $index !== 0 ? $name : wfMsg('blanknamespace'); - if($index === $selected) { + if( $index === $selected ) { $s .= "\t" . Xml::element("option", array("value" => $index, "selected" => "selected"), $name) . "\n"; } else { $s .= "\t" . Xml::element("option", array("value" => $index), $name) . "\n"; @@ -117,8 +117,12 @@ $msg = $quality ? 'revreview-quality-old' : 'revreview-basic-old'; $html = wfMsgExt($msg, array('parseinline'), $frev->getRevId(), $time ); } else { - $msg = $stable ? 'revreview-' : 'revreview-newest-'; - $msg .= $quality ? 'quality' : 'basic'; + if( $stable ) { + $msg = $quality ? 'revreview-quality' : 'revreview-basic'; + $msg .= ($revs_since == 0) ? '-i' : ''; + } else { + $msg = $quality ? 'revreview-newest-quality' : 'revreview-newest-basic'; + } $html = wfMsgExt($msg, array('parseinline'), $frev->getRevId(), $time, $revs_since ); } # Make fancy box... @@ -137,4 +141,45 @@ return $box; } + + /** + * Add user preference to form HTML + */ + public static function stabilityPreferences( $form ) { + global $wgUser; + + $html = Xml::openElement( 'fieldset' ) . + Xml::element( 'legend', null, wfMsgHtml('flaggedrevs-prefs') ) . + Xml::openElement( 'table' ) . + Xml::openElement( 'tr' ) . + '<td>' . wfCheck( 'wpFlaggedRevsStable', $form->mFlaggedRevsStable, + array('id' => 'wpFlaggedRevsStable') ) . '</td><td> ' . + wfLabel( wfMsg( 'flaggedrevs-prefs-stable' ), 'wpFlaggedRevsStable' ) . '</td>' . + Xml::closeElement( 'tr' ) . + Xml::openElement( 'tr' ) . + '<td>' . + Xml::radio( 'wpFlaggedRevsSUI', 0, $form->mFlaggedRevsSUI==0, array('id' => 'standardUI') ) . + '</td><td> ' . + Xml::label( wfMsgHtml('flaggedrevs-pref-UI-0'), 'standardUI' ) . + '</td>' . + Xml::closeElement( 'tr' ) . + Xml::openElement( 'tr' ) . + '<td>' . + Xml::radio( 'wpFlaggedRevsSUI', 1, $form->mFlaggedRevsSUI==1, array('id' => 'simpleUI') ) . + '</td><td> ' . + Xml::label( wfMsgHtml('flaggedrevs-pref-UI-1'), 'simpleUI' ) . + '</td>'; + if( $wgUser->isAllowed( 'review' ) ) { + $html .= Xml::closeElement( 'tr' ) . + Xml::openElement( 'tr' ) . '<td><br/></td>' . Xml::closeElement( 'tr' ) . + Xml::openElement( 'tr' ) . + '<td>' . wfCheck( 'wpFlaggedRevsWatch', $form->mFlaggedRevsWatch, array('id' => 'wpFlaggedRevsWatch') ) . + '</td><td> ' . wfLabel( wfMsg( 'flaggedrevs-prefs-watch' ), 'wpFlaggedRevsWatch' ) . '</td>'; + } + $html .= Xml::closeElement( 'tr' ) . + Xml::closeElement( 'table' ) . + Xml::closeElement( 'fieldset' ); + + return $html; + } } Modified: trunk/extensions/FlaggedRevs/README.txt =================================================================== --- trunk/extensions/FlaggedRevs/README.txt 2008-05-11 21:07:33 UTC (rev 34631) +++ trunk/extensions/FlaggedRevs/README.txt 2008-05-11 21:31:04 UTC (rev 34632) @@ -5,7 +5,7 @@ * Download the extension from SVN * (MySQL) Run the 'FlaggedRevs.sql' query, substituting in your wiki's table prefix. * (PostgreSQL) Use 'FlaggedRevs.pg.sql' instead. -* Upgrade to MediaWiki 1.12+ +* Upgrade to MediaWiki 1.13+ * Run 'maintenance/update.php' * Run 'maintenance/archives/populateSha1.php'. * Add the following line to 'LocalSettings.php': _______________________________________________ MediaWiki-CVS mailing list MediaWiki-CVS[at]lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs
|