http://www.mediawiki.org/wiki/Special:Code/MediaWiki/89462

Revision: 89462
Author:   nikerabbit
Date:     2011-06-04 11:41:40 +0000 (Sat, 04 Jun 2011)
Log Message:
-----------
Added a special page that allows deleting translatable pages or parts of them.
Actual deletion is not tested.

Modified Paths:
--------------
    trunk/extensions/Translate/PageTranslation.i18n.php
    trunk/extensions/Translate/Translate.alias.php
    trunk/extensions/Translate/Translate.php
    trunk/extensions/Translate/_autoload.php
    trunk/extensions/Translate/tag/PageTranslationHooks.php

Added Paths:
-----------
    trunk/extensions/Translate/tag/DeleteJob.php
    trunk/extensions/Translate/tag/SpecialPageTranslationDeletePage.php

Modified: trunk/extensions/Translate/PageTranslation.i18n.php
===================================================================
--- trunk/extensions/Translate/PageTranslation.i18n.php 2011-06-04 11:31:22 UTC 
(rev 89461)
+++ trunk/extensions/Translate/PageTranslation.i18n.php 2011-06-04 11:41:40 UTC 
(rev 89462)
@@ -77,7 +77,6 @@
 This page is a translation of page [[$1]] and the translation can be updated 
using [$2 the translation tool].',
        'tpt-unknown-page' => 'This namespace is reserved for content page 
translations.
 The page you are trying to edit does not seem to correspond any page marked 
for translation.',
-       'tpt-delete-impossible' => 'Deleting pages marked for translation is 
not yet possible.',
 
        'tpt-install' => 'Run php maintenance/update.php or web install to 
enable page translation feature.',
 
@@ -104,6 +103,10 @@
        'pt-log-unmark' => '{{GENDER:$2|removed}} page "[[:$1]]" from 
translation',
        'pt-log-moveok' => '{{GENDER:$2|completed}} renaming of translatable 
page $1 to a new name',
        'pt-log-movenok' => '{{GENDER:$2|encountered}} a problem while moving 
[[:$1]] to [[:$3]]',
+       'pt-log-delete-full-ok' => '{{GENDER:$2|completed}} deletion of 
translatable page $1',
+       'pt-log-delete-full-nok' => '{{GENDER:$2|encountered}} a problem while 
deleting translatable page [[:$1]]',
+       'pt-log-delete-lang-ok' => '{{GENDER:$2|completed}} deletion of 
translation page $e',
+       'pt-log-delete-lang-nok' => '{{GENDER:$2|encountered}} a problem while 
deleting translation page [[:$1]]',
 
 
        # move page replacement
@@ -144,6 +147,39 @@
 Please check the [[Special:Log/pagetranslation|page translation log]] for 
errors and completion message.',
 
        'pt-locked-page' => 'This page is locked because the translatable page 
