Exemplo n.º 1
0
    def get_attrs(
        self, item_list: List[ExternalActor], user: User, **kwargs: Any
    ) -> MutableMapping[ExternalActor, MutableMapping[str, Any]]:
        # get all of the actor ids we need to lookup
        external_actors_by_actor_id = {
            external_actor.actor_id: external_actor
            for external_actor in item_list
        }

        # iterating over each actor id and split it up by type.
        actor_ids_by_type = defaultdict(list)
        for actor_id, external_actor in external_actors_by_actor_id.items():
            if actor_id is not None:
                type_str = actor_type_to_string(external_actor.actor.type)
                actor_ids_by_type[type_str].append(actor_id)

        # each actor id maps to an object
        resolved_actors: MutableMapping[int, Any] = {}
        for type_str, type_id in ACTOR_TYPES.items():
            klass = actor_type_to_class(type_id)
            actor_ids = actor_ids_by_type[type_str]

            for model in klass.objects.filter(actor_id__in=actor_ids):
                resolved_actors[model.actor_id] = {type_str: model}

        # create a mapping of external actor to a set of attributes. Those attributes are either {"user": User} or {"team": Team}.
        return {
            external_actor: resolved_actors[external_actor.actor_id]
            for external_actor in item_list
        }
Exemplo n.º 2
0
    def get_attrs(self, item_list, user, **kwargs):
        alert_rules = {item.id: item for item in item_list}
        attach_foreignkey(item_list,
                          AlertRule.snuba_query,
                          related=("environment", ))

        result = defaultdict(dict)
        triggers = AlertRuleTrigger.objects.filter(
            alert_rule__in=item_list).order_by("label")
        serialized_triggers = serialize(list(triggers))
        for trigger, serialized in zip(triggers, serialized_triggers):
            alert_rule_triggers = result[alert_rules[
                trigger.alert_rule_id]].setdefault("triggers", [])
            alert_rule_triggers.append(serialized)

        alert_rule_projects = AlertRule.objects.filter(
            id__in=[item.id for item in item_list]).values_list(
                "id", "snuba_query__subscriptions__project__slug")
        for alert_rule_id, project_slug in alert_rule_projects:
            rule_result = result[alert_rules[alert_rule_id]].setdefault(
                "projects", [])
            rule_result.append(project_slug)

        for rule_activity in AlertRuleActivity.objects.filter(
                alert_rule__in=item_list,
                type=AlertRuleActivityType.CREATED.value).select_related(
                    "alert_rule", "user"):
            if rule_activity.user:
                user = {
                    "id": rule_activity.user.id,
                    "name": rule_activity.user.get_display_name(),
                    "email": rule_activity.user.email,
                }
            else:
                user = None

            result[alert_rules[rule_activity.alert_rule.id]].update(
                {"created_by": user})

        resolved_actors = {}
        owners_by_type = defaultdict(list)
        for item in item_list:
            if item.owner_id is not None:
                owners_by_type[actor_type_to_string(item.owner.type)].append(
                    item.owner_id)

        for k, v in ACTOR_TYPES.items():
            resolved_actors[k] = {
                a.actor_id: a.id
                for a in actor_type_to_class(v).objects.filter(
                    actor_id__in=owners_by_type[k])
            }

        for alert_rule in alert_rules.values():
            if alert_rule.owner_id:
                type = actor_type_to_string(alert_rule.owner.type)
                result[alert_rule][
                    "owner"] = f"{type}:{resolved_actors[type][alert_rule.owner_id]}"

        return result
Exemplo n.º 3
0
    def get_attrs(
        self, item_list: List[ExternalActor], user: User, **kwargs: Any
    ) -> MutableMapping[Any, Any]:
        external_actors_by_actor_id = {
            external_actor.actor_id: external_actor for external_actor in item_list
        }

        actor_ids_by_type = defaultdict(list)
        for actor_id, external_actor in external_actors_by_actor_id.items():
            if actor_id is not None:
                type_str = actor_type_to_string(external_actor.actor.type)
                actor_ids_by_type[type_str].append(actor_id)

        resolved_actors_by_type: MutableMapping[str, Mapping[int, int]] = defaultdict(dict)
        for type_str, type_id in ACTOR_TYPES.items():
            klass = actor_type_to_class(type_id)
            actor_ids = actor_ids_by_type[type_str]

            resolved_actors = klass.objects.filter(actor_id__in=actor_ids)

            resolved_actors_by_type[type_str] = {model.actor_id: model for model in resolved_actors}

        results: MutableMapping[ExternalActor, MutableMapping[str, Any]] = defaultdict(dict)
        for type_str, mapping in resolved_actors_by_type.items():
            for actor_id, model in mapping.items():
                external_actor = external_actors_by_actor_id[actor_id]
                results[external_actor][type_str] = model

        return results
