Skip to content

Commit 541012c

Browse files
committed
use TypedDicts to ensure values are correct
1 parent dd7b24c commit 541012c

File tree

5 files changed

+49
-14
lines changed

5 files changed

+49
-14
lines changed

src/sentry/workflow_engine/models/data_condition.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import time
44
from datetime import timedelta
55
from enum import StrEnum
6-
from typing import Any, TypeVar, cast
6+
from typing import Any, TypedDict, TypeVar, cast
77

88
from django.db import models
99
from django.db.models.signals import pre_save
@@ -111,6 +111,13 @@ class Condition(StrEnum):
111111
FAST_CONDITION_TOO_SLOW_THRESHOLD = timedelta(milliseconds=500)
112112

113113

114+
class DataConditionSnapshot(TypedDict):
115+
id: int
116+
type: str
117+
comparison: str
118+
condition_result: DataConditionResult
119+
120+
114121
@region_silo_model
115122
class DataCondition(DefaultFieldsModel):
116123
"""
@@ -137,7 +144,7 @@ class DataCondition(DefaultFieldsModel):
137144
on_delete=models.CASCADE,
138145
)
139146

140-
def get_snapshot(self) -> dict[str, Any]:
147+
def get_snapshot(self) -> DataConditionSnapshot:
141148
return {
142149
"id": self.id,
143150
"type": self.type,

src/sentry/workflow_engine/models/data_condition_group.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
1+
from __future__ import annotations
2+
13
from enum import StrEnum
2-
from typing import Any, ClassVar, Self
4+
from typing import ClassVar, Self, TypedDict
35

46
from django.db import models
57

68
from sentry.backup.scopes import RelocationScope
79
from sentry.db.models import DefaultFieldsModel, region_silo_model, sane_repr
810
from sentry.db.models.manager.base import BaseManager
11+
from sentry.workflow_engine.models.data_condition import DataConditionSnapshot
12+
13+
14+
class DataConditionGroupSnapshot(TypedDict):
15+
id: int
16+
logic_type: DataConditionGroup.Type
17+
conditions: list[DataConditionSnapshot]
918

1019

1120
@region_silo_model
@@ -37,13 +46,13 @@ class Type(StrEnum):
3746
)
3847
organization = models.ForeignKey("sentry.Organization", on_delete=models.CASCADE)
3948

40-
def get_snapshot(self) -> dict[str, Any]:
49+
def get_snapshot(self) -> DataConditionGroupSnapshot:
4150
conditions = []
4251
if hasattr(self, "conditions"):
4352
conditions = [cond.get_snapshot() for cond in self.conditions.all()]
4453

4554
return {
4655
"id": self.id,
47-
"logic_type": self.logic_type,
56+
"logic_type": DataConditionGroup.Type(self.logic_type),
4857
"conditions": conditions,
4958
}

src/sentry/workflow_engine/models/detector.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import builtins
44
import logging
55
from collections.abc import Callable
6-
from typing import TYPE_CHECKING, Any, ClassVar
6+
from typing import TYPE_CHECKING, Any, ClassVar, TypedDict
77

88
from django.conf import settings
99
from django.db import models
@@ -29,10 +29,18 @@
2929

3030
if TYPE_CHECKING:
3131
from sentry.workflow_engine.handlers.detector import DetectorHandler
32+
from sentry.workflow_engine.models.data_condition_group import DataConditionGroupSnapshot
3233

3334
logger = logging.getLogger(__name__)
3435

3536

37+
class DetectorSnapshot(TypedDict):
38+
id: int
39+
enabled: bool
40+
status: int
41+
trigger_condition: DataConditionGroupSnapshot | None
42+
43+
3644
class DetectorManager(BaseManager["Detector"]):
3745
def get_queryset(self) -> BaseQuerySet[Detector]:
3846
return (
@@ -141,16 +149,16 @@ def settings(self) -> DetectorSettings:
141149

142150
return settings
143151

144-
def get_snapshot(self) -> dict[str, Any]:
145-
trigger_conditions = None
152+
def get_snapshot(self) -> DetectorSnapshot:
153+
trigger_condition = None
146154
if self.workflow_condition_group:
147-
trigger_conditions = self.workflow_condition_group.get_snapshot()
155+
trigger_condition = self.workflow_condition_group.get_snapshot()
148156

149157
return {
150158
"id": self.id,
151159
"enabled": self.enabled,
152160
"status": self.status,
153-
"trigger_conditions": trigger_conditions,
161+
"trigger_condition": trigger_condition,
154162
}
155163

156164
def get_audit_log_data(self) -> dict[str, Any]:

src/sentry/workflow_engine/models/workflow.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import logging
44
from dataclasses import replace
5-
from typing import Any, ClassVar
5+
from typing import Any, ClassVar, TypedDict
66

77
from django.conf import settings
88
from django.db import models
@@ -17,7 +17,10 @@
1717
from sentry.db.models.manager.base_query_set import BaseQuerySet
1818
from sentry.models.owner_base import OwnerModel
1919
from sentry.workflow_engine.models.data_condition import DataCondition, is_slow_condition
20-
from sentry.workflow_engine.models.data_condition_group import DataConditionGroup
20+
from sentry.workflow_engine.models.data_condition_group import (
21+
DataConditionGroup,
22+
DataConditionGroupSnapshot,
23+
)
2124
from sentry.workflow_engine.processors.data_condition_group import TriggerResult
2225
from sentry.workflow_engine.types import ConditionError, WorkflowEventData
2326

@@ -26,6 +29,14 @@
2629
logger = logging.getLogger(__name__)
2730

2831

32+
class WorkflowSnapshot(TypedDict):
33+
id: int
34+
enabled: bool
35+
environment_id: int | None
36+
status: int
37+
triggers: DataConditionGroupSnapshot | None
38+
39+
2940
class WorkflowManager(BaseManager["Workflow"]):
3041
def get_queryset(self) -> BaseQuerySet[Workflow]:
3142
return (
@@ -92,7 +103,7 @@ class Meta:
92103
def get_audit_log_data(self) -> dict[str, Any]:
93104
return {"name": self.name}
94105

95-
def get_snapshot(self) -> dict[str, Any]:
106+
def get_snapshot(self) -> WorkflowSnapshot:
96107
when_condition_group = None
97108
if self.when_condition_group:
98109
when_condition_group = self.when_condition_group.get_snapshot()

src/sentry/workflow_engine/processors/workflow.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def enqueue_workflows(
117117
for queue_item in items_by_workflow.values():
118118
if not queue_item.delayed_if_group_ids and not queue_item.passing_if_group_ids:
119119
# Skip because there are no IF groups we could possibly fire actions for if
120-
# the WHEN/IF delayed condtions are met
120+
# the WHEN/IF delayed conditions are met
121121
continue
122122
project_id = queue_item.event.project_id
123123
items_by_project_id[project_id].append(queue_item)

0 commit comments

Comments
 (0)