is currently being moved.',
+
+
+       'pt-deletepage-lang-title' => 'Deleting translation page $1.',
+       'pt-deletepage-full-title' => 'Deleting translatable page $1.',
+
+       'pt-deletepage-invalid-title' => 'The specified page is not valid.',
+       'pt-deletepage-invalid-text' => 'The specified page is not a 
translatable page nor translation of it.',
+
+       'pt-deletepage-action-check' => 'List pages to be deleted',
+       'pt-deletepage-action-perform' => 'Do the deletion',
+       'pt-deletepage-action-other' => 'Change target',
+
+       'pt-deletepage-lang-legend' => 'Delete translation page',
+       'pt-deletepage-full-legend' => 'Delete translatable page',
+       'pt-deletepage-any-legend' => 'Delete translatable page or translation 
of translatable page',
+       'pt-deletepage-current' => 'Page name:',
+       'pt-deletepage-reason' => 'Reason:',
+       'pt-deletepage-subpages' => 'Delete all subpages',
+
+       'pt-deletepage-list-pages' => 'List of pages to delete',
+       'pt-deletepage-list-translation' => 'Translation pages',
+       'pt-deletepage-list-section' => 'Section pages',
+       'pt-deletepage-list-other' => 'Other subpages',
+       'pt-deletepage-list-count' => 'In total $1 {{PLURAL:$1|page|pages}} to 
delete.',
+
+       'pt-deletepage-full-logreason' => 'Part of translatable page $1.',
+       'pt-deletepage-lang-logreason' => 'Part of translation page $1.',
+       'pt-deletepage-started' => 'Please check the 
[[Special:Log/pagetranslation|page translation log]] for errors and completion 
message.',
+
+       'pt-deletepage-intro' => 'This special page allows you delete whole 
translatable pages or translations into one language.
+The delete action will not be instant, because many pages will need to be 
deleted.
+Failures will be logged in the [[Special:Log/pagetranslation|page translation 
log]] and they need to be repaired by hand.',
+
 );
 
 /** Message documentation (Message documentation)

Modified: trunk/extensions/Translate/Translate.alias.php
===================================================================
--- trunk/extensions/Translate/Translate.alias.php      2011-06-04 11:31:22 UTC 
(rev 89461)
+++ trunk/extensions/Translate/Translate.alias.php      2011-06-04 11:41:40 UTC 
(rev 89462)
@@ -22,6 +22,7 @@
        'FirstSteps' => array( 'FirstSteps' ),
        'SupportedLanguages' => array( 'SupportedLanguages' ),
        'MyLanguage' => array( 'MyLanguage' ),
+       'PageTranslationDeletePage' => array( 'PageTranslationDeletePage' ),
 );
 
 /** Afrikaans (Afrikaans) */

Modified: trunk/extensions/Translate/Translate.php
===================================================================
--- trunk/extensions/Translate/Translate.php    2011-06-04 11:31:22 UTC (rev 
89461)
+++ trunk/extensions/Translate/Translate.php    2011-06-04 11:41:40 UTC (rev 
89462)
@@ -8,7 +8,7 @@
  *
  * @author Niklas Laxström
  * @author Siebrand Mazeland
- * @copyright Copyright © 2006-2010, Niklas Laxström, Siebrand Mazeland
+ * @copyright Copyright © 2006-2011, Niklas Laxström, Siebrand Mazeland
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 
2.0 or later
  */
 
@@ -541,6 +541,8 @@
                global $wgSpecialPages, $wgAvailableRights, 
$wgSpecialPageGroups;
                $wgSpecialPages['PageTranslation'] = 'SpecialPageTranslation';
                $wgSpecialPageGroups['PageTranslation'] = 'pagetools';
+               $wgSpecialPages['PageTranslationDeletePage'] = 
'SpecialPageTranslationDeletePage';
+               $wgSpecialPageGroups['PageTranslationDeletePage'] = 'pagetools';
                $wgAvailableRights[] = 'pagetranslation';
 
                global $wgLogNames, $wgLogActionsHandlers, $wgLogTypes, 
$wgLogHeaders;
@@ -621,6 +623,9 @@
 
                // Replace subpage logic behaviour
                $wgHooks['SkinSubPageSubtitle'][] = 
'PageTranslationHooks::replaceSubtitle';
+
+               // Disable action=delete
+               $wgHooks['ArticleConfirmDelete'][] = 
'PageTranslationHooks::disableDelete';
        }
 }
 

Modified: trunk/extensions/Translate/_autoload.php
===================================================================
--- trunk/extensions/Translate/_autoload.php    2011-06-04 11:31:22 UTC (rev 
89461)
+++ trunk/extensions/Translate/_autoload.php    2011-06-04 11:41:40 UTC (rev 
89462)
@@ -4,7 +4,7 @@
  *
  * @file
  * @author Niklas Laxström
- * @copyright Copyright © 2008-2010, Niklas Laxström
+ * @copyright Copyright © 2008-2011, Niklas Laxström
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 
2.0 or later
  */
 
@@ -115,7 +115,6 @@
 
 $wgAutoloadClasses['MessageHandle'] = $dir . 'utils/MessageHandle.php';
 
