jenkins-bot has submitted this change and it was merged.

Change subject: Major rewrite of SpecialSetLabelDescriptionAliases
......................................................................


Major rewrite of SpecialSetLabelDescriptionAliases

Still some missing features and issues, but I will fix these in later
patches. Please merge this as it is, as long as it does not increase
the number of issues.

Change-Id: Ic606063017695d42cfed63c0c212502cc5580ebf
---
M repo/includes/specials/SpecialSetLabelDescriptionAliases.php
1 file changed, 185 insertions(+), 252 deletions(-)

Approvals:
  Thiemo Mättig (WMDE): Looks good to me, but someone else must approve
  Henning Snater: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/repo/includes/specials/SpecialSetLabelDescriptionAliases.php 
b/repo/includes/specials/SpecialSetLabelDescriptionAliases.php
index 748ac82..8c5a058 100644
--- a/repo/includes/specials/SpecialSetLabelDescriptionAliases.php
+++ b/repo/includes/specials/SpecialSetLabelDescriptionAliases.php
@@ -3,16 +3,10 @@
 namespace Wikibase\Repo\Specials;
 
 use Html;
-use InvalidArgumentException;
 use Language;
-use OutOfBoundsException;
-use PermissionsError;
 use Wikibase\ChangeOp\ChangeOpException;
 use Wikibase\ChangeOp\FingerprintChangeOpFactory;
 use Wikibase\DataModel\Entity\Entity;
-use Wikibase\DataModel\Entity\Item;
-use Wikibase\DataModel\Entity\Property;
-use Wikibase\DataModel\Term\Fingerprint;
 use Wikibase\DataModel\Term\FingerprintProvider;
 use Wikibase\Lib\ContentLanguages;
 use Wikibase\Repo\WikibaseRepo;
@@ -24,26 +18,14 @@
  *
  * @since 0.5
  * @licence GNU GPL v2+
