@@ -187,6 +187,8 @@ class DashboardListResponse(TypedDict):
187
187
title : str
188
188
dateCreated : str
189
189
createdBy : UserSerializerResponse
190
+ environment : list [str ]
191
+ filters : DashboardFilters
190
192
widgetDisplay : list [str ]
191
193
widgetPreview : list [dict [str , str ]]
192
194
permissions : DashboardPermissionsResponse | None
@@ -206,9 +208,59 @@ class _Widget(TypedDict):
206
208
permissions : NotRequired [dict [str , Any ]]
207
209
is_favorited : NotRequired [bool ]
208
210
projects : list [int ]
211
+ environment : list [str ]
212
+ filters : DashboardFilters
213
+
209
214
215
+ class PageFiltersOptional (TypedDict , total = False ):
216
+ period : str
217
+ utc : str
218
+ expired : bool
219
+ start : datetime
220
+ end : str
221
+
222
+
223
+ class PageFilters (PageFiltersOptional ):
224
+ projects : list [int ]
225
+ environment : list [str ]
226
+
227
+
228
+ class DashboardFiltersMixin :
229
+ def get_filters (self , obj : Dashboard ) -> tuple [PageFilters , DashboardFilters ]:
230
+ from sentry .api .serializers .rest_framework .base import camel_to_snake_case
210
231
211
- class DashboardListSerializer (Serializer ):
232
+ dashboard_filters = obj .get_filters ()
233
+ page_filters : PageFilters = {
234
+ "projects" : dashboard_filters .get ("projects" , []),
235
+ "environment" : dashboard_filters .get ("environment" , []),
236
+ "expired" : dashboard_filters .get ("expired" , False ),
237
+ }
238
+ start , end , period = (
239
+ dashboard_filters .get ("start" ),
240
+ dashboard_filters .get ("end" ),
241
+ dashboard_filters .get ("period" ),
242
+ )
243
+ if start and end :
244
+ start , end = parse_timestamp (start ), parse_timestamp (end )
245
+ page_filters ["expired" ], page_filters ["start" ] = outside_retention_with_modified_start (
246
+ start , end , obj .organization
247
+ )
248
+ page_filters ["end" ] = end
249
+ elif period :
250
+ page_filters ["period" ] = period
251
+
252
+ if dashboard_filters .get ("utc" ) is not None :
253
+ page_filters ["utc" ] = dashboard_filters ["utc" ]
254
+
255
+ tag_filters : DashboardFilters = {}
256
+ for filter_key in ("release" , "releaseId" ):
257
+ if dashboard_filters .get (camel_to_snake_case (filter_key )):
258
+ tag_filters [filter_key ] = dashboard_filters [camel_to_snake_case (filter_key )]
259
+
260
+ return page_filters , tag_filters
261
+
262
+
263
+ class DashboardListSerializer (Serializer , DashboardFiltersMixin ):
212
264
def get_attrs (self , item_list , user , ** kwargs ):
213
265
item_dict = {i .id : i for i in item_list }
214
266
prefetch_related_objects (item_list , "projects" )
@@ -232,6 +284,8 @@ def get_attrs(self, item_list, user, **kwargs):
232
284
"widget_preview" : [],
233
285
"created_by" : {},
234
286
"projects" : [],
287
+ "environment" : [],
288
+ "filters" : {},
235
289
}
236
290
)
237
291
for widget in widgets :
@@ -272,11 +326,11 @@ def get_attrs(self, item_list, user, **kwargs):
272
326
for dashboard in item_dict .values ():
273
327
result [dashboard ]["created_by" ] = serialized_users .get (str (dashboard .created_by_id ))
274
328
result [dashboard ]["is_favorited" ] = dashboard .id in favorited_dashboard_ids
275
- result [dashboard ]["projects" ] = list (dashboard .projects .values_list ("id" , flat = True ))
276
329
277
- filters = dashboard .get_filters ()
278
- if filters and filters .get ("projects" ):
279
- result [dashboard ]["projects" ] = filters ["projects" ]
330
+ page_filters , tag_filters = self .get_filters (dashboard )
331
+ result [dashboard ]["projects" ] = page_filters .get ("projects" , [])
332
+ result [dashboard ]["environment" ] = page_filters .get ("environment" , [])
333
+ result [dashboard ]["filters" ] = tag_filters
280
334
281
335
return result
282
336
@@ -291,6 +345,8 @@ def serialize(self, obj, attrs, user, **kwargs) -> DashboardListResponse:
291
345
"permissions" : attrs .get ("permissions" , None ),
292
346
"isFavorited" : attrs .get ("is_favorited" , False ),
293
347
"projects" : attrs .get ("projects" , []),
348
+ "environment" : attrs .get ("environment" , []),
349
+ "filters" : attrs .get ("filters" , {}),
294
350
}
295
351
296
352
@@ -321,7 +377,7 @@ class DashboardDetailsResponse(DashboardDetailsResponseOptional):
321
377
322
378
323
379
@register (Dashboard )
324
- class DashboardDetailsModelSerializer (Serializer ):
380
+ class DashboardDetailsModelSerializer (Serializer , DashboardFiltersMixin ):
325
381
def get_attrs (self , item_list , user , ** kwargs ):
326
382
result = {}
327
383
@@ -341,37 +397,19 @@ def get_attrs(self, item_list, user, **kwargs):
341
397
return result
342
398
343
399
def serialize (self , obj , attrs , user , ** kwargs ) -> DashboardDetailsResponse :
344
- from sentry .api .serializers .rest_framework .base import camel_to_snake_case
345
-
346
- dashboard_filters = obj .get_filters ()
400
+ page_filters , tag_filters = self .get_filters (obj )
347
401
data : DashboardDetailsResponse = {
348
402
"id" : str (obj .id ),
349
403
"title" : obj .title ,
350
404
"dateCreated" : obj .date_added ,
351
405
"createdBy" : user_service .serialize_many (filter = {"user_ids" : [obj .created_by_id ]})[0 ],
352
406
"widgets" : attrs ["widgets" ],
353
- "projects" : dashboard_filters .get ("projects" , []),
354
- "filters" : {},
407
+ "filters" : tag_filters ,
355
408
"permissions" : serialize (obj .permissions ) if hasattr (obj , "permissions" ) else None ,
356
409
"isFavorited" : user .id in obj .favorited_by ,
410
+ "projects" : page_filters .get ("projects" , []),
411
+ "environment" : page_filters .get ("environment" , []),
412
+ ** page_filters ,
357
413
}
358
414
359
- # TODO: The logic for obtaining these filters will be moved to the Dashboard model.
360
- if obj .filters is not None :
361
- for tl_key in ("environment" , "period" , "utc" ):
362
- if obj .filters .get (tl_key ) is not None :
363
- data [tl_key ] = obj .filters [tl_key ]
364
-
365
- for filter_key in ("release" , "releaseId" ):
366
- if obj .filters .get (camel_to_snake_case (filter_key )):
367
- data ["filters" ][filter_key ] = obj .filters [camel_to_snake_case (filter_key )]
368
-
369
- start , end = obj .filters .get ("start" ), obj .filters .get ("end" )
370
- if start and end :
371
- start , end = parse_timestamp (start ), parse_timestamp (end )
372
- data ["expired" ], data ["start" ] = outside_retention_with_modified_start (
373
- start , end , obj .organization
374
- )
375
- data ["end" ] = end
376
-
377
415
return data
0 commit comments