Skip to content

Commit af5d491

Browse files
johannaenglandhmpf
authored andcommitted
Add utils function for event covered by PMs
1 parent 94daf07 commit af5d491

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from typing import Optional
2+
3+
from argus.filter import get_filter_backend
4+
from argus.incident.models import Event, IncidentQuerySet
5+
from argus.plannedmaintenance.models import PlannedMaintenanceQuerySet, PlannedMaintenanceTask
6+
7+
8+
filter_backend = get_filter_backend()
9+
QuerySetFilter = filter_backend.QuerySetFilter
10+
FilterWrapper = filter_backend.FilterWrapper
11+
12+
13+
def incidents_covered_by_planned_maintenance_task(
14+
queryset: IncidentQuerySet, pm_task: PlannedMaintenanceTask
15+
) -> IncidentQuerySet:
16+
"""
17+
Takes a queryset of incidents and a planned maintenance task and returns a queryset
18+
of incidents that are currently covered by that task
19+
"""
20+
# Only if planned maintenance currently active
21+
if not pm_task.current:
22+
return queryset.none()
23+
24+
# Only open incidents
25+
queryset = queryset.open()
26+
27+
# All filters connected to this pm need to hit each incident
28+
for filter in pm_task.filters.all():
29+
queryset = QuerySetFilter.filtered_incidents(filter.filter, queryset)
30+
31+
return queryset
32+
33+
34+
def event_covered_by_planned_maintenance(event: Event, pm_tasks: Optional[PlannedMaintenanceQuerySet] = None) -> bool:
35+
"""
36+
Returns true if the given event is covered by at least one of the given planned
37+
maintenance tasks
38+
"""
39+
if not pm_tasks:
40+
pm_tasks = PlannedMaintenanceTask.objects.all()
41+
42+
pm_tasks = pm_tasks.active_at_time(event.timestamp)
43+
44+
for pm in pm_tasks:
45+
# Return true if all filters match that event
46+
covered = set()
47+
for filter in pm.filters.all():
48+
filter_wrapper = FilterWrapper(filterblob=filter.filter)
49+
covered.add(filter_wrapper.event_fits(event) and filter_wrapper.incident_fits(event.incident))
50+
if all(covered):
51+
return True
52+
return False

0 commit comments

Comments
 (0)