mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Echo
synced 2024-09-25 03:09:37 +00:00
Merge "Use User Ids instead of User Names for Echo Mute"
This commit is contained in:
commit
d22e10efc7
31
Hooks.php
31
Hooks.php
|
@ -490,10 +490,15 @@ class EchoHooks {
|
|||
}
|
||||
|
||||
if ( $wgEchoPerUserBlacklist ) {
|
||||
$lookup = CentralIdLookup::factory();
|
||||
$ids = $user->getOption( 'echo-notifications-blacklist', [] );
|
||||
$names = $ids ? $lookup->namesFromCentralIds( $ids, $user ) : [];
|
||||
|
||||
$preferences['echo-notifications-blacklist'] = [
|
||||
'type' => 'usersmultiselect',
|
||||
'label-message' => 'echo-pref-notifications-blacklist',
|
||||
'section' => 'echo/blocknotificationslist',
|
||||
'default' => implode( "\n", $names )
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -1252,6 +1257,10 @@ class EchoHooks {
|
|||
$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;
|
||||
}
|
||||
|
||||
|
@ -1270,6 +1279,28 @@ class EchoHooks {
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1019,6 +1019,7 @@
|
|||
"SpecialNotificationsMarkRead": "includes/special/SpecialNotificationsMarkRead.php",
|
||||
"SuppressionMaintenanceTest": "tests/phpunit/maintenance/SupressionMaintenanceTest.php",
|
||||
"TestDiscussionParser": "maintenance/testDiscussionParser.php",
|
||||
"UpdateEchoSchemaForSuppression": "maintenance/updateEchoSchemaForSuppression.php"
|
||||
"UpdateEchoSchemaForSuppression": "maintenance/updateEchoSchemaForSuppression.php",
|
||||
"EchoUpdatePerUserBlacklist": "maintenance/updatePerUserBlacklist.php"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,12 +71,12 @@ class EchoContainmentSet {
|
|||
* @param string $preferenceName
|
||||
*/
|
||||
public function addFromUserOption( $preferenceName ) {
|
||||
$preference = $this->recipient->getOption( $preferenceName );
|
||||
$preference = $this->recipient->getOption( $preferenceName, [] );
|
||||
|
||||
if ( $preference ) {
|
||||
$items = explode( "\n", $preference );
|
||||
|
||||
$this->addArray( $items );
|
||||
$lookup = CentralIdLookup::factory();
|
||||
$names = $lookup->lookupCentralIds( array_flip( $preference ), $this->recipient );
|
||||
$this->addArray( array_values( $names ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
94
maintenance/updatePerUserBlacklist.php
Normal file
94
maintenance/updatePerUserBlacklist.php
Normal 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;
|
Loading…
Reference in a new issue