-
 /**@}*/
 
 /**
@@ -150,8 +149,10 @@
 $wgAutoloadClasses['TPSection'] = $dir . 'tag/TPSection.php';
 $wgAutoloadClasses['SpecialPageTranslation'] = $dir . 
'tag/SpecialPageTranslation.php';
 $wgAutoloadClasses['SpecialPageTranslationMovePage'] = $dir . 
'tag/SpecialPageTranslationMovePage.php';
+$wgAutoloadClasses['SpecialPageTranslationDeletePage'] = $dir . 
'tag/SpecialPageTranslationDeletePage.php';
 $wgAutoloadClasses['RenderJob'] = $dir . 'tag/RenderJob.php';
 $wgAutoloadClasses['MoveJob'] = $dir . 'tag/MoveJob.php';
+$wgAutoloadClasses['DeleteJob'] = $dir . 'tag/MoveJob.php';
 /**@}*/
 
 /**

Added: trunk/extensions/Translate/tag/DeleteJob.php
===================================================================
--- trunk/extensions/Translate/tag/DeleteJob.php                                
(rev 0)
+++ trunk/extensions/Translate/tag/DeleteJob.php        2011-06-04 11:41:40 UTC 
(rev 89462)
@@ -0,0 +1,163 @@
+<?php
+/**
+ * Contains class with job for deleting translatable and translation pages.
+ *
+ * @file
+ * @author Niklas Laxström
+ * @copyright Copyright © 2008-2011, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 
2.0 or later
+ */
+
+/**
+ * Contains class with job for deleting translatable and translation pages.
+ *
+ * @ingroup PageTranslation JobQueue
+ * @todo Get rid of direct reference to $wgMemc.
+ */
+class DeleteJob extends Job {
+       public static function newJob( Title $target, $full, /*User*/ 
$performer ) {
+               global $wgTranslateFuzzyBotName;
+
+               $job = new self( $target );
+               $job->setUser( $wgTranslateFuzzyBotName );
+               $job->setFull( $full );
+               $msg = $this->getFull() ? 'pt-deletepage-full-logreason' : 
'pt-deletepage-lang-logreason';
+               $job->setSummary( wfMsgForContent( 'pt-deletepage-logreason', 
$target->getPrefixedText() ) );
+               $job->setPerformer( $performer );
+               $job->lock();
+               return $job;
+       }
+
+       function __construct( $title, $params = array(), $id = 0 ) {
+               parent::__construct( __CLASS__, $title, $params, $id );
+       }
+
+       function run() {
+               global $wgUser;
+
+               // Initialization
+               $title = $this->title;
+               // Other stuff
+               $user    = $this->getUser();
+               $summary = $this->getSummary();
+               $target  = $this->getTarget();
+
+               PageTranslationHooks::$allowTargetEdit = true;
+               $oldUser = $wgUser;
+               $wgUser = $user;
+
+               $error = '';
+               $ok = new Article( $title, 0 )->doDeleteArticle( $summary, 
false, 0, true, $error );
+               if ( !$ok ) {
+                       $logger = new LogPage( 'pagetranslation' );
+                       $params = array(
+                               'user' => $this->getPerformer(),
+                               'target' => $target->getPrefixedText(),
+                               'error' => base64_encode( serialize( $ok ) ), 
// This is getting ridiculous
+                       );
+                       $doer = User::newFromName( $this->getPerformer() );
+                       $msg = $this->getFull() ? 'deletefnok' : 'deletelnok';
+                       $logger->addEntry( $msg, $title, null, array( 
serialize( $params ) ), $doer );
+               }
+
+               PageTranslationHooks::$allowTargetEdit = false;
+
+               global $wgMemc;
+               $pages = (array) $wgMemc->get( wfMemcKey( 'pt-base', 
$title->getPrefixedText() ) );
+               $last = true;
+
+               foreach ( $pages as $page ) {
+                       if ( $wgMemc->get( wfMemcKey( 'pt-lock', $page ) ) === 
true ) {
+                               $last = false;
+                               break;
+                       }
+               }
+
+               if ( $last )  {
+                       $wgMemc->delete( wfMemcKey( 'pt-base',  
$title->getPrefixedText() ) );
+                       $logger = new LogPage( 'pagetranslation' );
+                       $params = array( 'user' => $this->getPerformer() );
+                       $doer = User::newFromName( $this->getPerformer() );
+                       $msg = $this->getFull() ? 'deletefok' : 'deletelok';
+                       $logger->addEntry( $msg, $title, null, array( 
serialize( $params ) ), $doer );
+               }
+
+               $wgUser = $oldUser;
+
+               return true;
+       }
+
+       public function setSummary( $summary ) {
+               $this->params['summary'] = $summary;
+       }
+
+       public function getSummary() {
+               return $this->params['summary'];
+       }
+
+       public function setFull( $full ) {
+               $this->params['full'] = $full;
+       }
+
+       public function getFull() {
+               return $this->params['full'];
+       }
+
+       public function setPerformer( $performer ) {
+               if ( is_object( $performer ) ) {
+                       $this->params['performer'] = $performer->getName();
+               } else {
+                       $this->params['performer'] = $performer;
+               }
+       }
+
+       public function getPerformer() {
+               return $this->params['performer'];
+       }
+
+       public function setUser( $user ) {
+               if ( is_object( $user ) ) {
+                       $this->params['user'] = $user->getName();
+               } else {
+                       $this->params['user'] = $user;
+               }
+       }
+
+       /**
+        * Get a user object for doing edits.
+        */
+       public function getUser() {
+               return User::newFromName( $this->params['user'], false );
+       }
+
+       /**
+        * Adapted from wfSuppressWarnings to allow not leaving redirects.
+        */
+       public static function forceRedirects( $end = false ) {
+               static $suppressCount = 0;
+               static $originalLevel = null;
+
+               global $wgGroupPermissions;
+               global $wgUser;
+
+               if ( $end ) {
+                       if ( $suppressCount ) {
+                               --$suppressCount;
+                               if ( !$suppressCount ) {
+                                       if ( $originalLevel === null ) {
+                                               unset( 
$wgGroupPermissions['*']['suppressredirect'] );
+                                       } else {
+                                               
$wgGroupPermissions['*']['suppressredirect'] = $originalLevel;
+                                       }
+                               }
+                       }
+               } else {
+                       if ( !$suppressCount ) {
+                               $originalLevel = isset( 
$wgGroupPermissions['*']['suppressredirect'] ) ? 
$wgGroupPermissions['*']['suppressredirect'] : null;
+                               $wgGroupPermissions['*']['suppressredirect'] = 
true;
+                       }
+                       ++$suppressCount;
+               }
+               $wgUser->clearInstanceCache();
+       }
+}


