diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2010-09-14 09:06:35 +0200 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2010-09-14 09:06:35 +0200 |
commit | 0e8a0afedebf2b6df9f70e0ffe3d74765417b86e (patch) | |
tree | 09368a5531730f68a5ec13e7d63c0246793475c5 /extensions/Nuke/Nuke_body.php | |
parent | bd77ddf4c271105b627aaf367d0e2b499de88304 (diff) |
Add Nuke extension
This extension allow mass deletion of pages
Revision: 72823
Homepage: http://www.mediawiki.org/wiki/Extension:Nuke
Diffstat (limited to 'extensions/Nuke/Nuke_body.php')
-rw-r--r-- | extensions/Nuke/Nuke_body.php | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/extensions/Nuke/Nuke_body.php b/extensions/Nuke/Nuke_body.php new file mode 100644 index 00000000..d493bb8b --- /dev/null +++ b/extensions/Nuke/Nuke_body.php @@ -0,0 +1,154 @@ +<?php + +if( !defined( 'MEDIAWIKI' ) ) + die( 'Not an entry point.' ); + +class SpecialNuke extends SpecialPage { + function __construct() { + wfLoadExtensionMessages( 'Nuke' ); + parent::__construct( 'Nuke', 'nuke' ); + } + + function execute( $par ){ + global $wgUser, $wgRequest; + + if( !$this->userCanExecute( $wgUser ) ){ + $this->displayRestrictionError(); + return; + } + + $this->setHeaders(); + $this->outputHeader(); + + $target = $wgRequest->getText( 'target', $par ); + + // Normalise name + if ( $target !== '' ) { + $user = User::newFromName( $target ); + if ( $user ) $target = $user->getName(); + } + + $reason = $wgRequest->getText( 'wpReason', + wfMsgForContent( 'nuke-defaultreason', $target ) ); + $posted = $wgRequest->wasPosted() && + $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ); + if( $posted ) { + $pages = $wgRequest->getArray( 'pages' ); + if( $pages ) { + return $this->doDelete( $pages, $reason ); + } + } + if( $target != '' ) { + $this->listForm( $target, $reason ); + } else { + $this->promptForm(); + } + } + + function promptForm() { + global $wgOut; + + $input = Xml::input( 'target', 40 ); + $submit = Xml::submitButton( wfMsg( 'nuke-submit-user' ) ); + + $wgOut->addWikiMsg( 'nuke-tools' ); + $wgOut->addHTML( + Xml::openElement( 'form', array( + 'action' => $this->getTitle()->getLocalURL( 'action=submit' ), + 'method' => 'post' ) + ) . "$input\n$submit\n" + ); + + $wgOut->addHTML( "</form>" ); + } + + function listForm( $username, $reason ) { + global $wgUser, $wgOut, $wgLang; + + $pages = $this->getNewPages( $username ); + + if( count( $pages ) == 0 ) { + $wgOut->addWikiMsg( 'nuke-nopages', $username ); + return $this->promptForm(); + } + $wgOut->addWikiMsg( 'nuke-list', $username ); + + $nuke = $this->getTitle(); + $submit = Xml::submitButton( wfMsg( 'nuke-submit-delete' ) ); + + $wgOut->addHTML( + Xml::openElement( 'form', array( + 'action' => $nuke->getLocalURL( 'action=delete' ), + 'method' => 'post' ) + ) . + Xml::hidden( 'wpEditToken', $wgUser->editToken() ) . + Xml::inputLabel( + wfMsg( 'deletecomment' ), 'wpReason', 'wpReason', 60, $reason + ) . '<br /><br />' . + Xml::submitButton( wfMsg( 'nuke-submit-delete' ) ) + ); + + $wgOut->addHTML( '<ul>' ); + + $sk = $wgUser->getSkin(); + foreach( $pages as $info ) { + list( $title, $edits ) = $info; + $image = $title->getNamespace() == NS_IMAGE ? wfLocalFile( $title ) : false; + $thumb = $image && $image->exists() ? $image->getThumbnail( 120, 120 ) : false; + + $changes = wfMsgExt( 'nchanges', 'parsemag', $wgLang->formatNum( $edits ) ); + + $wgOut->addHTML( '<li>' . + Xml::check( 'pages[]', true, + array( 'value' => $title->getPrefixedDbKey() ) + ) . + ' ' . + ( $thumb ? $thumb->toHtml( array( 'desc-link' => true ) ) : '' ) . + $sk->makeKnownLinkObj( $title ) . + ' (' . + $sk->makeKnownLinkObj( $title, $changes, 'action=history' ) . + ")</li>\n" ); + } + $wgOut->addHTML( + "</ul>\n" . + Xml::submitButton( wfMsg( 'nuke-submit-delete' ) ) . + "</form>" + ); + } + + function getNewPages( $username ) { + $dbr = wfGetDB( DB_SLAVE ); + $result = $dbr->select( 'recentchanges', + array( 'rc_namespace', 'rc_title', 'rc_timestamp', 'COUNT(*) AS edits' ), + array( + 'rc_user_text' => $username, + "(rc_new = 1) OR (rc_log_type = 'import' AND rc_log_action = 'upload')" + ), + __METHOD__, + array( + 'ORDER BY' => 'rc_timestamp DESC', + 'GROUP BY' => 'rc_namespace, rc_title' + ) + ); + $pages = array(); + while( $row = $dbr->fetchObject( $result ) ) { + $pages[] = array( Title::makeTitle( $row->rc_namespace, $row->rc_title ), $row->edits ); + } + $dbr->freeResult( $result ); + return $pages; + } + + function doDelete( $pages, $reason ) { + foreach( $pages as $page ) { + $title = Title::newFromURL( $page ); + $file = $title->getNamespace() == NS_IMAGE ? wfLocalFile( $title ) : false; + if ( $file ) { + $oldimage = null; // Must be passed by reference + FileDeleteForm::doDelete( $title, $file, $oldimage, $reason, false ); + } else { + $article = new Article( $title ); + $article->doDelete( $reason ); + } + } + } +} |