Ejemplo n.º 1
0
    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,
        )
Ejemplo n.º 2
0
 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}
Ejemplo n.º 3
0
 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())
Ejemplo n.º 4
0
    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())
Ejemplo n.º 5
0
    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,
        )
Ejemplo n.º 6
0
    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}