Property changes on: trunk/extensions/Translate/tag/DeleteJob.php
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: trunk/extensions/Translate/tag/PageTranslationHooks.php
===================================================================
--- trunk/extensions/Translate/tag/PageTranslationHooks.php     2011-06-04 
11:31:22 UTC (rev 89461)
+++ trunk/extensions/Translate/tag/PageTranslationHooks.php     2011-06-04 
11:41:40 UTC (rev 89462)
@@ -357,7 +357,7 @@
        /// Prevent editing of translation pages directly
        public static function preventDirectEditing( $title, $user, $action, 
&$result ) {
                $page = TranslatablePage::isTranslationPage( $title );
-               if ( $page !== false ) {
+               if ( $page !== false && $action !== 'delete' ) {
                        if ( self::$allowTargetEdit ) {
                                return true;
                        }
@@ -372,17 +372,19 @@
 
                                return false;
                        }
-               } elseif ( $action === 'delete' ) {
-                       $page = TranslatablePage::newFromTitle( $title );
-                       if ( $page->getMarkedTag() ) {
-                               $result = array( 'tpt-delete-impossible' );
-                               return false;
-                       }
                }
 
                return true;
        }
 
+       public static function disableDelete( $article, $wgOut, &$reason ) {
+               if ( TranslatablePage::isSourcePage( $article->mTitle ) || 
TranslatablePage::isTranslationPage( $article->mTitle ) ) {
+                       $new = SpecialPage::getTitleFor( 
'PageTranslationDeletePage', $article->mTitle->getPrefixedText() );
+                       $wgOut->redirect( $new->getFullUrl() );
+               }
+               return true;
+       }
+
        public static function schemaUpdates( $updater = null ) {
                $dir = dirname( __FILE__ ) . '/..';
 
@@ -550,6 +552,14 @@
                        return wfMsgExt( 'pt-log-moveok', $opts, 
$title->getPrefixedText(), $user );
                } elseif ( $action === 'movenok' ) {
                        return wfMsgExt( 'pt-log-movenok', $opts, 
$title->getPrefixedText(), $user, $_['target'] );
+               } elseif ( $action === 'deletefnok' ) {
+                       return wfMsgExt( 'pt-log-delete-full-nok', $opts, 
$title->getPrefixedText(), $user, $_['target'] );
+               } elseif ( $action === 'deletelnok' ) {
+                       return wfMsgExt( 'pt-log-delete-lang-nok', $opts, 
$title->getPrefixedText(), $user, $_['target'] );
+               } elseif ( $action === 'deletelok' ) {
+                       return wfMsgExt( 'pt-log-delete-full-ok', $opts, 
$title->getPrefixedText(), $user );
+               } elseif ( $action === 'deletefok' ) {
+                       return wfMsgExt( 'pt-log-delete-lang-ok', $opts, 
$title->getPrefixedText(), $user );
                }
        }
 

