From 0f50b6db3a5fc00ea54fb08627ebf62272e2f4a7 Mon Sep 17 00:00:00 2001 From: Ilmari Karonen Date: Sun, 3 Dec 2006 01:59:57 +0000 Subject: [PATCH] New special page Special:NewbieContributions to replace Special:Contributions/newbies Also remove some obsolete contributions-related UI messages. --- RELEASE-NOTES | 3 +- includes/AutoLoader.php | 1 + includes/QueryPage.php | 1 + includes/SpecialContributions.php | 108 +++++++++--------------- includes/SpecialNewbieContributions.php | 107 +++++++++++++++++++++++ includes/SpecialPage.php | 1 + languages/messages/MessagesEn.php | 16 ++-- languages/messages/MessagesFi.php | 12 +-- 8 files changed, 159 insertions(+), 90 deletions(-) create mode 100644 includes/SpecialNewbieContributions.php diff --git a/RELEASE-NOTES b/RELEASE-NOTES index d721871602..4aa999aa95 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -243,7 +243,8 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN to ensure consistent behavior * {{REVISIONTIMESTAMP}} and friends should now work on non-MySQL backends * Special:Contributions has been rewritten to inherit from QueryPage -* Special:Contributions/newbies now lists the user who made each edit +* New special page Special:NewbieContributions, with a (deprecated) + redirect from Special:Contributions/newbies for backwards compatibility == Languages updated == diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index e72dcbcfb4..8b0fb31b7c 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -186,6 +186,7 @@ function __autoload($className) { 'MostlinkedCategoriesPage' => 'includes/SpecialMostlinkedcategories.php', 'MostrevisionsPage' => 'includes/SpecialMostrevisions.php', 'MovePageForm' => 'includes/SpecialMovepage.php', + 'NewbieContributionsPage' => 'includes/SpecialNewbieContributions.php', 'NewPagesPage' => 'includes/SpecialNewpages.php', 'SpecialPage' => 'includes/SpecialPage.php', 'UnlistedSpecialPage' => 'includes/SpecialPage.php', diff --git a/includes/QueryPage.php b/includes/QueryPage.php index b4df3a0c5b..b69277ac71 100644 --- a/includes/QueryPage.php +++ b/includes/QueryPage.php @@ -28,6 +28,7 @@ $wgQueryPages = array( array( 'MostlinkedPage', 'Mostlinked' ), array( 'MostrevisionsPage', 'Mostrevisions' ), array( 'NewPagesPage', 'Newpages' ), + array( 'NewbieContributionsPage', 'NewbieContributions' ), array( 'ShortPagesPage', 'Shortpages' ), array( 'UncategorizedCategoriesPage', 'Uncategorizedcategories' ), array( 'UncategorizedPagesPage', 'Uncategorizedpages' ), diff --git a/includes/SpecialContributions.php b/includes/SpecialContributions.php index 01a346f8f0..34ab8c3a3e 100644 --- a/includes/SpecialContributions.php +++ b/includes/SpecialContributions.php @@ -10,7 +10,6 @@ class ContributionsPage extends QueryPage { var $user = null; var $namespace = null; - var $newbies = false; var $botmode = false; /** @@ -18,11 +17,7 @@ class ContributionsPage extends QueryPage { * @param $username username to list contribs for (or "newbies" for extra magic) */ function __construct( $username ) { - // This is an ugly hack. I don't know who came up with it. - if ( $username == 'newbies' && $this->newbiesModeEnabled() ) - $this->newbies = true; - else - $this->user = User::newFromName( $username, false ); + $this->user = User::newFromName( $username, false ); } /** @@ -43,15 +38,18 @@ class ContributionsPage extends QueryPage { function isSyndicated() { return false; } /** - * Special handling of "newbies" username. May be disabled in subclasses. + * Get target user name. May be overridden in subclasses. + * @return string username */ - function newbiesModeEnabled() { return true; } + function getUsername() { + return $this->user->getName(); + } /** * @return array Extra URL params for self-links. */ function linkParameters() { - $params['target'] = ( $this->newbies ? "newbies" : $this->user->getName() ); + $params['target'] = $this->getUsername(); if ( isset($this->namespace) ) $params['namespace'] = $this->namespace; @@ -71,7 +69,7 @@ class ContributionsPage extends QueryPage { $skin = $wgUser->getSkin(); - $username = $this->user->getName(); + $username = $this->getUsername(); $userpage = $this->user->getUserPage(); $userlink = $skin->makeLinkObj( $userpage, $username ); @@ -104,10 +102,7 @@ class ContributionsPage extends QueryPage { * @return string */ function getSubtitleForTarget() { - if ( $this->newbies ) - return wfMsgHtml( 'sp-contributions-newbies-sub' ); - else - return wfMsgHtml( 'contribsub', $this->getTargetUserLinks() ); + return wfMsgHtml( 'contribsub', $this->getTargetUserLinks() ); } /** @@ -118,18 +113,18 @@ class ContributionsPage extends QueryPage { function getDeletedContributionsLink() { global $wgUser; - if( $this->newbies || !$wgUser->isAllowed( 'deletedhistory' ) ) + if( !$wgUser->isAllowed( 'deletedhistory' ) ) return ''; $dbr = wfGetDB( DB_SLAVE ); - $n = $dbr->selectField( 'archive', 'count(*)', array( 'ar_user_text' => $this->user->getName() ), __METHOD__ ); + $n = $dbr->selectField( 'archive', 'count(*)', array( 'ar_user_text' => $this->getUsername() ), __METHOD__ ); if ( $n == 0 ) return ''; $msg = wfMsg( ( $wgUser->isAllowed( 'delete' ) ? 'thisisdeleted' : 'viewdeleted' ), $wgUser->getSkin()->makeKnownLinkObj( - SpecialPage::getTitleFor( 'DeletedContributions', $this->user->getName() ), + SpecialPage::getTitleFor( 'DeletedContributions', $this->getUsername() ), wfMsgExt( 'restorelink', array( 'parsemag', 'escape' ), $n ) ) ); return "

$msg

"; @@ -162,7 +157,7 @@ class ContributionsPage extends QueryPage { $form .= Xml::submitButton( wfMsg( 'allpagessubmit' ) ); $form .= Xml::hidden( 'offset', $this->offset ); $form .= Xml::hidden( 'limit', $this->limit ); - $form .= Xml::hidden( 'target', ( $this->newbies ? "newbies" : $this->user->getName() ) ); + $form .= Xml::hidden( 'target', $this->getUsername() ); if ( $this->botmode ) $form .= Xml::hidden( 'bot', 1 ); $form .= ''; @@ -186,14 +181,11 @@ class ContributionsPage extends QueryPage { */ function makeSQLCond( $dbr ) { $cond = ' page_id = rev_page'; - if ( $this->newbies ) { - $max = $dbr->selectField( 'user', 'max(user_id)', false, 'make_sql' ); - $cond .= ' AND rev_user > ' . (int)($max - $max / 100); - } else { - $cond .= ' AND rev_user_text = ' . $dbr->addQuotes( $this->user->getName() ); - } + $cond .= ' AND rev_user_text = ' . $dbr->addQuotes( $this->getUsername() ); + if ( isset($this->namespace) ) $cond .= ' AND page_namespace = ' . (int)$this->namespace; + return $cond; } @@ -206,6 +198,9 @@ class ContributionsPage extends QueryPage { list( $page, $revision ) = $dbr->tableNamesN( 'page', 'revision' ); + // XXX: the username and userid fields aren't used for much here, + // but some subclasses rely on them more than we do. + return "SELECT 'Contributions' as type, page_namespace AS namespace, page_title AS title, @@ -222,25 +217,14 @@ class ContributionsPage extends QueryPage { } /** - * If in newbies mode, do a batch existence check for any user - * and user talk pages that will be shown in the list. + * Get user links for output row, for subclasses that may want + * such functionality. + * + * @param $skin Skin to use + * @param $row Result row + * @return string */ - function preprocessResults( $dbr, $res ) { - if ( !$this->newbies ) - return; - - // Do a batch existence check for user and talk pages - $linkBatch = new LinkBatch(); - while( $row = $dbr->fetchObject( $res ) ) { - $linkBatch->add( NS_USER, $row->username ); - $linkBatch->add( NS_USER_TALK, $row->username ); - } - $linkBatch->execute(); - - // Seek to start - if( $dbr->numRows( $res ) > 0 ) - $dbr->dataSeek( $res, 0 ); - } + function getRowUserLinks( $skin, $row ) { return ''; } /** * Format a row, providing the timestamp, links to the @@ -297,12 +281,7 @@ class ContributionsPage extends QueryPage { $link = $skin->makeKnownLinkObj( $page ); $comment = $skin->revComment( $rev ); - if ( $this->newbies ) { - $user = ' . . ' . $skin->userLink( $row->userid, $row->username ) - . $skin->userToolLinks( $row->userid, $row->username ); - } else { - $user = ''; - } + $user = $this->getRowUserLinks( $skin, $row ); // for subclasses $notes = ''; @@ -320,38 +299,29 @@ class ContributionsPage extends QueryPage { return "{$time} ({$hist}) ({$diff}) {$mflag} {$dm}{$link}{$user} {$comment}{$notes}"; } - - /** - * Called to actually output the page. Override to do a basic - * input validity check before proceeding. - * - * @param $offset database query offset - * @param $limit database query limit - * @param $shownavigation show navigation like "next 200"? - */ - function doQuery( $limit, $offset, $shownavigation = true ) { - - // this needs to be checked before doing anything - if( !$this->user && !$this->newbies ) { - global $wgOut; - $wgOut->showErrorPage( 'notargettitle', 'notargettext' ); - return; - } - - return parent::doQuery( $limit, $offset, $shownavigation ); - } } /** * Show the special page. */ function wfSpecialContributions( $par = null ) { - global $wgRequest, $wgUser; + global $wgRequest, $wgUser, $wgOut; $username = ( isset($par) ? $par : $wgRequest->getVal( 'target' ) ); + // compatibility hack + if ( $username == 'newbies' ) { + $wgOut->redirect( SpecialPage::getTitleFor( 'NewbieContributions' )->getFullURL() ); + return; + } + $page = new ContributionsPage( $username ); + if( !$page->user ) { + $wgOut->showErrorPage( 'notargettitle', 'notargettext' ); + return; + } + // hook for Contributionseditcount extension if ( $page->user && $page->user->isLoggedIn() ) wfRunHooks( 'SpecialContributionsBeforeMainOutput', $page->user->getId() ); diff --git a/includes/SpecialNewbieContributions.php b/includes/SpecialNewbieContributions.php new file mode 100644 index 0000000000..7e8e948cbe --- /dev/null +++ b/includes/SpecialNewbieContributions.php @@ -0,0 +1,107 @@ + no subtitle. + */ + function getSubtitleForTarget() { + return ''; + } + + /** + * No target user => no deleted contribs link. + */ + function getDeletedContributionsLink() { + return ''; + } + + /** + * Construct the WHERE clause of the SQL SELECT statement for + * this query. + * @return string + */ + function makeSQLCond( $dbr ) { + $cond = ' page_id = rev_page'; + + $max = $dbr->selectField( 'user', 'max(user_id)', false, 'make_sql' ); + $cond .= ' AND rev_user > ' . (int)($max - $max / 100); + + if ( isset($this->namespace) ) + $cond .= ' AND page_namespace = ' . (int)$this->namespace; + + return $cond; + } + + /** + * Do a batch existence check for any user and user talk pages + * that will be shown in the list. + */ + function preprocessResults( $dbr, $res ) { + $linkBatch = new LinkBatch(); + while( $row = $dbr->fetchObject( $res ) ) { + $linkBatch->add( NS_USER, $row->username ); + $linkBatch->add( NS_USER_TALK, $row->username ); + } + $linkBatch->execute(); + + // Seek to start + if( $dbr->numRows( $res ) > 0 ) + $dbr->dataSeek( $res, 0 ); + } + + /** + * Get user links for output row. + * + * @param $skin Skin to use + * @param $row Result row + * @return string User links + */ + function getRowUserLinks( $skin, $row ) { + $user = ' . . ' . $skin->userLink( $row->userid, $row->username ) + . $skin->userToolLinks( $row->userid, $row->username ); + return $user; + } +} + +/** + * Show the special page. + */ +function wfSpecialNewbieContributions( $par = null ) { + global $wgRequest, $wgUser, $wgOut; + + $page = new NewbieContributionsPage(); + + $page->namespace = $wgRequest->getIntOrNull( 'namespace' ); + $page->botmode = ( $wgUser->isAllowed( 'rollback' ) && $wgRequest->getBool( 'bot' ) ); + + list( $limit, $offset ) = wfCheckLimits(); + return $page->doQuery( $offset, $limit ); +} + +?> diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php index e8db18b742..92aa4cbf45 100644 --- a/includes/SpecialPage.php +++ b/includes/SpecialPage.php @@ -114,6 +114,7 @@ class SpecialPage 'Ipblocklist' => array( 'SpecialPage', 'Ipblocklist' ), 'Specialpages' => array( 'UnlistedSpecialPage', 'Specialpages' ), 'Contributions' => array( 'UnlistedSpecialPage', 'Contributions' ), + 'NewbieContributions' => array( 'SpecialPage', 'NewbieContributions' ), 'Emailuser' => array( 'UnlistedSpecialPage', 'Emailuser' ), 'Whatlinkshere' => array( 'UnlistedSpecialPage', 'Whatlinkshere' ), 'Recentchangeslinked' => array( 'UnlistedSpecialPage', 'Recentchangeslinked' ), diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index 5e7a573f74..f1860b2482 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -380,6 +380,7 @@ $specialPageAliases = array( 'Ipblocklist' => array( 'Ipblocklist' ), 'Specialpages' => array( 'Specialpages' ), 'Contributions' => array( 'Contributions' ), + 'NewbieContributions' => array( 'NewbieContributions' ), 'Emailuser' => array( 'Emailuser' ), 'Whatlinkshere' => array( 'Whatlinkshere' ), 'Recentchangeslinked' => array( 'Recentchangeslinked' ), @@ -1754,19 +1755,11 @@ Consult the [[Special:Log/delete|deletion log]] for a record of recent deletions 'contributions' => 'User contributions', 'mycontris' => 'My contributions', 'contribsub' => "For $1", -'nocontribs' => 'No changes were found matching these criteria.', -'ucnote' => "Below are this user's last $1 changes in the last $2 days.", -'uclinks' => "View the last $1 changes; view the last $2 days.", 'uctop' => ' (top)' , -'newbies' => 'newbies', -'sp-newimages-showfrom' => 'Show new images starting from $1', - -'sp-contributions-newest' => 'Newest', -'sp-contributions-oldest' => 'Oldest', -'sp-contributions-newer' => 'Newer $1', -'sp-contributions-older' => 'Older $1', -'sp-contributions-newbies-sub' => 'For newbies', +# Newbie contributions +# +'newbiecontributions' => 'Newbie contributions', # What links here @@ -2168,6 +2161,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'View the category page\');', 'newimages-summary' => '', 'showhidebots' => '($1 bots)', 'noimages' => 'Nothing to see.', +'sp-newimages-showfrom' => 'Show new images starting from $1', # short names for language variants used for language conversion links. # to disable showing a particular link, set it to 'disable', e.g. diff --git a/languages/messages/MessagesFi.php b/languages/messages/MessagesFi.php index da698149f0..b9bddc4ad3 100644 --- a/languages/messages/MessagesFi.php +++ b/languages/messages/MessagesFi.php @@ -1137,17 +1137,11 @@ Palaute ja lisäapu osoitteessa: 'contributions' => 'Käyttäjän muokkaukset', 'mycontris' => 'Muokkaukset', 'contribsub' => 'Käyttäjän $1 muokkaukset', -'nocontribs' => 'Näihin ehtoihin sopivia muokkauksia ei löytynyt.', -'ucnote' => 'Alla on \'\'\'$1\'\'\' viimeisintä tämän käyttäjän tekemää muokkausta viimeisten \'\'\'$2\'\'\' päivän aikana.', -'uclinks' => 'Katso $1 viimeisintä muokkausta; katso $2 viimeisintä päivää.', 'uctop' => ' (uusin)' , -'newbies' => 'tulokkaat', -'sp-contributions-newest' => 'Uusimmat', -'sp-contributions-oldest' => 'Vanhimmat', -'sp-contributions-newer' => '← $1 uudempaa', -'sp-contributions-older' => '$1 vanhempaa →', -'sp-contributions-newbies-sub' => 'Uusien tulokkaiden muokkaukset', +# Newbie contributions +# +'newbiecontributions' => 'Uusien tulokkaiden muokkaukset', # What links here # -- 2.20.1