Exemplo n.º 4
0
    def get_attrs(self, item_list, user, **kwargs):
        environments = Environment.objects.in_bulk(
            [_f for _f in [i.environment_id for i in item_list] if _f])

        result = {
            i: {
                "environment": environments.get(i.environment_id)
            }
            for i in item_list
        }
        for rule_activity in RuleActivity.objects.filter(
                rule__in=item_list,
                type=RuleActivityType.CREATED.value).select_related(
                    "rule", "user"):
            if rule_activity.user:
                user = {
                    "id": rule_activity.user.id,
                    "name": rule_activity.user.get_display_name(),
                    "email": rule_activity.user.email,
                }
            else:
                user = None

            result[rule_activity.rule].update({"created_by": user})

        rules = {item.id: item for item in item_list}
        resolved_actors = {}
        owners_by_type = defaultdict(list)
        for item in item_list:
            if item.owner_id is not None:
                owners_by_type[actor_type_to_string(item.owner.type)].append(
                    item.owner_id)

        for k, v in ACTOR_TYPES.items():
            resolved_actors[k] = {
                a.actor_id: a.id
                for a in actor_type_to_class(v).objects.filter(
                    actor_id__in=owners_by_type[k])
            }
        for rule in rules.values():
            if rule.owner_id:
                type = actor_type_to_string(rule.owner.type)
                if rule.owner_id in resolved_actors[type]:
                    result[rule][
                        "owner"] = f"{type}:{resolved_actors[type][rule.owner_id]}"

        return result
Exemplo n.º 5
0
    def get_attrs(self, item_list, user, **kwargs):
        alert_rules = {item.id: item for item in item_list}
        prefetch_related_objects(item_list, "snuba_query__environment")

        result = defaultdict(dict)
        triggers = AlertRuleTrigger.objects.filter(
            alert_rule__in=item_list).order_by("label")
        serialized_triggers = serialize(list(triggers), **kwargs)

        trigger_actions = AlertRuleTriggerAction.objects.filter(
            alert_rule_trigger__alert_rule_id__in=alert_rules.keys()).exclude(
                sentry_app_config__isnull=True, sentry_app_id__isnull=True)

        sentry_app_installations_by_sentry_app_id = (
            SentryAppInstallation.objects.get_related_sentry_app_components(
                organization_ids={
                    alert_rule.organization_id
                    for alert_rule in alert_rules.values()
                },
                sentry_app_ids=trigger_actions.values_list("sentry_app_id",
                                                           flat=True),
                type="alert-rule-action",
            ))

        for trigger, serialized in zip(triggers, serialized_triggers):
            alert_rule_triggers = result[alert_rules[
                trigger.alert_rule_id]].setdefault("triggers", [])
            for action in serialized.get("actions", []):
                install = sentry_app_installations_by_sentry_app_id.get(
                    action.get("sentryAppId"))
                if install:
                    action["_sentry_app_component"] = install.get(
                        "sentry_app_component")
                    action["_sentry_app_installation"] = install.get(
                        "sentry_app_installation")
                    action["sentryAppInstallationUuid"] = install.get(
                        "sentry_app_installation").get("uuid")
            alert_rule_triggers.append(serialized)

        alert_rule_projects = AlertRule.objects.filter(
            id__in=[item.id for item in item_list]).values_list(
                "id", "snuba_query__subscriptions__project__slug")
        for alert_rule_id, project_slug in alert_rule_projects:
            rule_result = result[alert_rules[alert_rule_id]].setdefault(
                "projects", [])
            rule_result.append(project_slug)

        for rule_activity in AlertRuleActivity.objects.filter(
                alert_rule__in=item_list,
                type=AlertRuleActivityType.CREATED.value).select_related(
                    "alert_rule", "user"):
            if rule_activity.user:
                user = {
                    "id": rule_activity.user.id,
                    "name": rule_activity.user.get_display_name(),
                    "email": rule_activity.user.email,
                }
            else:
                user = None

            result[alert_rules[rule_activity.alert_rule.id]].update(
                {"created_by": user})

        resolved_actors = {}
        owners_by_type = defaultdict(list)
        for item in item_list:
            if item.owner_id is not None:
                owners_by_type[actor_type_to_string(item.owner.type)].append(
                    item.owner_id)

        for k, v in ACTOR_TYPES.items():
            resolved_actors[k] = {
                a.actor_id: a.id
                for a in actor_type_to_class(v).objects.filter(
                    actor_id__in=owners_by_type[k])
            }

        for alert_rule in alert_rules.values():
            if alert_rule.owner_id:
                type = actor_type_to_string(alert_rule.owner.type)
                if alert_rule.owner_id in resolved_actors[type]:
                    result[alert_rule][
                        "owner"] = f"{type}:{resolved_actors[type][alert_rule.owner_id]}"

        if "original_alert_rule" in self.expand:
            snapshot_activities = AlertRuleActivity.objects.filter(
                alert_rule__in=item_list,
                type=AlertRuleActivityType.SNAPSHOT.value,
            )
            for activity in snapshot_activities:
                result[alert_rules[activity.alert_rule_id]][
                    "originalAlertRuleId"] = activity.previous_alert_rule_id

        return result
