* New special page: Special:Protectedtitles, which lists titles protected from creation.
authorAndrew Garrett <werdna@users.mediawiki.org>
Sat, 15 Dec 2007 06:24:55 +0000 (06:24 +0000)
committerAndrew Garrett <werdna@users.mediawiki.org>
Sat, 15 Dec 2007 06:24:55 +0000 (06:24 +0000)
* Requires schema change introduced in r28385, and perfected in later revisions.

includes/SpecialPage.php
includes/SpecialProtectedtitles.php [new file with mode: 0755]
languages/messages/MessagesEn.php

index 6dd707f..7cffa12 100644 (file)
@@ -112,6 +112,7 @@ class SpecialPage
                'Ancientpages'              => array( 'SpecialPage', 'Ancientpages' ),
                'Deadendpages'              => array( 'SpecialPage', 'Deadendpages' ),
                'Protectedpages'            => array( 'SpecialPage', 'Protectedpages' ),
+               'Protectedtitles'           => array( 'SpecialPage', 'Protectedtitles' ),
                'Allpages'                  => array( 'IncludableSpecialPage', 'Allpages' ),
                'Prefixindex'               => array( 'IncludableSpecialPage', 'Prefixindex' ) ,
                'Ipblocklist'               => array( 'SpecialPage', 'Ipblocklist' ),
