diff --git a/CHANGELOG.md b/CHANGELOG.md index 86f5fde1..06c25579 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Add involved users filter to alert groups listing page (+ mine shortcut) + ### Changed - Improve logging for creating contact point for Grafana Alerting integration diff --git a/engine/apps/api/views/alert_group.py b/engine/apps/api/views/alert_group.py index d2457a4f..f94ed479 100644 --- a/engine/apps/api/views/alert_group.py +++ b/engine/apps/api/views/alert_group.py @@ -85,7 +85,11 @@ class AlertGroupFilter(DateRangeFilterMixin, ModelFieldFilterMixin, filters.Filt invitees_are = filters.ModelMultipleChoiceFilter( queryset=get_user_queryset, to_field_name="public_primary_key", method="filter_invitees_are" ) + involved_users_are = filters.ModelMultipleChoiceFilter( + queryset=get_user_queryset, to_field_name="public_primary_key", method="filter_by_involved_users" + ) with_resolution_note = filters.BooleanFilter(method="filter_with_resolution_note") + mine = filters.BooleanFilter(method="filter_mine") class Meta: model = AlertGroup @@ -132,10 +136,27 @@ class AlertGroupFilter(DateRangeFilterMixin, ModelFieldFilterMixin, filters.Filt if not users: return queryset - queryset = queryset.filter(acknowledged=False, resolved=False, log_records__author__in=users).distinct() + queryset = queryset.filter(log_records__author__in=users).distinct() return queryset + def filter_by_involved_users(self, queryset, name, value): + users = value + + if not users: + return queryset + + queryset = queryset.filter( + Q(personal_log_records__author__in=users) | Q(log_records__author__in=users) + ).distinct() + + return queryset + + def filter_mine(self, queryset, name, value): + if value: + return self.filter_by_involved_users(queryset, "users", [self.request.user.pk]) + return queryset + def filter_with_resolution_note(self, queryset, name, value): if value is True: queryset = queryset.filter(Q(resolution_notes__isnull=False, resolution_notes__deleted_at=None)).distinct() @@ -522,6 +543,12 @@ class AlertGroupView( "type": "options", "href": api_root + "users/?filters=true&roles=0&roles=1&roles=2", }, + { + "name": "involved_users_are", + "type": "options", + "href": api_root + "users/?filters=true&roles=0&roles=1&roles=2", + "default": {"display_name": self.request.user.username, "value": self.request.user.public_primary_key}, + }, { "name": "status", "type": "options", @@ -548,6 +575,11 @@ class AlertGroupView( "type": "boolean", "default": "true", }, + { + "name": "mine", + "type": "boolean", + "default": "true", + }, ] if filter_name is not None: diff --git a/grafana-plugin/src/containers/IncidentsFilters/IncidentsFilters.tsx b/grafana-plugin/src/containers/IncidentsFilters/IncidentsFilters.tsx index adb54919..55d1e7a1 100644 --- a/grafana-plugin/src/containers/IncidentsFilters/IncidentsFilters.tsx +++ b/grafana-plugin/src/containers/IncidentsFilters/IncidentsFilters.tsx @@ -71,6 +71,7 @@ class IncidentsFilters extends Component