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 }
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 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