def _get_subscriptions( groups: Iterable[Group], user: User ) -> Mapping[int, Tuple[bool, bool, Optional[GroupSubscription]]]: """ Returns a mapping of group IDs to a two-tuple of (is_disabled: bool, subscribed: bool, subscription: Optional[GroupSubscription]) for the provided user and groups. """ if not groups: return {} groups_by_project = collect_groups_by_project(groups) notification_settings_by_scope = transform_to_notification_settings_by_scope( NotificationSetting.objects.get_for_user_by_projects( NotificationSettingTypes.WORKFLOW, user, groups_by_project.keys(), ) ) query_groups = get_groups_for_query(groups_by_project, notification_settings_by_scope, user) subscriptions = GroupSubscription.objects.filter(group__in=query_groups, user=user) subscriptions_by_group_id = { subscription.group_id: subscription for subscription in subscriptions } return get_user_subscriptions_for_groups( groups_by_project, notification_settings_by_scope, subscriptions_by_group_id, user, )
def test_get_groups_for_query(self): groups_by_project = {self.project: {self.group}} notification_settings_by_key = {5: NotificationSettingOptionValues.ALWAYS} global_default_workflow_option = NotificationSettingOptionValues.ALWAYS query_groups = get_groups_for_query( groups_by_project, notification_settings_by_key, global_default_workflow_option, ) assert query_groups == {self.group}
def test_get_groups_for_query_never(self): assert (get_groups_for_query( {self.project: {self.group}}, { NotificationScopeType.PROJECT: { self.project.id: { ExternalProviders.SLACK: NotificationSettingOptionValues.NEVER, ExternalProviders.EMAIL: NotificationSettingOptionValues.NEVER, }, }, }, user=self.user, ) == set())
def test_get_groups_for_query_empty(self): groups_by_project = {self.project: {self.group}} notification_settings_by_scope = { NotificationScopeType.PROJECT: { self.project.id: { ExternalProviders.SLACK: NotificationSettingOptionValues.NEVER, ExternalProviders.EMAIL: NotificationSettingOptionValues.ALWAYS, }, }, } assert (get_groups_for_query(groups_by_project={}, notification_settings_by_scope={}, user=self.user) == set()) assert get_groups_for_query(groups_by_project, notification_settings_by_scope={}, user=self.user) == {self.group} assert (get_groups_for_query( groups_by_project={}, notification_settings_by_scope=notification_settings_by_scope, user=self.user, ) == set())
def _get_subscriptions( groups: Iterable[Group], user: User ) -> Mapping[int, Tuple[bool, bool, Optional[GroupSubscription]]]: """ Returns a mapping of group IDs to a two-tuple of (is_disabled: bool, subscribed: bool, subscription: Optional[GroupSubscription]) for the provided user and groups. """ if not groups: return {} groups_by_project = collect_groups_by_project(groups) notification_settings = NotificationSetting.objects.get_for_user_by_projects( NotificationSettingTypes.WORKFLOW, user, groups_by_project.keys(), ) ( notification_settings_by_project_id_by_provider, default_subscribe_by_provider, ) = transform_to_notification_settings_by_parent_id( notification_settings, NotificationSettingOptionValues.SUBSCRIBE_ONLY) notification_settings_by_key = notification_settings_by_project_id_by_provider[ ExternalProviders.EMAIL] global_default_workflow_option = default_subscribe_by_provider[ ExternalProviders.EMAIL] query_groups = get_groups_for_query( groups_by_project, notification_settings_by_key, global_default_workflow_option, ) subscriptions = GroupSubscription.objects.filter( group__in=query_groups, user=user) subscriptions_by_group_id = { subscription.group_id: subscription for subscription in subscriptions } return get_user_subscriptions_for_groups( groups_by_project, notification_settings_by_key, subscriptions_by_group_id, global_default_workflow_option, )
def test_get_groups_for_query(self): organization = Organization(id=1, slug="organization", name="My Company") project_0 = Project(id=100, organization=organization) project_1 = Project(id=101, organization=organization) project_2 = Project(id=102, organization=organization) groups_by_project = { project_0: {Group(id=10, project=project_0), Group(id=11, project=project_0)}, project_1: {Group(id=12, project=project_0)}, project_2: {Group(id=13, project=project_0)}, } notification_settings_by_scope = { NotificationScopeType.PROJECT: { project_0.id: { ExternalProviders.SLACK: NotificationSettingOptionValues.NEVER, ExternalProviders.EMAIL: NotificationSettingOptionValues.ALWAYS, }, project_1.id: { ExternalProviders.SLACK: NotificationSettingOptionValues.NEVER, ExternalProviders.EMAIL: NotificationSettingOptionValues.NEVER, }, } } query_groups = get_groups_for_query(groups_by_project, notification_settings_by_scope, user=self.user) assert {group.id for group in query_groups} == {10, 11, 13}