1
+ from __future__ import annotations
2
+
1
3
from collections .abc import Mapping
2
- from typing import TypedDict
4
+ from typing import Any , TypedDict
3
5
4
6
from django .db .models import Max , Q , prefetch_related_objects
5
7
from rest_framework import serializers
@@ -30,7 +32,7 @@ def _is_filter(data):
30
32
from sentry .rules import rules
31
33
32
34
rule_cls = rules .get (data ["id" ])
33
- return rule_cls .rule_type == "filter/event"
35
+ return rule_cls is not None and rule_cls .rule_type == "filter/event"
34
36
35
37
36
38
class RuleCreatedBy (TypedDict ):
@@ -39,21 +41,28 @@ class RuleCreatedBy(TypedDict):
39
41
email : str
40
42
41
43
44
+ class _ErrorDict (TypedDict ):
45
+ detail : str
46
+
47
+
42
48
class RuleSerializerResponseOptional (TypedDict , total = False ):
43
49
owner : str | None
44
50
createdBy : RuleCreatedBy | None
45
51
environment : str | None
46
52
lastTriggered : str | None
47
53
snoozeCreatedBy : str | None
48
54
snoozeForEveryone : bool | None
55
+ disableReason : str
56
+ disableDate : str
57
+ errors : list [_ErrorDict ]
49
58
50
59
51
60
class RuleSerializerResponse (RuleSerializerResponseOptional ):
52
61
"""
53
62
This represents a Sentry Rule.
54
63
"""
55
64
56
- id : str
65
+ id : str | None
57
66
conditions : list [dict ]
58
67
filters : list [dict ]
59
68
actions : list [dict ]
@@ -89,6 +98,7 @@ def get_attrs(self, item_list, user, **kwargs):
89
98
[_f for _f in [i .environment_id for i in item_list ] if _f ]
90
99
)
91
100
101
+ result : dict [Rule , dict [str , Any ]]
92
102
result = {i : {"environment" : environments .get (i .environment_id )} for i in item_list }
93
103
ras = list (
94
104
RuleActivity .objects .filter (
@@ -104,15 +114,18 @@ def get_attrs(self, item_list, user, **kwargs):
104
114
}
105
115
106
116
for rule_activity in ras :
107
- u = users .get (rule_activity .user_id )
108
- if u :
109
- creator = {
110
- "id" : u .id ,
111
- "name" : u .get_display_name (),
112
- "email" : u .email ,
113
- }
114
- else :
117
+ if rule_activity .user_id is None :
115
118
creator = None
119
+ else :
120
+ u = users .get (rule_activity .user_id )
121
+ if u :
122
+ creator = {
123
+ "id" : u .id ,
124
+ "name" : u .get_display_name (),
125
+ "email" : u .email ,
126
+ }
127
+ else :
128
+ creator = None
116
129
117
130
result [rule_activity .rule ].update ({"created_by" : creator })
118
131
@@ -226,7 +239,7 @@ def serialize(self, obj, attrs, user, **kwargs) -> RuleSerializerResponse:
226
239
# Integrations can be deleted and we don't want to fail to load the rule
227
240
pass
228
241
229
- d = {
242
+ d : RuleSerializerResponse = {
230
243
# XXX(dcramer): we currently serialize unsaved rule objects
231
244
# as part of the rule editor
232
245
"id" : str (obj .id ) if obj .id else None ,
@@ -245,6 +258,7 @@ def serialize(self, obj, attrs, user, **kwargs) -> RuleSerializerResponse:
245
258
"environment" : environment .name if environment is not None else None ,
246
259
"projects" : [obj .project .slug ],
247
260
"status" : "active" if obj .status == ObjectStatus .ACTIVE else "disabled" ,
261
+ "snooze" : "snooze" in attrs ,
248
262
}
249
263
if "last_triggered" in attrs :
250
264
d ["lastTriggered" ] = attrs ["last_triggered" ]
@@ -254,7 +268,6 @@ def serialize(self, obj, attrs, user, **kwargs) -> RuleSerializerResponse:
254
268
255
269
if "snooze" in attrs :
256
270
snooze = attrs ["snooze" ]
257
- d ["snooze" ] = True
258
271
created_by = None
259
272
if user .id == snooze .get ("owner_id" ):
260
273
created_by = "You"
@@ -266,8 +279,6 @@ def serialize(self, obj, attrs, user, **kwargs) -> RuleSerializerResponse:
266
279
if created_by is not None :
267
280
d ["snoozeCreatedBy" ] = created_by
268
281
d ["snoozeForEveryone" ] = snooze .get ("user_id" ) is None
269
- else :
270
- d ["snooze" ] = False
271
282
272
283
if "disable_date" in attrs :
273
284
d ["disableReason" ] = "noisy"
0 commit comments