コード例 #1
0
ファイル: test_utils.py プロジェクト: zhangwei0102/sentry
 def test_transform_to_notification_settings_by_parent_id(self):
     NotificationSetting.objects.update_settings(
         ExternalProviders.SLACK,
         NotificationSettingTypes.WORKFLOW,
         NotificationSettingOptionValues.ALWAYS,
         user=self.user,
         project=self.project,
     )
     notification_settings = NotificationSetting.objects.get_for_user_by_projects(
         NotificationSettingTypes.WORKFLOW,
         self.user,
         [self.project],
     )
     (
         notification_settings_by_project_id_by_provider,
         default_subscribe_by_provider,
     ) = transform_to_notification_settings_by_parent_id(
         notification_settings, NotificationSettingOptionValues.ALWAYS)
     assert notification_settings_by_project_id_by_provider == {
         ExternalProviders.SLACK: {
             self.project.id: NotificationSettingOptionValues.ALWAYS
         }
     }
     assert default_subscribe_by_provider == {
         ExternalProviders.SLACK: NotificationSettingOptionValues.ALWAYS
     }
コード例 #2
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,
        )
コード例 #3
0
    def get_attrs(self, item_list, user, **kwargs):
        def measure_span(op_tag):
            span = sentry_sdk.start_span(
                op=f"serialize.get_attrs.project.{op_tag}")
            span.set_data("Object Count", len(item_list))
            return span

        with measure_span("preamble"):
            project_ids = [i.id for i in item_list]
            if user.is_authenticated() and item_list:
                bookmarks = set(
                    ProjectBookmark.objects.filter(
                        user=user,
                        project_id__in=project_ids).values_list("project_id",
                                                                flat=True))
                (
                    notification_settings_by_project_id,
                    default_subscribe,
                ) = transform_to_notification_settings_by_parent_id(
                    NotificationSetting.objects.get_for_user_by_projects(
                        ExternalProviders.EMAIL,
                        NotificationSettingTypes.ISSUE_ALERTS,
                        user,
                        item_list,
                    ))
            else:
                bookmarks = set()
                notification_settings_by_project_id = {}
                default_subscribe = None

        with measure_span("stats"):
            stats = None
            transaction_stats = None
            project_ids = [o.id for o in item_list]
            if self.transaction_stats and self.stats_period:
                stats = self.get_stats(project_ids, "!event.type:transaction")
                transaction_stats = self.get_stats(project_ids,
                                                   "event.type:transaction")
            elif self.stats_period:
                stats = self.get_stats(project_ids, "!event.type:transaction")

        avatars = {
            a.project_id: a
            for a in ProjectAvatar.objects.filter(project__in=item_list)
        }
        project_ids = [i.id for i in item_list]
        platforms = ProjectPlatform.objects.filter(
            project_id__in=project_ids).values_list("project_id", "platform")
        platforms_by_project = defaultdict(list)
        for project_id, platform in platforms:
            platforms_by_project[project_id].append(platform)

        with measure_span("access"):
            result = self.get_access_by_project(item_list, user)

        with measure_span("features"):
            features_by_project = self._get_features_for_projects(
                item_list, user)
            for project, serialized in result.items():
                serialized["features"] = features_by_project[project]

        with measure_span("other"):
            for project, serialized in result.items():
                is_subscribed = (notification_settings_by_project_id.get(
                    project.id, default_subscribe) ==
                                 NotificationSettingOptionValues.ALWAYS)
                serialized.update({
                    "is_bookmarked":
                    project.id in bookmarks,
                    "is_subscribed":
                    is_subscribed,
                    "avatar":
                    avatars.get(project.id),
                    "platforms":
                    platforms_by_project[project.id],
                })
                if stats:
                    serialized["stats"] = stats[project.id]
                if transaction_stats:
                    serialized["transactionStats"] = transaction_stats[
                        project.id]
        return result