Exemplo n.º 6
0
    def get_attrs(self, item_list, user, **kwargs):
        environments = Environment.objects.in_bulk(
            [_f for _f in [i.environment_id for i in item_list] if _f])

        result = {
            i: {
                "environment": environments.get(i.environment_id)
            }
            for i in item_list
        }
        for rule_activity in RuleActivity.objects.filter(
                rule__in=item_list,
                type=RuleActivityType.CREATED.value).select_related(
                    "rule", "user"):
            if rule_activity.user:
                user = {
                    "id": rule_activity.user.id,
                    "name": rule_activity.user.get_display_name(),
                    "email": rule_activity.user.email,
                }
            else:
                user = None

            result[rule_activity.rule].update({"created_by": user})

        rules = {item.id: item for item in item_list}
        resolved_actors = {}
        owners_by_type = defaultdict(list)

        sentry_app_uuids = {
            action.get("sentryAppInstallationUuid")
            for rule in rules.values()
            for action in rule.data.get("actions", [])
        }

        sentry_app_ids = (SentryAppInstallation.objects.filter(
            uuid__in=sentry_app_uuids).distinct("sentry_app_id").values_list(
                "sentry_app_id", flat=True))

        sentry_app_installations_by_uuid = (
            SentryAppInstallation.objects.get_related_sentry_app_components(
                organization_ids={
                    rule.project.organization_id
                    for rule in rules.values()
                },
                sentry_app_ids=sentry_app_ids,
                type="alert-rule-action",
                group_by="uuid",
            ))

        for item in item_list:
            if item.owner_id is not None:
                owners_by_type[actor_type_to_string(item.owner.type)].append(
                    item.owner_id)

        for k, v in ACTOR_TYPES.items():
            resolved_actors[k] = {
                a.actor_id: a.id
                for a in actor_type_to_class(v).objects.filter(
                    actor_id__in=owners_by_type[k])
            }
        for rule in rules.values():
            if rule.owner_id:
                type = actor_type_to_string(rule.owner.type)
                if rule.owner_id in resolved_actors[type]:
                    result[rule][
                        "owner"] = f"{type}:{resolved_actors[type][rule.owner_id]}"

            for action in rule.data.get("actions", []):
                install = sentry_app_installations_by_uuid.get(
                    action.get("sentryAppInstallationUuid"))
                if install:
                    action["_sentry_app_component"] = install.get(
                        "sentry_app_component")
                    action["_sentry_app_installation"] = install.get(
                        "sentry_app_installation")

        if "lastTriggered" in self.expand:
            last_triggered_lookup = {
                rfh["rule_id"]: rfh["date_added"]
                for rfh in RuleFireHistory.objects.filter(
                    rule__in=item_list).values("rule_id").annotate(
                        date_added=Max("date_added"))
            }
            for rule in item_list:
                result[rule]["last_triggered"] = last_triggered_lookup.get(
                    rule.id, None)

        return result