Make edit link conditional on Special:BrokenRedirects/DoubleRedirects
authorumherirrender <umherirrender_de.wp@web.de>
Fri, 6 Nov 2015 09:36:59 +0000 (10:36 +0100)
committerUmherirrender <umherirrender_de.wp@web.de>
Fri, 6 Nov 2015 11:28:18 +0000 (11:28 +0000)
When an user has no permission, do not show an edit link.
Also do not show an edit link when content model does not allow direct
editing, like WikiData items.

For performance reason the special pages now run a LinkBatch to collect
the content model information.

Bug: T117900
Change-Id: Ieb56a6f314059356b95bc045f3d255930d54f213

includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialDoubleRedirects.php

index 701f75f..9ea18da 100644 (file)
@@ -121,12 +121,20 @@ class BrokenRedirectsPage extends QueryPage {
                        array( 'redirect' => 'no' )
                );
                $links = array();
-               $links[] = Linker::linkKnown(
-                       $fromObj,
-                       $this->msg( 'brokenredirects-edit' )->escaped(),
-                       array(),
-                       array( 'action' => 'edit' )
-               );
+               // if the page is editable, add an edit link
+               if (
+                       // check user permissions
+                       $this->getUser()->isAllowed( 'edit' ) &&
+                       // check, if the content model is editable through action=edit
+                       ContentHandler::getForTitle( $fromObj )->supportsDirectEditing()
+               ) {
+                       $links[] = Linker::linkKnown(
+                               $fromObj,
+                               $this->msg( 'brokenredirects-edit' )->escaped(),
+                               array(),
+                               array( 'action' => 'edit' )
+                       );
+               }
                $to = Linker::link(
                        $toObj,
                        null,
@@ -147,13 +155,37 @@ class BrokenRedirectsPage extends QueryPage {
                        );
                }
 
-               $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()
-                       ->pipeList( $links ) )->escaped();
+               if ( $links ) {
+                       $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()
+                               ->pipeList( $links ) )->escaped();
+               }
                $out .= " {$arr} {$to}";
 
                return $out;
        }
 
+
+       /**
+        * Cache page content model for performance
+        *
+        * @param IDatabase $db
+        * @param ResultWrapper $res
+        */
+       function preprocessResults( $db, $res ) {
+               if ( !$res->numRows() ) {
+                       return;
+               }
+
+               $batch = new LinkBatch;
+               foreach ( $res as $row ) {
+                       $batch->add( $row->namespace, $row->title );
+               }
+               $batch->execute();
+
+               // Back to start for display
+               $res->seek( 0 );
+       }
+
        protected function getGroupName() {
                return 'maintenance';
        }
index 6d40985..c04582e 100644 (file)
@@ -151,14 +151,24 @@ class DoubleRedirectsPage extends QueryPage {
                        array( 'redirect' => 'no' )
                );
 
-               $edit = Linker::linkKnown(
-                       $titleA,
-                       $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
-                       array(),
-                       array(
-                               'action' => 'edit'
-                       )
-               );
+               // if the page is editable, add an edit link
+               if (
+                       // check user permissions
+                       $this->getUser()->isAllowed( 'edit' ) &&
+                       // check, if the content model is editable through action=edit
+                       ContentHandler::getForTitle( $titleA )->supportsDirectEditing()
+               ) {
+                       $edit = Linker::linkKnown(
+                               $titleA,
+                               $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
+                               array(),
+                               array(
+                                       'action' => 'edit'
+                               )
+                       );
+               } else {
+                       $edit = '';
+               }
 
                $linkB = Linker::linkKnown(
                        $titleB,
@@ -175,6 +185,35 @@ class DoubleRedirectsPage extends QueryPage {
                return ( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
        }
 
+       /**
+        * Cache page content model and gender distinction for performance
+        *
+        * @param IDatabase $db
+        * @param ResultWrapper $res
+        */
+       function preprocessResults( $db, $res ) {
+               if ( !$res->numRows() ) {
+                       return;
+               }
+
+               $batch = new LinkBatch;
+               foreach ( $res as $row ) {
+                       $batch->add( $row->namespace, $row->title );
+                       if ( isset( $row->nsb ) ) {
+                               // lazy loaded when using cached results
+                               $batch->add( $row->nsb, $row->tb );
+                       }
+                       if ( isset( $row->iwc ) && !$row->iwc ) {
+                               // lazy loaded when using cached result, not added when interwiki link
+                               $batch->add( $row->nsc, $row->tc );
+                       }
+               }
+               $batch->execute();
+
+               // Back to start for display
+               $res->seek( 0 );
+       }
+
        protected function getGroupName() {
                return 'maintenance';
        }