diff --git a/notifications_routing/router.py b/notifications_routing/router.py index a69904ed857777a76394e06edae8105e2fd2792a..d5523d6ceff56c06b4a07de7761a4ff5506b0f48 100644 --- a/notifications_routing/router.py +++ b/notifications_routing/router.py @@ -69,6 +69,7 @@ class Router(megabus.Listener): str(OutputMessageKeys.IMGURL): message_json[str(InputMessageKeys.IMGURL)], str(OutputMessageKeys.CHANNEL_CATEGORY): category_name, str(OutputMessageKeys.PRIVATE): message_json[str(InputMessageKeys.PRIVATE)], + str(OutputMessageKeys.INTERSECTION): message_json[str(InputMessageKeys.INTERSECTION)], str(OutputMessageKeys.TARGETUSERS): message_json[str(InputMessageKeys.TARGETUSERS)], str(OutputMessageKeys.TARGETGROUPS): message_json[str(InputMessageKeys.TARGETGROUPS)], } @@ -118,7 +119,7 @@ class Router(megabus.Listener): return channel_users - def get_target_users(self, channel_id, specified_target_users, specified_target_groups): # noqa: C901 + def get_target_users(self, channel_id, specified_target_users, specified_target_groups): """Join users from our data source and the grappa system to return a unique users list.""" target_users = [] if specified_target_users: @@ -132,9 +133,9 @@ class Router(megabus.Listener): return target_users - def process_message(self, message): - """Process a message according to user and default preferences and sends to available delivery channels.""" - if message.get(OutputMessageKeys.PRIVATE) is True: + def process_target_users(self, message): + """Process unique users list, if targeted, intersection or standard post.""" + if OutputMessageKeys.PRIVATE in message and message[OutputMessageKeys.PRIVATE]: logging.debug("Processing direct notification %s", message[OutputMessageKeys.ID]) target_users = self.get_target_users( message[OutputMessageKeys.CHANNEL_ID], @@ -144,6 +145,17 @@ class Router(megabus.Listener): if not target_users: logging.debug("no target_users found for notification %s", message[OutputMessageKeys.ID]) return + if OutputMessageKeys.INTERSECTION in message and message[OutputMessageKeys.INTERSECTION]: + logging.debug("Processing intersection target users for %s", message[OutputMessageKeys.ID]) + tmp_channel_users = self.get_channel_users(message[OutputMessageKeys.CHANNEL_ID]) + if not tmp_channel_users: + logging.debug( + "no tmp_channel_users to intersect for channel %s", message[OutputMessageKeys.CHANNEL_ID] + ) + return + target_users = set(tmp_channel_users).intersection(target_users) + + return target_users else: logging.debug("Processing general notification %s", message[OutputMessageKeys.ID]) target_users = self.get_channel_users(message[OutputMessageKeys.CHANNEL_ID]) @@ -151,6 +163,14 @@ class Router(megabus.Listener): logging.debug("no channel_users for channel %s", message[OutputMessageKeys.CHANNEL_ID]) return + return target_users + + def process_message(self, message): + """Process a message according to user and default preferences and sends to available delivery channels.""" + target_users = self.process_target_users(message) + if not target_users: + return + for user in target_users: # Never logged in users, apply default preferences has_logged_in = self.data_source.LAST_LOGIN in user and user.get(self.data_source.LAST_LOGIN) diff --git a/notifications_routing/utils.py b/notifications_routing/utils.py index 2191740c53c8ce804df7a33a01fe4771b33f2145..ff87e317e55df1a7039cce68ab4a9f11d17a85e6 100644 --- a/notifications_routing/utils.py +++ b/notifications_routing/utils.py @@ -29,6 +29,7 @@ class InputMessageKeys(StrEnum): LINK = "link" IMGURL = "imgUrl" PRIVATE = "private" + INTERSECTION = "intersection" TARGETUSERS = "targetUsers" TARGETGROUPS = "targetGroups" @@ -48,6 +49,7 @@ class OutputMessageKeys(StrEnum): IMGURL = "img_url" ID = "id" PRIVATE = "private" + INTERSECTION = "intersection" TARGETUSERS = "target_users" TARGETGROUPS = "target_groups"