From b161823573edfee9b73cbdcf262763f385a89e24 Mon Sep 17 00:00:00 2001 From: Sam Reed Date: Mon, 6 Jun 2011 14:50:34 +0000 Subject: [PATCH] * (bug 26763) Make RSS/Atom of user contributions more visible Add ApiFeedContributions module Somewhat duplicated against Special:Contributions?feed=atom Going to strip out that functionality --- RELEASE-NOTES-1.19 | 1 + includes/AutoLoader.php | 1 + includes/api/ApiFeedContributions.php | 201 ++++++++++++++++++++++++++ includes/api/ApiMain.php | 1 + 4 files changed, 204 insertions(+) create mode 100644 includes/api/ApiFeedContributions.php diff --git a/RELEASE-NOTES-1.19 b/RELEASE-NOTES-1.19 index 3714068556..9ec4dbb9a5 100644 --- a/RELEASE-NOTES-1.19 +++ b/RELEASE-NOTES-1.19 @@ -105,6 +105,7 @@ production. * (bug 28392) mark action=undelete×tamps as type "timestamp" * (bug 21346) Make deleted images searchable by hash (disabled in Miser Mode) * (bug 27595) sha1 search of list=filearchive does not work +* (bug 26763) Make RSS/Atom of user contributions more visible === Languages updated in 1.19 === diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 5116d35e52..b51f108c84 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -262,6 +262,7 @@ $wgAutoloadLocalClasses = array( 'ApiEditPage' => 'includes/api/ApiEditPage.php', 'ApiEmailUser' => 'includes/api/ApiEmailUser.php', 'ApiExpandTemplates' => 'includes/api/ApiExpandTemplates.php', + 'ApiFeedContributions' => 'includes/api/ApiFeedContributions.php', 'ApiFeedWatchlist' => 'includes/api/ApiFeedWatchlist.php', 'ApiFileRevert' => 'includes/api/ApiFileRevert.php', 'ApiFormatBase' => 'includes/api/ApiFormatBase.php', diff --git a/includes/api/ApiFeedContributions.php b/includes/api/ApiFeedContributions.php new file mode 100644 index 0000000000..c1e968e064 --- /dev/null +++ b/includes/api/ApiFeedContributions.php @@ -0,0 +1,201 @@ +getMain() ); + } + + public function execute() { + $params = $this->extractRequestParams(); + + global $wgFeed, $wgFeedClasses, $wgSitename, $wgLanguageCode; + + if( !$wgFeed ) { + $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' ); + } + + if( !isset( $wgFeedClasses[ $params['feedformat'] ] ) ) { + $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' ); + } + + $msg = wfMsgForContent( 'Contributions' ); + $feedTitle = $wgSitename . ' - ' . $msg . ' [' . $wgLanguageCode . ']'; + $feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL(); + + $target = $params['user'] == 'newbies' + ? 'newbies' + : Title::makeTitleSafe( NS_USER, $params['user'] )->getText(); + + $feed = new $wgFeedClasses[$params['feedformat']] ( + $feedTitle, + htmlspecialchars( $msg ), + $feedUrl + ); + + $pager = new ContribsPager( array( + 'target' => $target, + 'namespace' => $params['namespace'], + 'year' => $params['year'], + 'month' => $params['month'], + 'tagFilter' => $params['tagfilter'], + 'deletedOnly' => $params['deletedonly'], + 'topOnly' => $params['toponly'], + 'showSizeDiff' => $params['showsizediff'], + ) ); + + $feedItems = array(); + if( $pager->getNumRows() > 0 ) { + foreach ( $pager->mResult as $row ) { + $feedItems[] = $this->feedItem( $row ); + } + } + + ApiFormatFeedWrapper::setResult( $this->getResult(), $feed, $feedItems ); + } + + protected function feedItem( $row ) { + $title = Title::MakeTitle( intval( $row->page_namespace ), $row->page_title ); + if( $title ) { + $date = $row->rev_timestamp; + $comments = $title->getTalkPage()->getFullURL(); + $revision = Revision::newFromTitle( $title, $row->rev_id ); + + return new FeedItem( + $title->getPrefixedText(), + $this->feedItemDesc( $revision ), + $title->getFullURL(), + $date, + $this->feedItemAuthor( $revision ), + $comments + ); + } else { + return null; + } + } + + /** + * @param $revision Revision + * @return string + */ + protected function feedItemAuthor( $revision ) { + return $revision->getUserText(); + } + + /** + * @param $revision Revision + * @return string + */ + protected function feedItemDesc( $revision ) { + if( $revision ) { + return '

' . htmlspecialchars( $revision->getUserText() ) . wfMsgForContent( 'colon-separator' ) . + htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) . + "

\n
\n
" . + nl2br( htmlspecialchars( $revision->getText() ) ) . "
"; + } + return ''; + } + + public function getAllowedParams() { + global $wgFeedClasses; + $feedFormatNames = array_keys( $wgFeedClasses ); + return array ( + 'feedformat' => array( + ApiBase::PARAM_DFLT => 'rss', + ApiBase::PARAM_TYPE => $feedFormatNames + ), + 'user' => array( + ApiBase::PARAM_TYPE => 'user', + ApiBase::PARAM_REQUIRED => true, + ), + 'namespace' => array( + ApiBase::PARAM_TYPE => 'namespace', + ApiBase::PARAM_ISMULTI => true + ), + 'year' => array( + ApiBase::PARAM_TYPE => 'integer' + ), + 'month' => array( + ApiBase::PARAM_TYPE => 'integer' + ), + 'tagfilter' => array( + ApiBase::PARAM_ISMULTI => true, + ApiBase::PARAM_TYPE => array_values( ChangeTags::listDefinedTags() ), + ApiBase::PARAM_DFLT => '', + ), + 'deletedonly' => false, + 'toponly' => false, + 'showsizediff' => false, + ); + } + + public function getParamDescription() { + return array( + 'feedformat' => 'The format of the feed', + 'user' => 'What users to get the contributions for', + 'namespace' => 'What namespace to filter the contributions by', + 'year' => 'From year (and earlier)', + 'month' => 'From month (and earlier)', + 'tagfilter' => 'Filter contributions that have these tags', + 'deletedonly' => 'Show only deleted contributions', + 'toponly' => 'Only show edits that are latest revisions', + 'showsizediff' => '', + ); + } + + public function getDescription() { + return 'Returns a user contributions feed'; + } + + public function getPossibleErrors() { + return array_merge( parent::getPossibleErrors(), array( + array( 'code' => 'feed-unavailable', 'info' => 'Syndication feeds are not available' ), + array( 'code' => 'feed-invalid', 'info' => 'Invalid subscription feed type' ), + ) ); + } + + protected function getExamples() { + return array( + 'api.php?action=feedcontributions&user=Reedy', + ); + } + + public function getVersion() { + return __CLASS__ . ': $Id$'; + } +} \ No newline at end of file diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index 21565bcf0d..62afcc5e41 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -60,6 +60,7 @@ class ApiMain extends ApiBase { 'expandtemplates' => 'ApiExpandTemplates', 'parse' => 'ApiParse', 'opensearch' => 'ApiOpenSearch', + 'feedcontributions' => 'ApiFeedContributions', 'feedwatchlist' => 'ApiFeedWatchlist', 'help' => 'ApiHelp', 'paraminfo' => 'ApiParamInfo', -- 2.20.1