Added: trunk/extensions/Translate/tag/SpecialPageTranslationDeletePage.php
===================================================================
--- trunk/extensions/Translate/tag/SpecialPageTranslationDeletePage.php         
                (rev 0)
+++ trunk/extensions/Translate/tag/SpecialPageTranslationDeletePage.php 
2011-06-04 11:41:40 UTC (rev 89462)
@@ -0,0 +1,355 @@
+<?php
+/**
+ * Special page which enables deleting translations of translatable pages
+ *
+ * @file
+ * @author Niklas Laxström
+ * @copyright  Copyright © 2011, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 
2.0 or later
+ */
+
+/**
+ * Special page which enables deleting translations of translatable pages
+ *
+ * @ingroup SpecialPage
+ * @ingroup PageTranslation
+ */
+class SpecialPageTranslationDeletePage extends SpecialPage {
+       // Basic form parameters both as text and as titles
+       protected $text, $title;
+
+       // Other form parameters
+       /// 'check' or 'perform'
+       protected $subaction;
+
+       /// There must be reason for everything.
+       protected $reason;
+
+       /// Allow skipping non-translation subpages.
+       protected $doSubpages = false;
+
+
+       /// TranslatablePage instance.
+       protected $page;
+       /// Contains the language code if we are working with translation page
+       protected $code;
+
+       /// User instance.
+       protected $user;
+
+       public function __construct() {
+               parent::__construct( 'PageTranslationDeletePage' );
+       }
+
+       public function execute( $par ) {
+               global $wgOut, $wgRequest, $wgUser;
+
+               // Yes, the use of getVal() and getText() is wanted, see bug 
20365
+               $this->text = $wgRequest->getVal( 'wpTitle', $par );
+               $this->title = Title::newFromText( $this->text );
+               $this->reason = $wgRequest->getText( 'reason' );
+               // Checkboxes that default being checked are tricky
+               $this->doSubpages = $wgRequest->getBool( 'subpages', 
!$wgRequest->wasPosted() );
+
+               $this->user = $wgUser;
+
+               if ( $this->doBasicChecks() !== true ) {
+                       return;
+               }
+
+               // Real stuff starts here
+               if ( TranslatablePage::isSourcePage( $this->title ) ) {
+                       $wgOut->setPagetitle( wfMsg( 
'pt-deletepage-full-title', $this->title->getPrefixedText() ) );
+
+                       $this->code = '';
+                       $this->page = TranslatablePage::newFromTitle( 
$this->title );
+               } else {
+                       $page = TranslatablePage::isTranslationPage( 
$this->title );
+                       if ( $page ) {
+                               $wgOut->setPagetitle( wfMsg( 
'pt-deletepage-lang-title', $this->title->getPrefixedText() ) );
+
+                               list( , $this->code ) = 
TranslateUtils::figureMessage( $this->title->getText() );
+                               $this->page = $page;
+                       } else {
+                               $wgOut->showErrorPage( 
'pt-deletepage-invalid-title', 'pt-deletepage-invalid-text' );
+                               return;
+                       }
+               }
+
+               if ( !$this->user->isAllowed( 'pagetranslation' ) ) {
+                       $wgOut->permissionRequired( 'pagetranslation' );
+                       return;
+               }
+
+               // Is there really no better way to do this?
+               $subactionText = $wgRequest->getText( 'subaction' );
+               switch ( $subactionText ) {
+               case wfMsg( 'pt-deletepage-action-check' ):
+                       $subaction = 'check'; break;
+               case wfMsg( 'pt-deletepage-action-perform' ):
+                       $subaction = 'perform'; break;
+               case wfMsg( 'pt-deletepage-action-other' ):
+                       $subaction = ''; break;
+               default:
+                       $subaction = '';
+               }
+
+               if ( $subaction === 'check' && $this->checkToken() && 
$wgRequest->wasPosted() ) {
+                       $this->showConfirmation();
+               } elseif ( $subaction === 'perform' && $this->checkToken() && 
$wgRequest->wasPosted() ) {
+                       $this->performAction();
+               } else {
+                       $this->showForm();
+               }
+
+       }
+
+       /**
+        * Do the basic checks whether moving is possible and whether
+        * the input looks anywhere near sane.
+        */
+       protected function doBasicChecks() {
+               global $wgOut;
+               # Check for database lock
+               if ( wfReadOnly() ) {
+                       $wgOut->readOnlyPage();
+                       return;
+               }
+
+               if ( !$this->title->exists() ) {
+                       $wgOut->showErrorPage( 'nopagetitle', 'nopagetext' );
+                       return;
+               }
+
+               # Check rights
+               $permErrors = $this->title->getUserPermissionsErrors( 'delete', 
$this->user );
+               if ( !empty( $permErrors ) ) {
+                       $wgOut->showPermissionsErrorPage( $permErrors );
+                       return;
+               }
+
+               // Let the caller know it's safe to continue
+               return true;
+       }
+
+       /**
+        * Checks token. Use before real actions happen. Have to use wpEditToken
+        * for compatibility for SpecialMovepage.php.
+        */
+       protected function checkToken() {
+               global $wgRequest;
+               return $this->user->matchEditToken( $wgRequest->getVal( 
'wpEditToken' ) );
+       }
+
+       /**
+        * The query form.
+        */
+       protected function showForm() {
+               global $wgOut;
+
+               $wgOut->addWikiMsg( 'pt-deletepage-intro' );
+
+               $br = Html::element( 'br' );
+               $subaction = array( 'name' => 'subaction' );
+               $formParams = array( 'method' => 'post', 'action' => 
$this->getTitle( $this->text )->getLocalURL() );
+
+               $form = array();
+               $form[] = Xml::fieldset( wfMsg( 'pt-deletepage-any-legend' ) );
+               $form[] = Html::openElement( 'form', $formParams );
+               $form[] = Html::hidden( 'wpEditToken', $this->user->editToken() 
);
+               $this->addInputLabel( $form, wfMsg( 'pt-deletepage-current' ), 
'wpTitle', 30, $this->text );
+               $this->addInputLabel( $form, wfMsg( 'pt-deletepage-reason' ), 
'reason', 60, $this->reason );
+               $form[] = Xml::submitButton( wfMsg( 
'pt-deletepage-action-check' ), $subaction );
+               $form[] = Xml::closeElement( 'form' );
+               $form[] = Xml::closeElement( 'fieldset' );
+               $wgOut->addHTML( implode( "\n", $form ) );
+       }
+
+       /**
+        * Shortcut for keeping the code at least a bit readable. Adds label 
and input into $form array.
+        * @param $form \list{String} Array where input element and label is 
appended.
+        * @param $label \string Label text.
+        * @param $name \string Name attribute.
+        * @param $size \int Size attribute of the input element. Default false.
+        * @param $text \string Text of the value attribute. Default false.
+        * @param $attribs \array Extra attributes. Default empty array.
+        */
+       protected function addInputLabel( &$form, $label, $name, $size = false 
, $text = false, $attribs = array() ) {
+               $br = Html::element( 'br' );
+               list( $label, $input ) = Xml::inputLabelSep( $label, $name, 
$name, $size, $text, $attribs );
+               $form[] = $label . $br;
+               $form[] = $input . $br;
+       }
+
+       /**
+        * The second form, which still allows changing some things.
+        * Lists all the action which would take place.
+        */
+       protected function showConfirmation() {
+               global $wgOut, $wgLang;
+
+               $wgOut->addWikiMsg( 'pt-deletepage-intro' );
+
+               $base = $this->title->getPrefixedText();
+               $target = $this->title;
+               $count = 1; // Base page
+
+               $wgOut->wrapWikiMsg( '== $1 ==', 'pt-deletepage-list-pages' );
+               if ( !$this->singleLanguage() ) {
+                       $this->printChangeLine( $this->title );
+               }
+
+               $wgOut->wrapWikiMsg( '=== $1 ===', 
'pt-deletepage-list-translation' );
+               $translationPages = $this->getTranslationPages();
+               foreach ( $translationPages as $old ) {
+                       $count++;
+                       $this->printChangeLine( $old );
+               }
+
+               $wgOut->wrapWikiMsg( '=== $1 ===', 'pt-deletepage-list-section' 
);
+               $sectionPages = $this->getSectionPages( $target );
+               foreach ( $sectionPages as $old ) {
+                       $count++;
+                       $this->printChangeLine( $old );
+               }
+
+               $wgOut->wrapWikiMsg( '=== $1 ===', 'pt-deletepage-list-other' );
+               $subpages = $this->getSubpages();
+               foreach ( $subpages as $old ) {
+                       if ( TranslatablePage::isTranslationPage( $old ) ) 
continue;
+                       if ( $this->doSubpages ) { $count++; }
+                       $this->printChangeLine( $old, $this->doSubpages );
+               }
+
+               $wgOut->addWikiText( "----\n" );
+               $wgOut->addWikiMsg( 'pt-deletepage-list-count', 
$wgLang->formatNum( $count ) );
+
+               $br = Html::element( 'br' );
+               $readonly =  array( 'readonly' => 'readonly' );
+
+               $subaction = array( 'name' => 'subaction' );
+               $formParams = array( 'method' => 'post', 'action' => 
$this->getTitle( $this->text )->getLocalURL() );
+
+               $form = array();
+               if ( $this->singleLanguage() ) {
+                       $form[] = Xml::fieldset( wfMsg( 
'pt-deletepage-lang-legend' ) );
+               } else {
+                       $form[] = Xml::fieldset( wfMsg( 
'pt-deletepage-full-legend' ) );
+               }
+               $form[] = Html::openElement( 'form', $formParams );
+               $form[] = Html::hidden( 'wpEditToken', $this->user->editToken() 
);
+               $this->addInputLabel( $form, wfMsg( 'pt-deletepage-current' ), 
'wpTitle', 30, $this->text, $readonly );
+               $this->addInputLabel( $form, wfMsg( 'pt-deletepage-reason' ), 
'reason', 60, $this->reason );
+               $form[] = Xml::checkLabel( wfMsg( 'pt-deletepage-subpages' ), 
'subpages', 'mw-subpages', $this->doSubpages, $readonly ) . $br;
+               $form[] = Xml::submitButton( wfMsg( 
'pt-deletepage-action-perform' ), $subaction );
+               $form[] = Xml::submitButton( wfMsg( 
'pt-deletepage-action-other' ), $subaction );
+               $form[] = Xml::closeElement( 'form' );
+               $form[] = Xml::closeElement( 'fieldset' );
+               $wgOut->addHTML( implode( "\n", $form ) );
+       }
+
+       protected function printChangeLine( $title, $enabled = true ) {
+               global $wgOut;
+               if ( $enabled ) {
+                       $wgOut->addWikiText( '* ' . $title->getPrefixedText() );
+               } else {
+                       $wgOut->addWikiText( '* <s>' . 
$title->getPrefixedText() . '</s>' );
+               }
+       }
+
+       protected function performAction() {
+               $jobs = array();
+               $target = $this->title;
+
+               $translationPages = $this->getTranslationPages();
+               foreach ( $translationPages as $old ) {
+                       $jobs[$old->getPrefixedText()] = DeleteJob::newJob( 
$old, !$this->singleLanguage(), $this->user );
+               }
+
+               $sectionPages = $this->getSectionPages();
+               foreach ( $sectionPages as $old ) {
+                       $to = $this->newPageTitle( $base, $old, $target );
+                       $jobs[$old->getPrefixedText()] = DeleteJob::newJob( 
$old, !$this->singleLanguage(), $this->user );
+               }
+
+               if ( !$this->doSubpages ) {
+                       $subpages = $this->getSubpages();
+                       foreach ( $subpages as $old ) {
+                               if ( TranslatablePage::isTranslationPage( $old 
) ) {
+                                       continue;
+                               }
+
+                               $to = $this->newPageTitle( $base, $old, $target 
);
+                               $jobs[$old->getPrefixedText()] = 
DeleteJob::newJob( $old, !$this->singleLanguage(), $this->user );
+                       }
+               }
+
+               Job::batchInsert( $jobs );
+
+               global $wgMemc;
+               $wgMemc->set( wfMemcKey( 'pt-base', $base ), array_keys( $jobs 
), 60 * 60 * 6 );
+
+
+               if ( !$this->singleLanguage() ) {
+                       $this->page->removeTags();
+               }
+
+               MessageGroups::clearCache();
+               // TODO: defer or make faster
+               MessageIndexRebuilder::execute();
+
+               global $wgOut;
+               $wgOut->addWikiMsg( 'pt-deletepage-started' );
+       }
+
+       /**
+        * Returns all section pages, including those which are currently not 
active.
+        * @return TitleArray.
+        */
+       protected function getSectionPages() {
+               if ( !isset( $this->sectionPages ) ) {
+                       $base = $this->page->getTitle()->getPrefixedDBKey();
+
+                       $dbw = wfGetDB( DB_MASTER );
+                       if ( $this->singleLanguage() ) {
+                               $like = $dbw->buildLike( "$base/", 
$dbw->anyString(), "/{$this->code}" );
+                       } else {
+                               $like = $dbw->buildLike( "$base/", 
$dbw->anyString() );
+                       }
+
+                       $fields = array( 'page_namespace', 'page_title' );
+                       $titleCond = 'page_title ' . $like;
+                       $conds = array( 'page_namespace' => NS_TRANSLATIONS, 
$titleCond );
+                       $result = $dbw->select( 'page', $fields, $conds, 
__METHOD__ );
+                       $this->sectionPages = TitleArray::newFromResult( 
$result );
+               }
+               return $this->sectionPages;
+       }
+
+       /**
+        * Returns only translation subpages.
+        * @return Array of titles.
+        */
+       protected function getTranslationPages() {
+               if ( $this->singleLanguage() ) {
+                       return array( $this->title );
+               }
+
+               if ( !isset( $this->translationPages ) ) {
+                       $this->translationPages = 
$this->page->getTranslationPages();
+               }
+               return $this->translationPages;
+       }
+
+       /**
+        * Returns all subpages, if the namespace has them enabled.
+        * @return Empty array or TitleArray
+        */
+       protected function getSubpages() {
+               return $this->title->getSubpages();
+       }
+
+       protected function singleLanguage() {
+               return $this->code !== '';
+       }
+}


Property changes on: 
trunk/extensions/Translate/tag/SpecialPageTranslationDeletePage.php
___________________________________________________________________
Added: svn:eol-style
   + native


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to