Merge "Use User Ids instead of User Names for Echo Mute"

This commit is contained in:
jenkins-bot 2017-10-03 21:59:04 +00:00 committed by Gerrit Code Review
commit d22e10efc7
4 changed files with 131 additions and 5 deletions

View file

@ -490,10 +490,15 @@ class EchoHooks {
} }
if ( $wgEchoPerUserBlacklist ) { if ( $wgEchoPerUserBlacklist ) {
$lookup = CentralIdLookup::factory();
$ids = $user->getOption( 'echo-notifications-blacklist', [] );
$names = $ids ? $lookup->namesFromCentralIds( $ids, $user ) : [];
$preferences['echo-notifications-blacklist'] = [ $preferences['echo-notifications-blacklist'] = [
'type' => 'usersmultiselect', 'type' => 'usersmultiselect',
'label-message' => 'echo-pref-notifications-blacklist', 'label-message' => 'echo-pref-notifications-blacklist',
'section' => 'echo/blocknotificationslist', 'section' => 'echo/blocknotificationslist',
'default' => implode( "\n", $names )
]; ];
} }
@ -1252,6 +1257,10 @@ class EchoHooks {
$options['echo-subscriptions-email-edit-user-talk'] = $options['enotifusertalkpages']; $options['echo-subscriptions-email-edit-user-talk'] = $options['enotifusertalkpages'];
} }
if ( isset( $options['echo-notifications-blacklist'] ) ) {
$options['echo-notifications-blacklist'] = array_map( 'intval', explode( "\n", $options['echo-notifications-blacklist'] ) );
}
return true; return true;
} }
@ -1270,6 +1279,28 @@ class EchoHooks {
unset( $options['echo-subscriptions-email-edit-user-talk'] ); unset( $options['echo-subscriptions-email-edit-user-talk'] );
} }
// Convert usernames to ids.
if ( isset( $options['echo-notifications-blacklist'] ) ) {
if ( $options['echo-notifications-blacklist'] ) {
$value = $options['echo-notifications-blacklist'];
// Notification Blacklist may be an array of ids or a string of new line
// delimnated user names.
if ( is_array( $value ) ) {
$ids = array_filter( $value, 'is_numeric' );
} else {
$lookup = CentralIdLookup::factory();
$names = explode( "\n", $value );
$ids = $lookup->centralIdsFromNames( $names, $user );
}
$user->setOption( 'echo-notifications-blacklist', $ids );
$options['echo-notifications-blacklist'] = implode( "\n", $user->getOption( 'echo-notifications-blacklist' ) );
} else {
// If the blacklist is empty, set it to null rather than an empty string.
$options['echo-notifications-blacklist'] = null;
}
}
return true; return true;
} }

View file

@ -1019,6 +1019,7 @@
"SpecialNotificationsMarkRead": "includes/special/SpecialNotificationsMarkRead.php", "SpecialNotificationsMarkRead": "includes/special/SpecialNotificationsMarkRead.php",
"SuppressionMaintenanceTest": "tests/phpunit/maintenance/SupressionMaintenanceTest.php", "SuppressionMaintenanceTest": "tests/phpunit/maintenance/SupressionMaintenanceTest.php",
"TestDiscussionParser": "maintenance/testDiscussionParser.php", "TestDiscussionParser": "maintenance/testDiscussionParser.php",
"UpdateEchoSchemaForSuppression": "maintenance/updateEchoSchemaForSuppression.php" "UpdateEchoSchemaForSuppression": "maintenance/updateEchoSchemaForSuppression.php",
"EchoUpdatePerUserBlacklist": "maintenance/updatePerUserBlacklist.php"
} }
} }

View file

@ -71,12 +71,12 @@ class EchoContainmentSet {
* @param string $preferenceName * @param string $preferenceName
*/ */
public function addFromUserOption( $preferenceName ) { public function addFromUserOption( $preferenceName ) {
$preference = $this->recipient->getOption( $preferenceName ); $preference = $this->recipient->getOption( $preferenceName, [] );
if ( $preference ) { if ( $preference ) {
$items = explode( "\n", $preference ); $lookup = CentralIdLookup::factory();
$names = $lookup->lookupCentralIds( array_flip( $preference ), $this->recipient );
$this->addArray( $items ); $this->addArray( array_values( $names ) );
} }
} }

View file

@ -0,0 +1,94 @@
<?php
/**
* Update the Per User Blocklist from Usernames to User Ids.
*
* @ingroup Maintenance
*/
require_once getenv( 'MW_INSTALL_PATH' ) !== false
? getenv( 'MW_INSTALL_PATH' ) . '/maintenance/Maintenance.php'
: __DIR__ . '/../../../maintenance/Maintenance.php';
/**
* Maintenance script that changes the usernames to ids.
*
* @ingroup Maintenance
*/
class EchoUpdatePerUserBlacklist extends LoggedUpdateMaintenance {
public function __construct() {
parent::__construct();
$this->addDescription( 'Update echo-notifications-blacklist User Preference from Usernames to Ids' );
$this->setBatchSize( 100 );
$this->requireExtension( 'Echo' );
}
public function getUpdateKey() {
return __CLASS__;
}
public function doDBUpdates() {
$dbFactory = MWEchoDbFactory::newFromDefault();
$dbw = $dbFactory->getEchoDb( DB_MASTER );
$dbr = $dbFactory->getEchoDb( DB_REPLICA );
$iterator = new BatchRowIterator(
$dbr,
'user_properties',
[ 'up_user', 'up_property' ],
$this->mBatchSize
);
$iterator->setFetchColumns( [
'up_user',
'up_value'
] );
$iterator->addConditions( [
'up_property' => 'echo-notifications-blacklist'
] );
$this->output( "Updating Echo Notification Blacklist...\n" );
$lookup = CentralIdLookup::factory();
$processed = 0;
foreach ( $iterator as $batch ) {
foreach ( $batch as $row ) {
if ( !$row->up_value ) {
continue;
}
$value = explode( "\n", $row->up_value );
$names = array_filter( $value, function ( $item ) {
return !is_numeric( $item );
} );
// If all of the values are numeric then the user has already been
// converted.
if ( !$names ) {
continue;
}
$user = User::newFromId( $row->up_user );
$ids = $lookup->lookupUserNames( array_flip( $names ), $user );
$dbw->update(
'user_properties',
[
'up_value' => implode( "\n", array_values( $ids ) ),
],
[
'up_user' => $row->up_user,
'up_property' => 'echo-notifications-blacklist',
]
);
$processed += $dbw->affectedRows();
$dbFactory->waitForSlaves();
}
$this->output( "Updated $processed Users\n" );
}
return true;
}
}
$maintClass = 'EchoUpdatePerUserBlacklist';
require_once RUN_MAINTENANCE_IF_MAIN;