diff --git a/includes/SpecialProtectedtitles.php b/includes/SpecialProtectedtitles.php
new file mode 100755 (executable)
index 0000000..69638af
--- /dev/null
@@ -0,0 +1,219 @@
+<?php
+/**
+ *
+ * @addtogroup SpecialPage
+ */
+
+/**
+ * @todo document
+ * @addtogroup SpecialPage
+ */
+class ProtectedTitlesForm {
+
+       protected $IdLevel = 'level';
+       protected $IdType  = 'type';
+
+       function showList( $msg = '' ) {
+               global $wgOut, $wgRequest;
+
+               $wgOut->setPagetitle( wfMsg( "protectedtitles" ) );
+               if ( "" != $msg ) {
+                       $wgOut->setSubtitle( $msg );
+               }
+
+               // Purge expired entries on one in every 10 queries
+               if ( !mt_rand( 0, 10 ) ) {
+                       Title::purgeExpiredRestrictions();
+               }
+
+               $type = $wgRequest->getVal( $this->IdType );
+               $level = $wgRequest->getVal( $this->IdLevel );
+               $sizetype = $wgRequest->getVal( 'sizetype' );
+               $size = $wgRequest->getIntOrNull( 'size' );
+               $NS = $wgRequest->getIntOrNull( 'namespace' );
+
+               $pager = new ProtectedTitlesPager( $this, array(), $type, $level, $NS, $sizetype, $size );      
+
+               $wgOut->addHTML( $this->showOptions( $NS, $type, $level, $sizetype, $size ) );
+
+               if ( $pager->getNumRows() ) {
+                       $s = $pager->getNavigationBar();
+                       $s .= "<ul>" . 
+                               $pager->getBody() .
+                               "</ul>";
+                       $s .= $pager->getNavigationBar();
+               } else {
+                       $s = '<p>' . wfMsgHtml( 'protectedtitlesempty' ) . '</p>';
+               }
+               $wgOut->addHTML( $s );
+       }
+
+       /**
+        * Callback function to output a restriction
+        */
+       function formatRow( $row ) {
+               global $wgUser, $wgLang, $wgContLang;
+
+               wfProfileIn( __METHOD__ );
+
+               static $skin=null;
+
+               if( is_null( $skin ) )
+                       $skin = $wgUser->getSkin();
+               
+               $title = Title::makeTitleSafe( $row->pt_namespace, $row->pt_title );
+               $link = $skin->makeLinkObj( $title );
+
+               $description_items = array ();
+
+               $protType = wfMsgHtml( 'restriction-level-' . $row->pt_create_perm );
+
+               $description_items[] = $protType;
+
+               $expiry_description = ''; $stxt = '';
+
+               if ( $row->pt_expiry != 'infinity' && strlen($row->pt_expiry) ) {
+                       $expiry = Block::decodeExpiry( $row->pt_expiry );
+       
+                       $expiry_description = wfMsgForContent( 'protect-expiring', $wgLang->timeanddate( $expiry ) );
+
+                       $description_items[] = $expiry_description;
+               }
+               
+               wfProfileOut( __METHOD__ );
+
+               return '<li>' . wfSpecialList( $link . $stxt, implode( $description_items, ', ' ) ) . "</li>\n";
+       }
+       
+       /**
+        * @param $namespace int
+        * @param $type string
+        * @param $level string
+        * @param $minsize int
+        * @private
+        */
+       function showOptions( $namespace, $type='edit', $level, $sizetype, $size ) {
+               global $wgScript;
+               $action = htmlspecialchars( $wgScript );
+               $title = SpecialPage::getTitleFor( 'ProtectedTitles' );
+               $special = htmlspecialchars( $title->getPrefixedDBkey() );
+               return "<form action=\"$action\" method=\"get\">\n" .
+                       '<fieldset>' .
+                       Xml::element( 'legend', array(), wfMsg( 'protectedtitles' ) ) .
+                       Xml::hidden( 'title', $special ) . "&nbsp;\n" .
+                       $this->getNamespaceMenu( $namespace ) . "&nbsp;\n" .
+                       $this->getLevelMenu( $level ) . "<br/>\n" .
+                       "&nbsp;" . Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n" .
+                       "</fieldset></form>";
+       }
+       
+       /**
+        * Prepare the namespace filter drop-down; standard namespace
+        * selector, sans the MediaWiki namespace
+        *
+        * @param mixed $namespace Pre-select namespace
+        * @return string
+        */
+       function getNamespaceMenu( $namespace = null ) {
+               return Xml::label( wfMsg( 'namespace' ), 'namespace' )
+                       . '&nbsp;'
+                       . Xml::namespaceSelector( $namespace, '' );
+       }
+
+       /**
+        * @return string Formatted HTML
+        * @private
+        */     
+       function getLevelMenu( $pr_level ) {
+               global $wgRestrictionLevels;
+
+               $m = array( wfMsg('restriction-level-all') => 0 ); // Temporary array
+               $options = array();
+
+               // First pass to load the log names
+               foreach( $wgRestrictionLevels as $type ) {
+                       if ( $type !='' && $type !='*') {
+                               $text = wfMsg("restriction-level-$type");
+                               $m[$text] = $type;
+                       }
+               }
+
+               // Third pass generates sorted XHTML content
+               foreach( $m as $text => $type ) {
+                       $selected = ($type == $pr_level );
+                       $options[] = Xml::option( $text, $type, $selected );
+               }
+
+               return
+                       Xml::label( wfMsg('restriction-level') , $this->IdLevel ) . '&nbsp;' .
+                       Xml::tags( 'select',
+                               array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
+                               implode( "\n", $options ) );
+       }
+}
+
+/**
+ * @todo document
+ * @addtogroup Pager
+ */
+class ProtectedtitlesPager extends AlphabeticPager {
+       public $mForm, $mConds;
+
+       function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype='', $size=0 ) {
+               $this->mForm = $form;
+               $this->mConds = $conds;
+               $this->level = $level;
+               $this->namespace = $namespace;
+               $this->size = intval($size);
+               parent::__construct();
+       }
+
+       function getStartBody() {
+               wfProfileIn( __METHOD__ );
+               # Do a link batch query
+               $this->mResult->seek( 0 );
+               $lb = new LinkBatch;
+
+               while ( $row = $this->mResult->fetchObject() ) {
+                       $lb->add( $row->pt_namespace, $row->pt_title );
+               }
+
+               $lb->execute();
+               wfProfileOut( __METHOD__ );
+               return '';
+       }
+       
+       function formatRow( $row ) {
+               return $this->mForm->formatRow( $row );
+       }
+
+       function getQueryInfo() {
+               $conds = $this->mConds;
+               $conds[] = 'pt_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() );
+               
+               if( !is_null($this->namespace) )
+                       $conds[] = 'pt_namespace=' . $this->mDb->addQuotes( $this->namespace );
+               return array(
+                       'tables' => 'protected_titles',
+                       'fields' => 'pt_namespace,pt_title,pt_create_perm,pt_expiry,pt_timestamp',
+                       'conds' => $conds
+               );
+       }
+
+       function getIndexField() {
+               return 'pt_timestamp';
+       }
+}
+
+/**
+ * Constructor
+ */
+function wfSpecialProtectedtitles() {
+
+       $ppForm = new ProtectedTitlesForm();
+
+       $ppForm->showList();
+}
+
+
+
index b1edeba..fbe1337 100644 (file)
@@ -382,6 +382,7 @@ $specialPageAliases = array(
        'Ancientpages'              => array( 'Ancientpages' ),
        'Deadendpages'              => array( 'Deadendpages' ),
        'Protectedpages'            => array( 'Protectedpages' ),
+       'Protectedtitles'           => array( 'Protectedtitles' ),
        'Allpages'                  => array( 'Allpages' ),
        'Prefixindex'               => array( 'Prefixindex' ) ,
        'Ipblocklist'               => array( 'Ipblocklist' ),
@@ -1695,6 +1696,10 @@ The [http://meta.wikimedia.org/wiki/Help:Job_queue job queue] length is '''\$7''
 'protectedpages-summary'          => '', # only translate this message to other languages if you have to change it
 'protectedpagestext'              => 'The following pages are protected from moving or editing',
 'protectedpagesempty'             => 'No pages are currently protected with these parameters.',
+'protectedtitles'                  => 'Protected titles',
+'protectedtitles-summary'          => '', # only translate this message to other languages if you have to change it
+'protectedtitlestext'              => 'The following titles are protected from creation',
+'protectedtitlesempty'             => 'No titles are currently protected with these parameters.',
 'listusers'                       => 'User list',
 'listusers-summary'               => '', # only translate this message to other languages if you have to change it
 'specialpages'                    => 'Special pages',