
aaron at svn
May 11, 2008, 7:42 AM
Post #1 of 1
(12 views)
Permalink
|
|
SVN: [34615] trunk/extensions/FlaggedRevs
|
|
Revision: 34615 Author: aaron Date: 2008-05-11 14:42:02 +0000 (Sun, 11 May 2008) Log Message: ----------- * Revert back to r34539 (temporary) * Add tweak to avoid index miss 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 14:02:49 UTC (rev 34614) +++ trunk/extensions/FlaggedRevs/FlaggedArticle.php 2008-05-11 14:42:02 UTC (rev 34615) @@ -1,8 +1,9 @@ <?php -class FlaggedArticle extends Article { +class FlaggedArticle { public $isDiffFromStable = false; public $skipReviewDiff = false; + public $skipAutoReview = false; public $stableRev = null; public $pageconfig = null; public $flags = null; @@ -74,7 +75,9 @@ * Is this article reviewable? */ public function isReviewable() { - return FlaggedRevs::isPageReviewable( $this->getTitle() ); + global $wgTitle; + + return FlaggedRevs::isPageReviewable( $wgTitle ); } /** @@ -82,7 +85,12 @@ */ private function displayTag() { global $wgOut; + + if( !$this->reviewNotice ) { + return false; + } $wgOut->appendSubtitle( $this->reviewNotice ); + return true; } @@ -168,7 +176,13 @@ // behavior below, since it is the same as ("&stable=1"). if( $old ) { $revs_since = FlaggedRevs::getRevCountSince( $article, $frev->getRevId() ); - $text = $frev->getTextForParse(); + global $wgUseStableTemplates; + if( $wgUseStableTemplates ) { + $rev = Revision::newFromId( $frev->getRevId() ); + $text = $rev->getText(); + } else { + $text = $frev->getExpandedText(); + } $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. @@ -272,7 +286,13 @@ # Get parsed stable version $parserOut = FlaggedRevs::getPageCache( $article ); if( $parserOut==false ) { - $text = $frev->getTextForParse(); + global $wgUseStableTemplates; + if( $wgUseStableTemplates ) { + $rev = Revision::newFromId( $frev->getRevId() ); + $text = $rev->getText(); + } else { + $text = $frev->getExpandedText(); + } $parserOut = FlaggedRevs::parseStableText( $article, $text, $frev->getRevId() ); # Update the stable version cache FlaggedRevs::updatePageCache( $article, $parserOut ); @@ -294,7 +314,6 @@ // 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>" . @@ -386,7 +405,7 @@ * Adds latest stable version tag to page when editing */ public function addToEditView( $editform ) { - global $wgRequest, $wgOut; + global $wgRequest, $wgTitle, $wgOut; # Talk pages cannot be validated if( !$editform->mArticle || !$this->isReviewable() ) return false; @@ -403,7 +422,7 @@ $tag = $warning = ''; # Check the newest stable version $frev = $this->getStableRev(); - if( !is_null($frev) ) { + if( !is_null($frev) && $frev->getRevId() != $revid ) { global $wgLang, $wgUser, $wgFlaggedRevsAutoReview; $time = $wgLang->date( $frev->getTimestamp(), true ); @@ -422,28 +441,26 @@ wfMsgExt($msg,array('parseinline')) . "</div>"; } } - 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>"; + # 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>"; } $wgOut->addHTML( $tag . $warning ); # Show diff to stable, to make things less confusing @@ -519,7 +536,7 @@ * Add link to stable version setting to protection form */ public function addVisibilityLink( $out ) { - global $wgUser, $wgRequest; + global $wgUser, $wgRequest, $wgTitle; if( !$this->isReviewable() ) return true; @@ -889,6 +906,108 @@ 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. @@ -928,7 +1047,8 @@ return $this->stableRev; } # Get the content page, skip talk - $title = $this->getTitle()->getSubjectPage(); + global $wgTitle; + $title = $wgTitle->getSubjectPage(); # Do we have one? $srev = FlaggedRevs::getStablePageRev( $title, $getText, $forUpdate ); if( $srev ) { @@ -946,12 +1066,13 @@ * @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 = $this->getTitle()->getSubjectPage(); + $title = $wgTitle->getSubjectPage(); $config = FlaggedRevs::getPageVisibilitySettings( $title, $forUpdate ); $this->pageconfig = $config; @@ -964,12 +1085,12 @@ * @eturns Array, output of the flags for a given revision */ public function getFlagsForRevision( $rev_id ) { - global $wgFlaggedRevTags; + global $wgFlaggedRevTags, $wgTitle; # Cached results? if( isset($this->flags[$rev_id]) && $this->flags[$rev_id] ) return $this->flags[$rev_id]; # Get the flags - $flags = FlaggedRevs::getRevisionTags( $this->getTitle(), $rev_id ); + $flags = FlaggedRevs::getRevisionTags( $wgTitle, $rev_id ); # Try to cache results $this->flags[$rev_id] = $flags; @@ -983,7 +1104,7 @@ * @param bool $top, should this form always go on top? */ public function addQuickReview( $out, $top = false ) { - global $wgOut, $wgUser, $wgRequest, $wgFlaggedRevComments, $wgFlaggedRevsOverride; + global $wgOut, $wgTitle, $wgUser, $wgRequest, $wgFlaggedRevComments, $wgFlaggedRevsOverride; # User must have review rights if( !$wgUser->isAllowed( 'review' ) ) { return; @@ -1112,16 +1233,16 @@ } } # For image pages, note the current image version - if( $this->getTitle()->getNamespace() == NS_IMAGE ) { - $file = wfFindFile( $this->getTitle() ); + if( $wgTitle->getNamespace() == NS_IMAGE ) { + $file = wfFindFile( $wgTitle ); if( $file ) { - $imageParams .= $this->getTitle()->getDBkey() . "|" . $file->getTimestamp() . "|" . $file->getSha1() . "#"; + $imageParams .= $wgTitle->getDBkey() . "|" . $file->getTimestamp() . "|" . $file->getSha1() . "#"; } } # Hidden params $form .= Xml::hidden( 'title', $reviewtitle->getPrefixedText() ) . "\n"; - $form .= Xml::hidden( 'target', $this->getTitle()->getPrefixedText() ) . "\n"; + $form .= Xml::hidden( 'target', $wgTitle->getPrefixedText() ) . "\n"; $form .= Xml::hidden( 'oldid', $id ) . "\n"; $form .= Xml::hidden( 'action', 'submit') . "\n"; $form .= Xml::hidden( 'wpEditToken', $wgUser->editToken() ) . "\n"; @@ -1189,18 +1310,11 @@ * If viewing a stable version, adjust the last modified header */ public function setLastModified( $sktmp, &$tpl ) { - global $wgArticle, $wgLang, $wgRequest; + global $wgArticle, $wgLang; # Non-content pages cannot be validated - if( !$this->isReviewable() ) + if( !$this->pageOverride() ) 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; @@ -1245,3 +1359,5 @@ return true; } } + + Modified: trunk/extensions/FlaggedRevs/FlaggedRevision.php =================================================================== --- trunk/extensions/FlaggedRevs/FlaggedRevision.php 2008-05-11 14:02:49 UTC (rev 34614) +++ trunk/extensions/FlaggedRevs/FlaggedRevision.php 2008-05-11 14:42:02 UTC (rev 34615) @@ -101,13 +101,6 @@ 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 @@ -130,20 +123,12 @@ $this->loadText(); // load if not loaded return $this->mText; } - + /** - * @returns mixed (string/false) expanded text or revision text. - * Depends on whether $wgUseStableTemplates is on or not. + * @returns Integer the user ID of the reviewer */ - public function getTextForParse() { - global $wgUseStableTemplates; - if( $wgUseStableTemplates ) { - $rev = Revision::newFromId( $this->getRevId() ); - $text = $rev->getText(); - } else { - $text = $this->getExpandedText(); - } - return $text; + public function getUser() { + return $this->mUser; } /** Modified: trunk/extensions/FlaggedRevs/FlaggedRevs.php =================================================================== --- trunk/extensions/FlaggedRevs/FlaggedRevs.php 2008-05-11 14:02:49 UTC (rev 34614) +++ trunk/extensions/FlaggedRevs/FlaggedRevs.php 2008-05-11 14:42:02 UTC (rev 34615) @@ -14,7 +14,7 @@ $wgExtensionCredits['specialpage'][] = array( 'name' => 'Flagged Revisions', 'author' => array( 'Aaron Schulz', 'Joerg Baach' ), - 'version' => '1.042', + 'version' => '1.041', '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 = null; + $wgFlaggedArticle = new FlaggedArticle(); wfLoadExtensionMessages( 'FlaggedRevsPage' ); @@ -238,8 +238,28 @@ define( 'FLAGGED_JS', $wgScriptPath . '/extensions/FlaggedRevs/flaggedrevs.js?' . $wgFlaggedRevStyleVersion ); ######### Hook attachments ######### - # Set $wgFlaggedArticle - $wgHooks['ArticleFromTitle'][] = 'wfInitFlaggedArticle'; + $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' ); # Autopromote Editors $wgHooks['ArticleSaveComplete'][] = 'FlaggedRevs::autoPromoteUser'; # Adds table link references to include ones from the stable version @@ -261,10 +281,17 @@ # Additional parser versioning $wgHooks['ParserAfterTidy'][] = 'FlaggedRevs::parserInjectTimestamps'; $wgHooks['OutputPageParserOutput'][] = 'FlaggedRevs::outputInjectTimestamps'; - # Auto-reviewing + # 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' ); $wgHooks['ArticleSaveComplete'][] = 'FlaggedRevs::autoMarkPatrolled'; - $wgHooks['RevisionInsertComplete'][] = 'FlaggedRevs::maybeMakeEditReviewed'; - $wgHooks['ArticleRollbackComplete'][] = 'FlaggedRevs::maybeMakeRollbackReviewed'; + $wgHooks['RevisionInsertComplete'][] = 'FlaggedRevs::maybeMakeNullEditReviewed'; # Disallow moves of stable pages $wgHooks['userCan'][] = 'FlaggedRevs::userCanMove'; $wgHooks['userCan'][] = 'FlaggedRevs::userCanView'; @@ -280,44 +307,6 @@ ######### } -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'; @@ -337,6 +326,25 @@ $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; @@ -426,14 +434,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 == $title->getLatestRevID(GAID_FOR_UPDATE) ); + $options->setEditSection( $id==$article->getLatest() ); # 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! @@ -482,14 +490,14 @@ /** * @param FlaggedRevision $frev * @param Article $article - * @param ParserOutput $stableOutput, will fetch if not given + * @param ParserOutput $flaggedOutput, 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, $stableOutput=null, $currentOutput=null ) { + public static function flaggedRevIsSynced( $frev, $article, $flaggedOutput=null, $currentOutput=null ) { # Must be the same revision - if( $frev->getRevId() != $article->getTitle()->getLatestRevID(GAID_FOR_UPDATE) ) { + if( $frev->getRevId() != $article->getLatest() ) { return false; } global $wgMemc; @@ -505,14 +513,20 @@ } } # If parseroutputs not given, fetch them... - if( is_null($stableOutput) || !isset($stableOutput->fr_newestTemplateID) ) { + if( is_null($flaggedOutput) || !isset($flaggedOutput->fr_newestTemplateID) ) { # Get parsed stable version - $stableOutput = self::getPageCache( $article ); - if( $stableOutput==false ) { - $text = $frev->getTextForParse(); - $stableOutput = self::parseStableText( $article, $text, $frev->getRevId() ); + $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() ); # Update the stable version cache - self::updatePageCache( $article, $stableOutput ); + FlaggedRevs::updatePageCache( $article, $flaggedOutput ); } } if( is_null($currentOutput) || !isset($currentOutput->fr_newestTemplateID) ) { @@ -526,17 +540,15 @@ $options = self::makeParserOptions( $wgUser ); $currentOutput = $wgParser->parse( $text, $title, $options ); # Might as well save the cache while we're at it - global $wgEnableParserCache; - if( $wgEnableParserCache ) - $parserCache->save( $currentOutput, $article, $wgUser ); + $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 > $stableOutput->fr_newestImageTime ) { + if( $currentOutput->fr_newestImageTime > $flaggedOutput->fr_newestImageTime ) { $synced = false; - } else if( $currentOutput->fr_newestTemplateID > $stableOutput->fr_newestTemplateID ) { + } else if( $currentOutput->fr_newestTemplateID > $flaggedOutput->fr_newestTemplateID ) { $synced = false; } else { $synced = true; @@ -546,7 +558,7 @@ global $wgParserCacheExpireTime; $syncData = $synced ? "true" : "false"; $wgMemc->set( $key, $syncData, $wgParserCacheExpireTime ); - + return $synced; } @@ -646,6 +658,7 @@ if( $row ) { return new FlaggedRevision( $title, $row ); } + return null; } @@ -657,13 +670,11 @@ */ 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; } @@ -754,7 +765,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->getTitle()->getLatestRevID(GAID_FOR_UPDATE) == $from_rev ) { + if( $article->getLatest()==$from_rev ) { return 0; } global $wgMemc; @@ -862,7 +873,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 ) @@ -1034,10 +1045,10 @@ /** * Add FlaggedRevs css/js. Attached to two different hooks, neglect inputs. */ - public static function InjectStyleAndJS() { + public static function InjectStyleAndJS( $a=false, $b=false ) { global $wgOut, $wgJsMimeType, $wgFlaggedArticle; # Don't double-load - if( self::$styleLoaded || !$wgFlaggedArticle ) + if( self::$styleLoaded ) return true; # UI CSS $wgOut->addLink( array( @@ -1093,18 +1104,19 @@ $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( $poutput == false ) { + if( $latestID == $rev->getId() ) { + $parserCache = ParserCache::singleton(); + $poutput = $parserCache->get( $article, $user ); + } + if( $poutput==false ) { $options = self::makeParserOptions( $user ); - $title = $article->getTitle(); // avoid pass-by-ref error - $poutput = $wgParser->parse( $text, $title, $options, true, true, $latestID ); + $poutput = $wgParser->parse( $text, $article->getTitle(), $options, true, true, $rev->getId() ); # Might as well save the cache while we're at it - global $wgEnableParserCache; - if( $wgEnableParserCache && $latestID == $rev->getId() ) { - $parserCache = ParserCache::singleton(); + if( $latestID == $rev->getId() ) { $parserCache->save( $poutput, $article, $user ); } } @@ -1151,7 +1163,7 @@ $textFlags = self::compressText( $fulltext ); # Write to external storage if required - $storage = self::getExternalStorage(); + $storage = FlaggedRevs::getExternalStorage(); if( $storage ) { if( is_array($storage) ) { # Distribute storage across multiple clusters @@ -1207,7 +1219,7 @@ $sv = self::getStablePageRev( $article->getTitle(), false, true ); if( $sv && $sv->getRevId() == $rev->getId() ) { # Update stable cache - self::updatePageCache( $article, $poutput ); + FlaggedRevs::updatePageCache( $article, $poutput ); # Update page fields self::updateArticleOn( $article, $rev->getId(), $rev->getId() ); # Purge squid for this page only @@ -1341,9 +1353,7 @@ $options = self::makeParserOptions( $wgUser ); $poutput = $wgParser->parse($text, $article->getTitle(), $options); # Might as well save the cache while we're at it - global $wgEnableParserCache; - if( $wgEnableParserCache ) - $parserCache->save( $poutput, $article, $wgUser ); + $parserCache->save( $poutput, $article, $wgUser ); } $u = new LinksUpdate( $article->getTitle(), $poutput ); $u->doUpdate(); // this will trigger our hook to add stable links too... @@ -1380,7 +1390,12 @@ # Try stable version cache. This should be updated before this is called. $parserOut = self::getPageCache( $article ); if( $parserOut==false ) { - $text = $sv->getTextForParse(); + if( $wgUseStableTemplates ) { + $rev = Revision::newFromId( $sv->getRevId() ); + $text = $rev->getText(); + } else { + $text = $sv->getExpandedText(); + } # Parse the text $parserOut = self::parseStableText( $article, $text, $sv->getRevId() ); } @@ -1699,12 +1714,13 @@ * Don't let users vandalize pages by moving them. */ public static function userCanMove( $title, $user, $action, $result ) { - global $wgTitle, $wgFlaggedArticle; + global $wgTitle; if( $action != 'move' || !self::isPageReviewable( $title ) ) return true; # See if there is a stable version - if( $wgFlaggedArticle && $wgTitle && $wgTitle->equals( $title ) ) { + if( $wgTitle && $wgTitle->equals( $title ) ) { + global $wgFlaggedArticle; // Cache stable version while we are at it. $frev = $wgFlaggedArticle->getStableRev( true ); } else { @@ -1725,7 +1741,7 @@ * Allow users to view reviewed pages. */ public static function userCanView( $title, $user, $action, $result ) { - global $wgFlaggedRevsVisible, $wgFlaggedRevsTalkVisible, $wgTitle, $wgFlaggedArticle; + global $wgFlaggedRevsVisible, $wgFlaggedRevsTalkVisible, $wgTitle; # Assume $action may still not be set, in which case, treat it as 'view'... if( $action != 'read' ) return true; @@ -1741,7 +1757,7 @@ } # See if there is a stable version. Also, see if, given the page # config and URL params, the page can be overriden. - if( $wgFlaggedArticle && $wgTitle && $wgTitle->equals( $title ) ) { + if( $wgTitle && $wgTitle->equals( $title ) ) { global $wgFlaggedArticle; // Cache stable version while we are at it. if( $wgFlaggedArticle->pageOverride() && $wgFlaggedArticle->getStableRev( true ) ) { @@ -1756,89 +1772,42 @@ } /** - * When an edit is made by a reviewer, if the current revision is the stable - * version, try to automatically review it. + * When a null edit is made, autoreview if necessary */ - 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; + public static function maybeMakeNullEditReviewed( $rev ) { + $title = $rev->getTitle(); # GetTitle() for revisions uses slaves and wants page_id,rev_id to # match...this is bad if we *just* added it. - $title = $rev->getTitle() ? $rev->getTitle() : Title::newFromID( $rev->getPage(), GAID_FOR_UPDATE ); - # Must be in reviewable namespace + $title = $title ? $title : Title::newFromID( $rev->getPage() ); if( !$title || !self::isPageReviewable( $title ) ) { return true; } - $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; + $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; + } } + $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. @@ -2145,8 +2114,46 @@ * Add user preference to form HTML */ public static function injectPreferences( $form, $out ) { - $prefsHtml = FlaggedRevsXML::stabilityPreferences( $form ); - $out->addHTML( $prefsHtml ); + 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' ) + ); + return true; } @@ -2206,21 +2213,4 @@ } } -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 14:02:49 UTC (rev 34614) +++ trunk/extensions/FlaggedRevs/FlaggedRevsPage.i18n.php 2008-05-11 14:42:02 UTC (rev 34615) @@ -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 awaits|changes await}}] review.", +The ''draft'' is shown below.''' [{{fullurl:{{FULLPAGENAMEE}}|oldid=$1&diff=cur}} $2 {{plural:$2|change|changes}}] await review.", 'validationpage' => '{{ns:help}}:Article validation', @@ -66,10 +66,6 @@ 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 14:02:49 UTC (rev 34614) +++ trunk/extensions/FlaggedRevs/FlaggedRevsPage.php 2008-05-11 14:42:02 UTC (rev 34615) @@ -594,9 +594,7 @@ $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 - global $wgEnableParserCache; - if( $wgEnableParserCache ) - $parserCache->save( $poutput, $article, $wgUser ); + $parserCache->save( $poutput, $article, $wgUser ); # Purge squid for this page only $article->getTitle()->purgeSquid(); @@ -648,9 +646,7 @@ # Clear the cache... $this->page->invalidateCache(); # Might as well save the cache - global $wgEnableParserCache; - if( $wgEnableParserCache ) - $parserCache->save( $poutput, $article, $wgUser ); + $parserCache->save( $poutput, $article, $wgUser ); # Purge squid for this page only $this->page->purgeSquid(); @@ -901,17 +897,15 @@ ' ' . Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "</p>\n" . "</fieldset></form>" ); - # 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') ) ); - } + + $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') ) ); } } @@ -951,22 +945,6 @@ 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); - } } /** @@ -999,6 +977,7 @@ 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 @@ -1007,26 +986,69 @@ $conds['page_is_redirect'] = 0; # Filter by category if( $this->category ) { - $tables = array( 'categorylinks', 'page', 'flaggedpages' ); + $tables[] = 'categorylinks'; $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( 'USE INDEX' => $useIndex ), - 'join_conds' => array( 'flaggedpages' => array('LEFT JOIN','fp_page_id=page_id') ) + 'options' => array() ); } + + /** + * 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 14:02:49 UTC (rev 34614) +++ trunk/extensions/FlaggedRevs/FlaggedRevsXML.php 2008-05-11 14:42:02 UTC (rev 34615) @@ -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,12 +117,8 @@ $msg = $quality ? 'revreview-quality-old' : 'revreview-basic-old'; $html = wfMsgExt($msg, array('parseinline'), $frev->getRevId(), $time ); } else { - if( $stable ) { - $msg = $quality ? 'revreview-quality' : 'revreview-basic'; - $msg .= ($revs_since == 0) ? '-i' : ''; - } else { - $msg = $quality ? 'revreview-newest-quality' : 'revreview-newest-basic'; - } + $msg = $stable ? 'revreview-' : 'revreview-newest-'; + $msg .= $quality ? 'quality' : 'basic'; $html = wfMsgExt($msg, array('parseinline'), $frev->getRevId(), $time, $revs_since ); } # Make fancy box... @@ -141,45 +137,4 @@ 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 14:02:49 UTC (rev 34614) +++ trunk/extensions/FlaggedRevs/README.txt 2008-05-11 14:42:02 UTC (rev 34615) @@ -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.13+ +* Upgrade to MediaWiki 1.12+ * 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
|