Skip to content

Commit

Permalink
Add search for tags
Browse files Browse the repository at this point in the history
  • Loading branch information
johannaengland committed Jan 28, 2025
1 parent b969ae6 commit e49f1ce
Show file tree
Hide file tree
Showing 8 changed files with 349 additions and 30 deletions.
49 changes: 42 additions & 7 deletions src/argus/htmx/incident/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
from django.views.generic import ListView

from argus.filter import get_filter_backend
from argus.incident.models import SourceSystem
from argus.incident.models import SourceSystem, Tag
from argus.incident.constants import Level
from argus.htmx.widgets import BadgeDropdownMultiSelect
from argus.notificationprofile.models import Filter
from argus.htmx.widgets import BadgeDropdownMultiSelect, SearchDropdownMultiSelect


filter_backend = get_filter_backend()
QuerySetFilter = filter_backend.QuerySetFilter
Expand All @@ -33,6 +34,38 @@ def get_success_url(self):
return reverse("htmx:filter-list")


class TagFilterForm(forms.Form):
tags = forms.MultipleChoiceField(
widget=SearchDropdownMultiSelect(
attrs={
"placeholder": "search tags...",
},
partial_get=None,
),
choices=((tag.id, str(tag)) for tag in Tag.objects.none()),
required=False,
label="Tags",
)

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# mollify tests
self.fields["tags"].widget.partial_get = reverse("htmx:search-tags")

query = kwargs.pop("search", None)
if not query:
self.fields["tags"].choices = ((tag.id, str(tag)) for tag in Tag.objects.all())
return

if Tag.TAG_DELIMITER in query:
key, value = Tag.split(query)
tags = Tag.objects.filter(key=key, value__icontains=value)[:20]
else:
tags = Tag.objects.filter(key__icontains=query)[:20]

self.fields["tags"].choices = ((tag.id, str(tag)) for tag in tags)


class IncidentFilterForm(forms.Form):
open = forms.BooleanField(required=False)
closed = forms.BooleanField(required=False)
Expand All @@ -47,13 +80,14 @@ class IncidentFilterForm(forms.Form):
required=False,
label="Sources",
)
tags = forms.CharField(
widget=forms.TextInput(
tags = forms.MultipleChoiceField(
widget=SearchDropdownMultiSelect(
attrs={
"placeholder": "enter tags...",
"class": "show-selected-box input input-accent input-bordered input-md border overflow-y-auto min-h-8 h-auto max-h-16 max-w-xs leading-tight",
}
"placeholder": "search tags...",
},
partial_get=None,
),
choices=((tag.id, str(tag)) for tag in Tag.objects.all()),
required=False,
label="Tags",
)
Expand All @@ -70,6 +104,7 @@ def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# mollify tests
self.fields["sourceSystemIds"].widget.partial_get = reverse("htmx:incident-filter")
self.fields["tags"].widget.partial_get = reverse("htmx:search-tags")

def _tristate(self, onkey, offkey):
on = self.cleaned_data.get(onkey, None)
Expand Down
1 change: 1 addition & 0 deletions src/argus/htmx/incident/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@
path("filter-list/", filter.FilterListView.as_view(), name="filter-list"),
path("select-filter/", views.filter_select, name="select-filter"),
path("filter-create/", views.create_filter, name="filter-create"),
path("search-tags/", views.search_tags, name="search-tags"),
]
22 changes: 22 additions & 0 deletions src/argus/htmx/incident/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,28 @@ def filter_select(request: HtmxHttpRequest):
return retarget(HttpResponse(), "#incident-filter-select")


@require_GET
def search_tags(request: HtmxHttpRequest):
from .filter import TagFilterForm

query = request.GET.get("search", None)
form = TagFilterForm(request.GET or None)
form.is_valid()

if not query:
return render(
request,
"htmx/forms/selected_choices.html",
{"widget": form.fields["tags"].widget},
)

return render(
request,
"htmx/forms/search_results.html",
{"widget": form.fields["tags"].widget},
)


@require_GET
def incident_list(request: HtmxHttpRequest) -> HttpResponse:
columns = get_incident_table_columns()
Expand Down
Loading

0 comments on commit e49f1ce

Please sign in to comment.