- * @author H. Snater < mediaw...@snater.com >
- * @author Bene* < benestar.wikime...@googlemail.com >
+ * @author Thiemo Mättig
  */
 class SpecialSetLabelDescriptionAliases extends SpecialModifyEntity {
 
        /**
         * @var FingerprintChangeOpFactory
         */
-       protected $fingerprintChangeOpFactory;
-
-       /**
-        * The language label, description and aliases are set in.
-        * @var string
-        */
-       private $languageCode;
-
-       /**
-        * @var Fingerprint
-        */
-       private $labelDescriptionAliases;
+       private $changeOpFactory;
 
        /**
         * @var ContentLanguages
@@ -51,323 +33,274 @@
        private $termsLanguages;
 
        /**
-        * @since 0.5
+        * @var string
         */
+       private $languageCode;
+
+       /**
+        * @var string
+        */
+       private $label = '';
+
+       /**
+        * @var string
+        */
+       private $description = '';
+
+       /**
+        * @var string[]
+        */
+       private $aliases = array();
+
        public function __construct() {
                parent::__construct( 'SetLabelDescriptionAliases', 'edit' );
 
-               $changeOpFactoryProvider = 
WikibaseRepo::getDefaultInstance()->getChangeOpFactoryProvider();
-               $this->fingerprintChangeOpFactory
-                       = 
$changeOpFactoryProvider->getFingerprintChangeOpFactory();
-               $this->termsLanguages = 
WikibaseRepo::getDefaultInstance()->getTermsLanguages();
+               $wikibaseRepo = WikibaseRepo::getDefaultInstance();
+               $this->changeOpFactory = 
$wikibaseRepo->getChangeOpFactoryProvider()
+                       ->getFingerprintChangeOpFactory();
+               $this->termsLanguages = $wikibaseRepo->getTermsLanguages();
        }
 
        /**
         * @see SpecialModifyEntity::validateInput
-        * @since 0.5
         *
         * @return bool
         */
        protected function validateInput() {
-               if (
-                       !parent::validateInput()
-                       || !$this->isValidLanguageCode( $this->languageCode )
-                       || !$this->entityRevision
-               ) {
-                       return false;
-               }
-
-               try {
-                       $this->checkTermChangePermissions( 
$this->entityRevision->getEntity() );
-               } catch ( PermissionsError $e ) {
-                       $this->showErrorHTML( $this->msg( 'permissionserrors' ) 
. ': ' . $e->permission );
-                       return false;
-               }
-
-               $entity = $this->entityRevision->getEntity();
-               return $entity instanceof FingerprintProvider;
+               return parent::validateInput()
+                       && $this->entityRevision->getEntity() instanceof 
FingerprintProvider
+                       && $this->isValidLanguageCode( $this->languageCode )
+                       && $this->isAllowedToChangeTerms( 
$this->entityRevision->getEntity() );
        }
 
        /**
         * @param Entity $entity
         *
-        * @throws PermissionsError
-        * @throws InvalidArgumentException
+        * @return bool
         */
-       private function checkTermChangePermissions( Entity $entity ) {
-               if ( $entity instanceof Item ) {
-                       $type = 'item';
-               } else if ( $entity instanceof Property ) {
-                       $type = 'property';
-               } else {
-                       throw new InvalidArgumentException( 'Unexpected Entity 
type when checking special page term change permissions' );
+       private function isAllowedToChangeTerms( Entity $entity ) {
+               $action = $entity->getType() . '-term';
+
+               if ( !$this->getUser()->isAllowed( $action ) ) {
+                       $this->showErrorHTML( $this->msg( 'permissionserrors' ) 
. ': ' . $action );
+                       return false;
                }
-               $restriction = $type . '-term';
-               if ( !$this->getUser()->isAllowed( $restriction ) ) {
-                       throw new PermissionsError( $restriction );
-               }
+
+               return true;
        }
 
        /**
-        * @see SpecialModifyEntity::getFormElements()
-        * @since 0.5
+        * @see SpecialModifyEntity::getFormElements
         *
         * @param Entity $entity
-        * @return string
+        *
+        * @return string HTML
         */
        protected function getFormElements( Entity $entity = null ) {
-               if ( $this->languageCode === null ) {
-                       $this->languageCode = $this->getLanguage()->getCode();
-               }
-               if ( $this->labelDescriptionAliases === null ) {
-                       $this->labelDescriptionAliases = $entity instanceof 
FingerprintProvider
-                               ? $entity->getFingerprint()
-                               : new Fingerprint();
-               }
+               if ( $entity !== null && $this->languageCode !== null ) {
+                       $languageName = Language::fetchLanguageName(
+                               $this->languageCode, 
$this->getLanguage()->getCode()
+                       );
+                       $intro = $this->msg(
+                               'wikibase-setlabeldescriptionaliases-introfull',
+                               $this->getEntityTitle( $entity->getId() 
)->getPrefixedText(),
+                               $languageName
+                       );
 
-               $labelText = $this->getRequest()->getVal( 'label' );
-               if ( $labelText === null || $labelText === '' ) {
-                       try {
-                               $labelText = $this->labelDescriptionAliases
-                                       ->getLabel( $this->languageCode )
-                                       ->getText();
-                       } catch ( OutOfBoundsException $e ) {
-                               $labelText = '';
-                       }
-               }
-
-               $labelInput = $this->getTextInput( 'label', $labelText );
-
-               $descriptionText = $this->getRequest()->getVal( 'description' );
-               if ( $descriptionText === null || $descriptionText === '' ) {
-                       try {
-                               $descriptionText = 
$this->labelDescriptionAliases
-                                       ->getDescription( $this->languageCode )
-                                       ->getText();
-                       } catch ( OutOfBoundsException $e ) {
-                               $descriptionText = '';
-                       }
-               }
-
-               $descriptionInput = $this->getTextInput( 'description', 
$descriptionText );
-
-               $aliasesText = $this->getRequest()->getVal( 'aliases' );
-               if ( $aliasesText === null || $aliasesText === '' ) {
-                       try {
-                               $aliasGroup = 
$this->labelDescriptionAliases->getAliasGroup( $this->languageCode );
-                               $aliasesText = implode( '|', 
$aliasGroup->getAliases() );
-                       } catch ( OutOfBoundsException $e ) {
-                               $aliasesText = '';
-                       }
-               }
-
-               $aliasesInput = $this->getTextInput( 'aliases', $aliasesText );
-
-               $languageName = Language::fetchLanguageName(
-                       $this->languageCode, $this->getLanguage()->getCode()
-               );
-
-               if ( $entity !== null && $this->languageCode !== null && 
$languageName !== '' ) {
-                       return Html::rawElement(
-                               'p',
-                               array(),
-                               $this->msg(
-                                       
'wikibase-setlabeldescriptionaliases-introfull',
-                                       $this->getEntityTitle( $entity->getId() 
)->getPrefixedText(),
-                                       $languageName
-                               )->parse()
-                       )
-                       . Html::input( 'language', $this->languageCode, 
'hidden' )
-                       . Html::input( 'id', 
$entity->getId()->getSerialization(), 'hidden' )
-                       . $this->getLabel( 'label' ) . $labelInput
-                       . $this->getLabel( 'description' ) . $descriptionInput
-                       . $this->getLabel( 'aliases' ) . $aliasesInput;
-               } else {
-                       return Html::rawElement(
-                               'p',
-                               array(),
-                               $this->msg( 
'wikibase-setlabeldescriptionaliases-intro' )->parse()
-                       )
-                       . parent::getFormElements( $entity )
-                       . Html::element(
-                               'label',
-                               array(
-                                       'for' => 
'wikibase-setlabeldescriptionaliases-language',
-                                       'class' => 'wb-label'
-                               ),
-                               $this->msg( 'wikibase-modifyterm-language' 
)->text()
-                       )
-                       . Html::input(
-                               'language',
-                               $this->languageCode,
-                               'text',
-                               array(
-                                       'class' => 'wb-input',
-                                       'id' => 
'wikibase-setlabeldescriptionaliases-language'
+                       $html = Html::rawElement(
+                                       'p',
+                                       array(),
+                                       $intro->parse()
                                )
-                       )
-                       . $this->getLabel( 'label' ) . $labelInput
-                       . $this->getLabel( 'description' ) . $descriptionInput
-                       . $this->getLabel( 'aliases' ) . $aliasesInput;
+                               . Html::hidden(
+                                       'language',
+                                       $this->languageCode
+                               )
+                               . Html::hidden(
+                                       'id',
+                                       $entity->getId()->getSerialization()
+                               );
+               } else {
+                       $intro = $this->msg( 
'wikibase-setlabeldescriptionaliases-intro' );
+                       $fieldId = 
'wikibase-setlabeldescriptionaliases-language';
+                       $languageCode = $this->languageCode ? : 
$this->getLanguage()->getCode();
+
+                       $html = Html::rawElement(
+                                       'p',
+                                       array(),
+                                       $intro->parse()
+                               )
+                               . parent::getFormElements( $entity )
+                               . Html::label(
+                                       $this->msg( 
'wikibase-modifyterm-language' )->text(),
+                                       $fieldId,
+                                       array(
+                                               'class' => 'wb-label',
+                                       )
+                               )
+                               . Html::input(
+                                       'language',
+                                       $languageCode,
+                                       'text',
+                                       array(
+                                               'class' => 'wb-input',
+                                               'id' => $fieldId,
+                                       )
+                               );
                }
+
+               $html .= $this->getLabeledInputField( 'label', $this->label )
+                       . $this->getLabeledInputField( 'description', 
$this->description )
+                       . $this->getLabeledInputField( 'aliases', implode( '|', 
$this->aliases ) );
+
+               return $html;
        }
 
        /**
-        * Returns HTML text input element for a specific term (label, 
description, aliases).
+        * Returns an HTML label and text input element for a specific term.
         *
-        * @param string $name
+        * @param string $termType Either 'label', 'description' or 'aliases'.
         * @param string $value Text to fill the input element with
-        * @return string
+        *
+        * @return string HTML
         */
-       private function getTextInput( $name, $value ) {
-               return Html::input(
-                       $name,
+       private function getLabeledInputField( $termType, $value ) {
+               $fieldId = 'wikibase-setlabeldescriptionaliases-' . $termType;
+
+               // Messages:
+               // wikibase-setlabeldescriptionaliases-label-label
+               // wikibase-setlabeldescriptionaliases-description-label
+               // wikibase-setlabeldescriptionaliases-aliases-label
+               return Html::label(
+                       $this->msg( $fieldId . '-label' )->text(),
+                       $fieldId,
+                       array(
+                               'class' => 'wb-label',
+                       )
+               )
+               . Html::input(
+                       $termType,
                        $value,
                        'text',
                        array(
                                'class' => 'wb-input',
-                               'id' => 'wikibase-setlabeldescriptionaliases-' 
. $name,
-                               'size' => 50
+                               'id' => $fieldId,
+                               'size' => 50,
                        )
-               )
-               . Html::element( 'br' );
-       }
-
-       /**
-        * Returns a HTML label element for a specific term (label, 
description, aliases).
-        *
-        * @param string $name
-        * @return string
-        */
-       private function getLabel( $name ) {
-               return Html::element( 'br' )
-               . Html::element(
-                       $name,
-                       array(
-                               'for' => 'wikibase-setlabeldescriptionaliases-' 
. $name,
-                               'class' => 'wb-label'
-                       ),
-                       // Messages:
-                       // wikibase-setlabeldescriptionaliases-label-label
-                       // wikibase-setlabeldescriptionaliases-description-label
-                       // wikibase-setlabeldescriptionaliases-aliases-label
-                       $this->msg( 'wikibase-setlabeldescriptionaliases-' . 
$name . '-label' )->text()
                );
        }
 
        /**
-        * @see SpecialModifyEntity::prepareArguments()
-        * @since 0.5
+        * @see SpecialModifyEntity::prepareArguments
         *
         * @param string $subPage
         */
        protected function prepareArguments( $subPage ) {
-               parent::prepareArguments( $subPage );
-
                $request = $this->getRequest();
-               $parts = ( $subPage === '' ) ? array() : explode( '/', 
$subPage, 2 );
+               $parts = $subPage === '' ? array() : explode( '/', $subPage, 2 
);
 
                $this->languageCode = $request->getVal( 'language', isset( 
$parts[1] ) ? $parts[1] : '' );
+               $this->label = $request->getVal( 'label', '' );
+               $this->description = $request->getVal( 'description', '' );
+               $aliasesText = $request->getVal( 'aliases', '' );
+               $this->aliases = $aliasesText === '' ? array() : explode( '|', 
$aliasesText );
+
+               // Parse the 'id' parameter and throw an exception if the 
entity can not be loaded
+               parent::prepareArguments( $subPage );
 
                if ( $this->languageCode === '' ) {
+                       $this->languageCode = $this->getLanguage()->getCode();
+               } elseif ( !$this->isValidLanguageCode( $this->languageCode ) ) 
{
+                       $msg = $this->msg( 
'wikibase-wikibaserepopage-invalid-langcode', $this->languageCode );
+                       $this->showErrorHTML( $msg->parse() );
                        $this->languageCode = null;
                }
 
-               if ( $this->languageCode !== null && 
!$this->isValidLanguageCode( $this->languageCode ) ) {
-                       $errorMessage = $this->msg(
-                               'wikibase-wikibaserepopage-invalid-langcode',
-                               $this->languageCode
-                       )->parse();
+               if ( $this->languageCode !== null
+                       && $this->entityRevision !== null
+                       && $this->entityRevision->getEntity() instanceof 
FingerprintProvider
+               ) {
+                       $fingerprint = 
$this->entityRevision->getEntity()->getFingerprint();
 
-                       $this->showErrorHTML( $errorMessage );
-               }
-
-               $this->labelDescriptionAliases = null;
-               if ( $this->entityRevision !== null ) {
-                       $entity = $this->entityRevision->getEntity();
-                       if ( $entity instanceof FingerprintProvider ) {
-                               $this->labelDescriptionAliases = 
$entity->getFingerprint();
+                       // FIXME: Currently this special page can not be used 
to unset the label.
+                       if ( $this->label === '' && $fingerprint->hasLabel( 
$this->languageCode ) ) {
+                               $this->label = $fingerprint->getLabel( 
$this->languageCode )->getText();
                        }
-               }
 
-               if ( $this->labelDescriptionAliases === null ) {
-                       $this->labelDescriptionAliases = new Fingerprint();
-               }
+                       // FIXME: Currently this special page can not be used 
to unset the description.
+                       if ( $this->description === '' && 
$fingerprint->hasDescription( $this->languageCode ) ) {
+                               $this->description = 
$fingerprint->getDescription( $this->languageCode )->getText();
+                       }
 
-               if ( $this->languageCode !== null && $request->getVal( 'label', 
'' ) !== '' ) {
-                       $this->labelDescriptionAliases->setLabel(
-                               $this->languageCode,
-                               $request->getVal( 'label' )
-                       );
-               }
-
-               if ( $this->languageCode !== null && $request->getVal( 
'description', '' ) !== '' ) {
-                       $this->labelDescriptionAliases->setDescription(
-                               $this->languageCode,
-                               $request->getVal( 'description' )
-                       );
-               }
-
-               if ( $this->languageCode !== null && $request->getVal( 
'aliases', '' ) !== '' ) {
-                       $this->labelDescriptionAliases->setAliasGroup(
-                               $this->languageCode,
-                               explode( '|', $request->getVal( 'aliases' ) )
-                       );
+                       // FIXME: Currently this special page can not be used 
to empty the aliases.
+                       if ( empty( $this->aliases ) && 
$fingerprint->hasAliasGroup( $this->languageCode ) ) {
+                               $this->aliases = $fingerprint->getAliasGroup( 
$this->languageCode )->getAliases();
+                       }
                }
        }
 
        /**
-        * Checks if the language code is valid.
-        *
-        * @param $languageCode string the language code
+        * @param string $languageCode
         *
         * @return bool
         */
        private function isValidLanguageCode( $languageCode ) {
-               return $languageCode !== null
-                       && $this->termsLanguages->hasLanguage( $languageCode );
+               return $languageCode !== null && 
$this->termsLanguages->hasLanguage( $languageCode );
        }
 
        /**
-        * @see SpecialModifyEntity::modifyEntity()
+        * @see SpecialModifyEntity::modifyEntity
         *
         * @param Entity $entity
+        *
         * @return Summary[]|bool
         */
        protected function modifyEntity( Entity $entity ) {
-               if ( $this->labelDescriptionAliases === null ) {
-                       return false;
+               $fingerprint = $entity->getFingerprint();
+               $changeOpFactory = $this->changeOpFactory;
+               $changeOps = array();
+
+               if ( $this->label !== '' ) {
+                       $changeOps[] = $changeOpFactory->newSetLabelOp(
+                               $this->languageCode,
+                               $this->label
+                       );
+               } elseif ( $fingerprint->hasLabel( $this->languageCode ) ) {
+                       $changeOps[] = $changeOpFactory->newRemoveLabelOp(
+                               $this->languageCode
+                       );
                }
 
-               $labelChangeOp = 
$this->fingerprintChangeOpFactory->newSetLabelOp(
-                       $this->languageCode,
-                       $this->labelDescriptionAliases->getLabel( 
$this->languageCode )->getText()
-               );
-               $descriptionChangeOp = 
$this->fingerprintChangeOpFactory->newSetDescriptionOp(
-                       $this->languageCode,
-                       $this->labelDescriptionAliases->getDescription( 
$this->languageCode )->getText()
-               );
-
-               try {
-                       $aliases = $this->labelDescriptionAliases
-                               ->getAliasGroup( $this->languageCode )
-                               ->getAliases();
-               } catch ( OutOfBoundsException $e ) {
-                       $aliases = array();
+               if ( $this->description !== '' ) {
+                       $changeOps[] = $changeOpFactory->newSetDescriptionOp(
+                               $this->languageCode,
+                               $this->description
+                       );
+               } elseif ( $fingerprint->hasDescription( $this->languageCode ) 
) {
+                       $changeOps[] = $changeOpFactory->newRemoveDescriptionOp(
+                               $this->languageCode
+                       );
                }
 
-               $aliasesChangeOp = 
$this->fingerprintChangeOpFactory->newSetAliasesOp(
-                       $this->languageCode,
-                       $aliases
-               );
+               if ( !empty( $this->aliases ) ) {
+                       $changeOps[] = $changeOpFactory->newSetAliasesOp(
+                               $this->languageCode,
+                               $this->aliases
+                       );
+               } elseif ( $fingerprint->hasAliasGroup( $this->languageCode ) ) 
{
+                       $changeOps[] = $changeOpFactory->newRemoveAliasesOp(
+                               $this->languageCode,
+                               $fingerprint->getAliasGroup( 
$this->languageCode )->getAliases()
+                       );
+               }
 
                $success = true;
 
-               foreach ( array( $labelChangeOp, $descriptionChangeOp, 
$aliasesChangeOp ) as $changeOp ) {
+               foreach ( $changeOps as $changeOp ) {
                        try {
                                $this->applyChangeOp( $changeOp, $entity );
-                       } catch ( ChangeOpException $e ) {
-                               $this->showErrorHTML( $e->getMessage() );
+                       } catch ( ChangeOpException $ex ) {
+                               $this->showErrorHTML( $ex->getMessage() );
                                $success = false;
                        }
                }

-- 
To view, visit https://gerrit.wikimedia.org/r/191570
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ic606063017695d42cfed63c0c212502cc5580ebf
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Thiemo Mättig (WMDE) <thiemo.maet...@wikimedia.de>
Gerrit-Reviewer: Adrian Lang <adrian.he...@wikimedia.de>
Gerrit-Reviewer: Daniel Kinzler <daniel.kinz...@wikimedia.de>
Gerrit-Reviewer: Henning Snater <henning.sna...@wikimedia.de>
Gerrit-Reviewer: Hoo man <h...@online.de>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <thiemo.maet...@wikimedia.de>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to