Matthias Mullie has uploaded a new change for review.
https://gerrit.wikimedia.org/r/265460
Change subject: Move remaining usage of EchoGetDefaultNotifiedUsers into
UserLocator
......................................................................
Move remaining usage of EchoGetDefaultNotifiedUsers into UserLocator
Change-Id: Ib321dfbd993d7e5fd22a189d7f46bf3d9fa6b409
---
M Flow.php
M includes/Import/Postprocessor/LqtNotifications.php
M includes/Notifications/Controller.php
M includes/Notifications/Notifications.php
M includes/Notifications/UserLocator.php
5 files changed, 114 insertions(+), 111 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Flow
refs/changes/60/265460/1
diff --git a/Flow.php b/Flow.php
index 8c0308c..63d77ab 100644
--- a/Flow.php
+++ b/Flow.php
@@ -166,7 +166,6 @@
// Echo integration
$wgHooks['BeforeCreateEchoEvent'][] =
'Flow\NotificationController::onBeforeCreateEchoEvent';
-$wgHooks['EchoGetDefaultNotifiedUsers'][] =
'Flow\NotificationController::getDefaultNotifiedUsers';
$wgHooks['EchoGetBundleRules'][] =
'Flow\NotificationController::onEchoGetBundleRules';
// Beta feature Flow on user talk page
diff --git a/includes/Import/Postprocessor/LqtNotifications.php
b/includes/Import/Postprocessor/LqtNotifications.php
index 896d2ae..fabb203 100644
--- a/includes/Import/Postprocessor/LqtNotifications.php
+++ b/includes/Import/Postprocessor/LqtNotifications.php
@@ -49,17 +49,7 @@
* of determining users to notify so they can be replaced with this
class during imports.
*/
protected function overrideUsersToNotify() {
- global $wgHooks, $wgEchoNotifications;
-
- // Remove the hook subscriber that chooses users for some
notifications
- $idx = array_search(
- 'Flow\NotificationController::getDefaultNotifiedUsers',
- $wgHooks['EchoGetDefaultNotifiedUsers']
- );
- if ( $idx !== false ) {
- unset( $wgHooks['EchoGetDefaultNotifiedUsers'][$idx] );
- }
-
+ global $wgEchoNotifications;
// Remove the user-locators that choose on a per-notification
basis who
// should be notified.
diff --git a/includes/Notifications/Controller.php
b/includes/Notifications/Controller.php
index 365f010..8a55dde 100644
--- a/includes/Notifications/Controller.php
+++ b/includes/Notifications/Controller.php
@@ -165,7 +165,7 @@
* @throws FlowException When $params contains unexpected types/values
*/
public function notifyNewTopic( $params ) {
- if ( ! class_exists( 'EchoEvent' ) ) {
+ if ( !class_exists( 'EchoEvent' ) ) {
// Nothing to do here.
return array();
}
@@ -411,104 +411,6 @@
break;
}
return true;
- }
-
- /**
- * Handler for EchoGetDefaultNotifiedUsers hook
- * Returns a list of User objects in the second param
- *
- * @param $event EchoEvent being triggered
- * @param &$users Array of User objects.
- * @return bool
- */
- public static function getDefaultNotifiedUsers( EchoEvent $event,
&$users ) {
- $extra = $event->getExtra();
- switch ( $event->getType() ) {
- case 'flow-mention':
- $mentionedUsers = $extra['mentioned-users'];
-
- // Ignore mention if the user gets another notification
- // already from the same flow event
- $ids = array();
- $topic = $extra['topic-workflow'];
- if ( $topic instanceof UUID ) {
- $ids[$topic->getAlphadecimal()] = $topic;
- }
- if ( isset( $extra['reply-to'] ) ) {
- if ( $extra['reply-to'] instanceof UUID ) {
-
$ids[$extra['reply-to']->getAlphadecimal()] = $extra['reply-to'];
- } else {
- wfDebugLog( 'Flow', __METHOD__ . ':
Expected UUID but received ' . get_class( $extra['reply-to'] ) );
- }
- }
- $notifiedUsers = self::getCreatorsFromPostIDs( $ids );
-
- foreach( $mentionedUsers as $uid ) {
- if ( !isset( $notifiedUsers[$uid] ) ) {
- $users[$uid] = User::newFromId( $uid );
- }
- }
- break;
- case 'flow-topic-renamed':
- $users += self::getCreatorsFromPostIDs( array(
$extra['topic-workflow'] ) );
- break;
- case 'flow-post-edited':
- case 'flow-post-moderated':
- if ( isset( $extra['reply-to'] ) ) {
- $postId = $extra['reply-to'];
- } else {
- $postId = $extra['post-id'];
- }
- if ( !$postId instanceof UUID ) {
- wfDebugLog( 'Flow', __METHOD__ . ': Non-UUID
value provided' );
- break;
- }
-
- $users += self::getCreatorsFromPostIDs( array( $postId
) );
- break;
- default:
- // Do nothing
- }
- return true;
- }
-
- /**
- * Retrieves the post creators from a set of posts.
- * @param array $posts Array of UUIDs or hex representations
- * @return array Associative array, of user ID => User object.
- */
- protected static function getCreatorsFromPostIDs( array $posts ) {
- $users = array();
- /** @var ManagerGroup $storage */
- $storage = Container::get( 'storage' );
-
- $user = new User;
- $actionPermissions = new RevisionActionPermissions(
Container::get( 'flow_actions' ), $user );
-
- foreach ( $posts as $postId ) {
- $post = $storage->find(
- 'PostRevision',
- array(
- 'rev_type_id' => UUID::create( $postId )
- ),
- array(
- 'sort' => 'rev_id',
- 'order' => 'DESC',
- 'limit' => 1
- )
- );
-
- $post = reset( $post );
-
- if ( $post && $actionPermissions->isAllowed( $post,
'view' ) ) {
- $userid = $post->getCreatorId();
- if ( $userid ) {
- $users[$userid] = User::newFromId(
$userid );
- }
- }
- }
-
- return $users;
}
/**
diff --git a/includes/Notifications/Notifications.php
b/includes/Notifications/Notifications.php
index 76466fd..4775d65 100644
--- a/includes/Notifications/Notifications.php
+++ b/includes/Notifications/Notifications.php
@@ -64,6 +64,9 @@
) + $notificationTemplate,
'flow-post-edited' => array(
'presentation-model' => 'Flow\\PostEditedPresentationModel',
+ 'user-locators' => array(
+ 'Flow\\NotificationsUserLocator::locatePostAuthors',
+ ),
'primary-link' => array(
'message' => 'flow-notification-link-text-view-post',
'destination' => 'flow-post'
@@ -86,6 +89,9 @@
) + $notificationTemplate,
'flow-topic-renamed' => array(
'presentation-model' => 'Flow\\TopicRenamedPresentationModel',
+ 'user-locators' => array(
+ 'Flow\\NotificationsUserLocator::locateTopicAuthors',
+ ),
'primary-link' => array(
'message' => 'flow-notification-link-text-view-post',
'destination' => 'flow-post'
@@ -100,6 +106,9 @@
) + $notificationTemplate,
'flow-mention' => array(
'presentation-model' => 'Flow\\MentionPresentationModel',
+ 'user-locators' => array(
+ 'Flow\\NotificationsUserLocator::locateMentionedUsers',
+ ),
'primary-link' => array(
'message' => 'notification-link-text-view-mention',
'destination' => 'flow-post'
diff --git a/includes/Notifications/UserLocator.php
b/includes/Notifications/UserLocator.php
index 67e64a7..61737e3 100644
--- a/includes/Notifications/UserLocator.php
+++ b/includes/Notifications/UserLocator.php
@@ -4,6 +4,7 @@
use EchoEvent;
use EchoUserLocator;
+use Flow\Data\ManagerGroup;
use Flow\Model\UUID;
use Title;
use User;
@@ -47,4 +48,106 @@
return $users;
}
+
+ /**
+ * @param EchoEvent $event
+ * @return User[]
+ */
+ public static function locateTopicAuthors( EchoEvent $event ) {
+ $workflowId = $event->getExtraParam( 'topic-workflow' );
+ if ( !$workflowId instanceof UUID ) {
+ // something wrong; don't notify anyone
+ return array();
+ }
+
+ return self::getCreatorsFromPostIDs( array( $workflowId ) );
+ }
+
+ /**
+ * @param EchoEvent $event
+ * @return User[]
+ */
+ public static function locatePostAuthors( EchoEvent $event ) {
+ $extra = $event->getExtra();
+
+ if ( isset( $extra['reply-to'] ) ) {
+ $postId = $extra['reply-to'];
+ } else {
+ $postId = $extra['post-id'];
+ }
+
+ if ( !$postId instanceof UUID ) {
+ // something wrong; don't notify anyone
+ return array();
+ }
+
+ return self::getCreatorsFromPostIDs( array( $postId ) );
+ }
+
+ /**
+ * @param EchoEvent $event
+ * @return array
+ */
+ public static function locateMentionedUsers( EchoEvent $event ) {
+ $mentionedUserIds = $event->getExtraParam( 'mentioned-users' );
+ if ( !$mentionedUserIds ) {
+ return array();
+ }
+
+ // figure out which users may already receive a notification
for this event because they're author,
+ // or because they're watching this topic
+ $notifiedUsers = array();
+ $locators = array( self::locatePostAuthors( $event ),
self::locateUsersWatchingTopic( $event ) );
+ foreach ( $locators as $locator ) {
+ /** @var User $user */
+ foreach ( $locator as $user ) {
+ $notifiedUsers[$user->getId()] = $user;
+ }
+ }
+
+ // now subtract those that already receive another notification
+ $mentionedUserIds = array_diff( $mentionedUserIds, array_keys(
$notifiedUsers ) );
+
+ return array_map( array( 'User', 'newFromId' ),
$mentionedUserIds );
+ }
+
+ /**
+ * Retrieves the post creators from a set of posts.
+ *
+ * @param array $posts Array of UUIDs or hex representations
+ * @return User[] Associative array, of user ID => User object.
+ */
+ protected static function getCreatorsFromPostIDs( array $posts ) {
+ $users = array();
+ /** @var ManagerGroup $storage */
+ $storage = Container::get( 'storage' );
+
+ $user = new User;
+ $actionPermissions = new RevisionActionPermissions(
Container::get( 'flow_actions' ), $user );
+
+ foreach ( $posts as $postId ) {
+ $post = $storage->find(
+ 'PostRevision',
+ array(
+ 'rev_type_id' => UUID::create( $postId )
+ ),
+ array(
+ 'sort' => 'rev_id',
+ 'order' => 'DESC',
+ 'limit' => 1
+ )
+ );
+
+ $post = reset( $post );
+
+ if ( $post && $actionPermissions->isAllowed( $post,
'view' ) ) {
+ $userid = $post->getCreatorId();
+ if ( $userid ) {
+ $users[$userid] = User::newFromId(
$userid );
+ }
+ }
+ }
+
+ return $users;
+ }
}
--
To view, visit https://gerrit.wikimedia.org/r/265460
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib321dfbd993d7e5fd22a189d7f46bf3d9fa6b409
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Flow
Gerrit-Branch: master
Gerrit-Owner: Matthias Mullie <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits