diff options
Diffstat (limited to 'includes/specials/SpecialContributions.php')
-rw-r--r-- | includes/specials/SpecialContributions.php | 144 |
1 files changed, 84 insertions, 60 deletions
diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php index 3d8c18dd..9263336e 100644 --- a/includes/specials/SpecialContributions.php +++ b/includes/specials/SpecialContributions.php @@ -35,7 +35,7 @@ class SpecialContributions extends SpecialPage { } if( !strlen( $target ) ) { - $wgOut->addHTML( $this->getForm( '' ) ); + $wgOut->addHTML( $this->getForm() ); return; } @@ -44,7 +44,7 @@ class SpecialContributions extends SpecialPage { $nt = Title::makeTitleSafe( NS_USER, $target ); if( !$nt ) { - $wgOut->addHTML( $this->getForm( '' ) ); + $wgOut->addHTML( $this->getForm() ); return; } $id = User::idFromName( $nt->getText() ); @@ -52,7 +52,7 @@ class SpecialContributions extends SpecialPage { if( $target != 'newbies' ) { $target = $nt->getText(); $wgOut->setSubtitle( $this->contributionsSub( $nt, $id ) ); - $wgOut->setHTMLTitle( wfMsg( 'pagetitle', wfMsg( 'contributions-title', $target ) ) ); + $wgOut->setHTMLTitle( wfMsg( 'pagetitle', wfMsgExt( 'contributions-title', array( 'parsemag' ),$target ) ) ); } else { $wgOut->setSubtitle( wfMsgHtml( 'sp-contributions-newbies-sub') ); $wgOut->setHTMLTitle( wfMsg( 'pagetitle', wfMsg( 'sp-contributions-newbies-title' ) ) ); @@ -63,6 +63,8 @@ class SpecialContributions extends SpecialPage { } else { $this->opts['namespace'] = ''; } + + $this->opts['tagfilter'] = (string) $wgRequest->getVal( 'tagfilter' ); // Allows reverts to have the bot flag in recent changes. It is just here to // be passed in the form at the top of the page @@ -72,27 +74,12 @@ class SpecialContributions extends SpecialPage { $skip = $wgRequest->getText( 'offset' ) || $wgRequest->getText( 'dir' ) == 'prev'; # Offset overrides year/month selection - if( ( $month = $wgRequest->getIntOrNull( 'month' ) ) !== null && $month !== -1 ) { - $this->opts['month'] = intval( $month ); - } else { - $this->opts['month'] = ''; - } - if( ( $year = $wgRequest->getIntOrNull( 'year' ) ) !== null ) { - $this->opts['year'] = intval( $year ); - } else if( $this->opts['month'] ) { - $thisMonth = intval( gmdate( 'n' ) ); - $thisYear = intval( gmdate( 'Y' ) ); - if( intval( $this->opts['month'] ) > $thisMonth ) { - $thisYear--; - } - $this->opts['year'] = $thisYear; - } else { - $this->opts['year'] = ''; - } - if( $skip ) { $this->opts['year'] = ''; $this->opts['month'] = ''; + } else { + $this->opts['year'] = $wgRequest->getIntOrNull( 'year' ); + $this->opts['month'] = $wgRequest->getIntOrNull( 'month' ); } // Add RSS/atom links @@ -104,11 +91,11 @@ class SpecialContributions extends SpecialPage { wfRunHooks( 'SpecialContributionsBeforeMainOutput', $id ); - $wgOut->addHTML( $this->getForm( $this->opts ) ); + $wgOut->addHTML( $this->getForm() ); $pager = new ContribsPager( $target, $this->opts['namespace'], $this->opts['year'], $this->opts['month'] ); if( !$pager->getNumRows() ) { - $wgOut->addWikiMsg( 'nocontribs' ); + $wgOut->addWikiMsg( 'nocontribs', $target ); return; } @@ -177,18 +164,27 @@ class SpecialContributions extends SpecialPage { wfMsgHtml( 'sp-contributions-blocklog' ), 'type=block&page=' . $nt->getPrefixedUrl() ); } # Other logs link - $tools[] = $sk->makeKnownLinkObj( SpecialPage::getTitleFor( 'Log' ), wfMsgHtml( 'log' ), - 'user=' . $nt->getPartialUrl() ); + $tools[] = $sk->makeKnownLinkObj( SpecialPage::getTitleFor( 'Log' ), wfMsg( 'sp-contributions-logs' ), + 'user=' . $nt->getPartialUrl() ); # Add link to deleted user contributions for priviledged users if( $wgUser->isAllowed( 'deletedhistory' ) ) { - $tools[] = $sk->makeKnownLinkObj( SpecialPage::getTitleFor( 'DeletedContributions', + $tools[] = $sk->makeKnownLinkObj( SpecialPage::getTitleFor( 'DeletedContributions', $nt->getDBkey() ), wfMsgHtml( 'deletedcontributions' ) ); } - + + # Add a link to change user rights for privileged users + $userrightsPage = new UserrightsPage(); + if( 0 !== $id && $userrightsPage->userCanChangeRights( User::newFromId( $id ) ) ) { + $tools[] = $sk->makeKnownLinkObj( + SpecialPage::getTitleFor( 'Userrights', $nt->getDBkey() ), + wfMsgHtml( 'userrights' ) + ); + } + wfRunHooks( 'ContributionsToolLinks', array( $id, $nt, &$tools ) ); - $links = implode( ' | ', $tools ); + $links = $wgLang->pipeList( $tools ); } // Old message 'contribsub' had one parameter, but that doesn't work for @@ -235,15 +231,21 @@ class SpecialContributions extends SpecialPage { if( $this->opts['contribs'] == 'newbie' ) { $this->opts['target'] = ''; } + + if( !isset( $this->opts['tagfilter'] ) ) { + $this->opts['tagfilter'] = ''; + } $f = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ); - + # Add hidden params for tracking foreach ( $this->opts as $name => $value ) { if( in_array( $name, array( 'namespace', 'target', 'contribs', 'year', 'month' ) ) ) { continue; } $f .= "\t" . Xml::hidden( $name, $value ) . "\n"; } + + $tagFilter = ChangeTags::buildTagFilterSelector( $this->opts['tagfilter'] ); $f .= '<fieldset>' . Xml::element( 'legend', array(), wfMsg( 'sp-contributions-search' ) ) . @@ -256,16 +258,11 @@ class SpecialContributions extends SpecialPage { Xml::label( wfMsg( 'namespace' ), 'namespace' ) . ' ' . Xml::namespaceSelector( $this->opts['namespace'], '' ) . '</span>' . + ( $tagFilter ? Xml::tags( 'p', null, implode( ' ', $tagFilter ) ) : '' ) . Xml::openElement( 'p' ) . '<span style="white-space: nowrap">' . - Xml::label( wfMsg( 'year' ), 'year' ) . ' '. - Xml::input( 'year', 4, $this->opts['year'], array('id' => 'year', 'maxlength' => 4) ) . - '</span>' . - ' '. - '<span style="white-space: nowrap">' . - Xml::label( wfMsg( 'month' ), 'month' ) . ' '. - Xml::monthSelector( $this->opts['month'], -1 ) . ' '. - '</span>' . + Xml::dateMenu( $this->opts['year'], $this->opts['month'] ) . + '</span>' . ' ' . Xml::submitButton( wfMsg( 'sp-contributions-submit' ) ) . Xml::closeElement( 'p' ); @@ -278,7 +275,7 @@ class SpecialContributions extends SpecialPage { return $f; } - /** + /** * Output a subscription feed listing recent edits to this page. * @param string $type */ @@ -300,14 +297,15 @@ class SpecialContributions extends SpecialPage { $feed = new $wgFeedClasses[$type]( $this->feedTitle(), wfMsgExt( 'tagline', 'parsemag' ), - $this->getTitle()->getFullUrl() ); + $this->getTitle()->getFullUrl() . "/" . urlencode($this->opts['target']) + ); // Already valid title $nt = Title::makeTitleSafe( NS_USER, $this->opts['target'] ); $target = $this->opts['target'] == 'newbies' ? 'newbies' : $nt->getText(); $pager = new ContribsPager( $target, $this->opts['namespace'], - $this->opts['year'], $this->opts['month'] ); + $this->opts['year'], $this->opts['month'], $this->opts['tagfilter'] ); $pager->mLimit = min( $this->opts['limit'], $wgFeedLimit ); @@ -353,7 +351,7 @@ class SpecialContributions extends SpecialPage { protected function feedItemDesc( $revision ) { if( $revision ) { - return '<p>' . htmlspecialchars( $revision->getUserText() ) . ': ' . + return '<p>' . htmlspecialchars( $revision->getUserText() ) . wfMsgForContent( 'colon-separator' ) . htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) . "</p>\n<hr />\n<div>" . nl2br( htmlspecialchars( $revision->getText() ) ) . "</div>"; @@ -371,13 +369,14 @@ class ContribsPager extends ReverseChronologicalPager { var $messages, $target; var $namespace = '', $mDb; - function __construct( $target, $namespace = false, $year = false, $month = false ) { + function __construct( $target, $namespace = false, $year = false, $month = false, $tagFilter = false ) { parent::__construct(); foreach( explode( ' ', 'uctop diff newarticle rollbacklink diff hist newpageletter minoreditletter' ) as $msg ) { $this->messages[$msg] = wfMsgExt( $msg, array( 'escape') ); } $this->target = $target; $this->namespace = $namespace; + $this->tagFilter = $tagFilter; $this->getDateCond( $year, $month ); @@ -391,19 +390,35 @@ class ContribsPager extends ReverseChronologicalPager { } function getQueryInfo() { + global $wgUser; list( $tables, $index, $userCond, $join_cond ) = $this->getUserCond(); - $conds = array_merge( array('page_id=rev_page'), $userCond, $this->getNamespaceCond() ); + + $conds = array_merge( $userCond, $this->getNamespaceCond() ); + // Paranoia: avoid brute force searches (bug 17342) + if( !$wgUser->isAllowed( 'suppressrevision' ) ) { + $conds[] = 'rev_deleted & ' . Revision::DELETED_USER . ' = 0'; + } + $join_cond['page'] = array( 'INNER JOIN', 'page_id=rev_page' ); + $queryInfo = array( 'tables' => $tables, 'fields' => array( - 'page_namespace', 'page_title', 'page_is_new', 'page_latest', 'rev_id', 'rev_page', - 'rev_text_id', 'rev_timestamp', 'rev_comment', 'rev_minor_edit', 'rev_user', - 'rev_user_text', 'rev_parent_id', 'rev_deleted' + 'page_namespace', 'page_title', 'page_is_new', 'page_latest', 'page_is_redirect', + 'page_len','rev_id', 'rev_page', 'rev_text_id', 'rev_timestamp', 'rev_comment', + 'rev_minor_edit', 'rev_user', 'rev_user_text', 'rev_parent_id', 'rev_deleted' ), 'conds' => $conds, 'options' => array( 'USE INDEX' => array('revision' => $index) ), 'join_conds' => $join_cond ); + + ChangeTags::modifyDisplayQuery( $queryInfo['tables'], + $queryInfo['fields'], + $queryInfo['conds'], + $queryInfo['join_conds'], + $queryInfo['options'], + $this->tagFilter ); + wfRunHooks( 'ContribsPager::getQueryInfo', array( &$this, &$queryInfo ) ); return $queryInfo; } @@ -458,36 +473,38 @@ class ContribsPager extends ReverseChronologicalPager { * @todo This would probably look a lot nicer in a table. */ function formatRow( $row ) { - wfProfileIn( __METHOD__ ); - global $wgLang, $wgUser, $wgContLang; + wfProfileIn( __METHOD__ ); $sk = $this->getSkin(); $rev = new Revision( $row ); + $classes = array(); - $page = Title::makeTitle( $row->page_namespace, $row->page_title ); - $link = $sk->makeKnownLinkObj( $page ); + $page = Title::newFromRow( $row ); + $page->resetArticleId( $row->rev_page ); // use process cache + $link = $sk->makeLinkObj( $page, $page->getPrefixedText(), $page->isRedirect() ? 'redirect=no' : '' ); + # Mark current revisions $difftext = $topmarktext = ''; if( $row->rev_id == $row->page_latest ) { $topmarktext .= '<strong>' . $this->messages['uctop'] . '</strong>'; if( !$row->page_is_new ) { $difftext .= '(' . $sk->makeKnownLinkObj( $page, $this->messages['diff'], 'diff=0' ) . ')'; + # Add rollback link + if( $page->quickUserCan( 'rollback') && $page->quickUserCan( 'edit' ) ) { + $topmarktext .= ' '.$sk->generateRollback( $rev ); + } } else { $difftext .= $this->messages['newarticle']; } - - if( $page->userCan( 'rollback') && $page->userCan( 'edit' ) ) { - $topmarktext .= ' '.$sk->generateRollback( $rev ); - } - } # Is there a visible previous revision? if( $rev->userCan(Revision::DELETED_TEXT) ) { - $difftext = '(' . $sk->makeKnownLinkObj( $page, $this->messages['diff'], 'diff=prev&oldid='.$row->rev_id ) . ')'; + $difftext = '(' . $sk->makeKnownLinkObj( $page, $this->messages['diff'], + 'diff=prev&oldid='.$row->rev_id ) . ')'; } else { $difftext = '(' . $this->messages['diff'] . ')'; } - $histlink='('.$sk->makeKnownLinkObj( $page, $this->messages['hist'], 'action=history' ) . ')'; + $histlink = '('.$sk->makeKnownLinkObj( $page, $this->messages['hist'], 'action=history' ) . ')'; $comment = $wgContLang->getDirMark() . $sk->revComment( $rev, false, true ); $date = $wgLang->timeanddate( wfTimestamp( TS_MW, $row->rev_timestamp ), true ); @@ -510,7 +527,7 @@ class ContribsPager extends ReverseChronologicalPager { $nflag = ''; } - if( $row->rev_minor_edit ) { + if( $rev->isMinor() ) { $mflag = '<span class="minor">' . $this->messages['minoreditletter'] . '</span> '; } else { $mflag = ''; @@ -520,10 +537,17 @@ class ContribsPager extends ReverseChronologicalPager { if( $rev->isDeleted( Revision::DELETED_TEXT ) ) { $ret .= ' ' . wfMsgHtml( 'deletedrev' ); } + + # Tags, if any. + list($tagSummary, $newClasses) = ChangeTags::formatSummaryRow( $row->ts_tags, 'contributions' ); + $classes = array_merge( $classes, $newClasses ); + $ret .= " $tagSummary"; + // Let extensions add data wfRunHooks( 'ContributionsLineEnding', array( &$this, &$ret, $row ) ); - - $ret = "<li>$ret</li>\n"; + + $classes = implode( ' ', $classes ); + $ret = "<li class=\"$classes\">$ret</li>\n"; wfProfileOut( __METHOD__ ); return $ret; } |