Skip to content

Commit 0abb3a0

Browse files
committed
Fix stored filter controls
.. also added the name of each involved template to that template as an html comment, for ease of debugging.
1 parent 7ec883a commit 0abb3a0

14 files changed

+99
-72
lines changed

src/argus/htmx/incident/filter.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
QuerySetFilter = filter_backend.QuerySetFilter
1616
LOG = logging.getLogger(__name__)
1717

18+
MIN_LEVEL = min(Level).value
19+
MAX_LEVEL = max(Level).value
20+
1821

1922
class RangeInput(forms.NumberInput):
2023
template_name = "django/forms/widgets/range.html"
@@ -53,9 +56,9 @@ class IncidentFilterForm(forms.Form):
5356
help_text='Press "Enter" after each completed tag',
5457
)
5558
maxlevel = forms.IntegerField(
56-
widget=RangeInput(attrs={"step": "1", "min": min(Level).value, "max": max(Level).value}),
59+
widget=RangeInput(attrs={"step": "1", "min": MIN_LEVEL, "max": MAX_LEVEL}),
5760
label="Level <=",
58-
initial=max(Level).value,
61+
initial=MAX_LEVEL,
5962
required=False,
6063
)
6164

@@ -64,7 +67,7 @@ class IncidentFilterForm(forms.Form):
6467
"acked": None,
6568
"sourceSystemIds": [],
6669
"tags": "",
67-
"maxlevel": max(Level).value,
70+
"maxlevel": MAX_LEVEL,
6871
}
6972

7073
def __init__(self, *args, **kwargs):
@@ -117,9 +120,13 @@ def to_filterblob(self):
117120

118121
filterblob = {}
119122

120-
filterblob["open"] = self._open_tristate()
123+
open = self._open_tristate()
124+
if open is not None:
125+
filterblob["open"] = open
121126

122-
filterblob["acked"] = self._acked_tristate()
127+
acked = self._acked_tristate()
128+
if acked is not None:
129+
filterblob["acked"] = acked
123130

124131
sourceSystemIds = self.cleaned_data.get("sourceSystemIds", [])
125132
if sourceSystemIds:
@@ -129,7 +136,7 @@ def to_filterblob(self):
129136
if tags:
130137
filterblob["tags"] = [tag.strip() for tag in tags.split(",")]
131138

132-
maxlevel = self.cleaned_data.get("maxlevel", 0)
139+
maxlevel = self.cleaned_data.get("maxlevel", MAX_LEVEL)
133140
if maxlevel:
134141
filterblob["maxlevel"] = maxlevel
135142

@@ -193,6 +200,7 @@ def incident_list_filter(request, qs, use_empty_filter=False):
193200

194201
def _convert_filterblob(filterblob):
195202
"""Converts values in filterblob so it can be used as valid input for IncidentFilterForm"""
203+
filterblob = filterblob.copy()
196204
if "tags" in filterblob.keys():
197205
filterblob["tags"] = ", ".join(filterblob["tags"])
198206

src/argus/htmx/incident/views.py

Lines changed: 54 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,26 @@ def incident_update(request: HtmxHttpRequest, action: str):
113113
return HttpResponseClientRefresh()
114114

115115

116+
def set_selected_filter(request, filter_obj):
117+
if filter_obj:
118+
request.session["selected_filter_pk"] = str(filter_obj.pk)
119+
request.session["selected_filter_name"] = filter_obj.name
120+
else:
121+
request.session["selected_filter_pk"] = None
122+
request.session.pop("selected_filter_name", None)
123+
124+
125+
def get_selected_filter(request):
126+
filter_id = request.session.get("selected_filter_pk", None)
127+
if filter_id:
128+
return get_object_or_404(Filter, pk=filter_id, user=request.user)
129+
return None
130+
131+
116132
@require_GET
117133
def filter_form(request: HtmxHttpRequest):
134+
set_selected_filter(request, None)
118135
LOG = logging.getLogger(__name__ + ".filter_form")
119-
request.session["selected_filter"] = None
120136
incident_list_filter = get_filter_function()
121137
filter_form, _ = incident_list_filter(request, None)
122138
context = {"filter_form": filter_form}
@@ -135,7 +151,7 @@ def create_filter(request: HtmxHttpRequest):
135151
filterblob = filter_form.to_filterblob()
136152
_, filter_obj = create_named_filter(request, filter_name, filterblob)
137153
if filter_obj:
138-
request.session["selected_filter"] = str(filter_obj.id)
154+
set_selected_filter(request, filter_obj)
139155
return HttpResponseClientRefresh()
140156
messages.error(request, "Failed to create filter")
141157
return HttpResponseBadRequest()
@@ -152,11 +168,12 @@ def update_filter(request: HtmxHttpRequest, pk: int):
152168
filter_obj.save()
153169

154170
# Immediately select the newly updated filter - keep or not?
155-
# request.session["selected_filter"] = str(filter_obj.id)
171+
# set_selected_filter(request, filter_obj)
156172

157173
messages.success(request, f"Updated filter '{filter_obj.name}'.")
158174
return HttpResponseClientRefresh()
159-
messages.error(request, f"Failed to update filter '{filter_obj.name}'.")
175+
errors = f": {filter_form.errors}" if filter_form.errors else ""
176+
messages.error(request, f'Failed to update filter "{filter_obj.name}": {errors}')
160177
return HttpResponseBadRequest()
161178

162179

@@ -166,8 +183,8 @@ def delete_filter(request: HtmxHttpRequest, pk: int):
166183
deleted_id = filter_obj.delete()
167184
if deleted_id:
168185
messages.success(request, f"Deleted filter {filter_obj.name}.")
169-
if request.session.get("selected_filter") == str(pk):
170-
request.session["selected_filter"] = None
186+
if request.session.get("selected_filter_pk") == str(pk):
187+
set_selected_filter(request, None)
171188
return HttpResponseClientRefresh()
172189

173190

@@ -185,22 +202,25 @@ def get_existing_filters(request: HtmxHttpRequest):
185202

186203
@require_GET
187204
def filter_select(request: HtmxHttpRequest):
205+
context = {}
206+
template_name = "htmx/incident/_incident_list_filter_incidents.html"
207+
188208
filter_id = request.GET.get("filter", None)
189-
if filter_id and get_object_or_404(Filter, id=filter_id):
190-
request.session["selected_filter"] = filter_id
191-
incident_list_filter = get_filter_function()
192-
filter_form, _ = incident_list_filter(request, None)
193-
context = {"filter_form": filter_form}
194-
return render(request, "htmx/incident/_incident_filterbox.html", context=context)
209+
if filter_id:
210+
use_empty_filter = False
211+
filter_obj = get_object_or_404(Filter, id=filter_id)
212+
set_selected_filter(request, filter_obj)
195213
else:
196-
request.session["selected_filter"] = None
197-
if request.htmx.trigger:
198-
incident_list_filter = get_filter_function()
199-
filter_form, _ = incident_list_filter(request, None, use_empty_filter=True)
200-
context = {"filter_form": filter_form}
201-
return render(request, "htmx/incident/_incident_filterbox.html", context=context)
202-
else:
203-
return retarget(HttpResponse(), "#incident-filter-select")
214+
use_empty_filter = True
215+
set_selected_filter(request, None)
216+
217+
if request.htmx.trigger:
218+
incident_list_filter = get_filter_function()
219+
filter_form, _ = incident_list_filter(request, None, use_empty_filter=use_empty_filter)
220+
context["filter_form"] = filter_form
221+
return render(request, template_name, context=context)
222+
223+
return retarget(HttpResponse(), "#incident-filter-select")
204224

205225

206226
def dedupe_querydict(querydict: QueryDict):
@@ -254,6 +274,10 @@ def incident_list(request: HtmxHttpRequest) -> HttpResponse:
254274
total_count = qs.count()
255275
last_refreshed = make_aware(datetime.now())
256276

277+
# Stored filters
278+
existing_filters = Filter.objects.filter(user=request.user)
279+
280+
# Get filters storable in Filter.filter
257281
incident_list_filter = get_filter_function()
258282
filter_form, qs = incident_list_filter(request, qs)
259283

@@ -305,12 +329,19 @@ def incident_list(request: HtmxHttpRequest) -> HttpResponse:
305329

306330
LOG.debug("GET at end: %s", request.GET)
307331
context = {
308-
"columns": columns,
332+
"page_title": "Incidents",
333+
"base": base_template,
334+
# filter box
309335
"filter_form": filter_form,
336+
# storing filters
337+
"stored_filters": existing_filters,
338+
# table
339+
"columns": columns,
340+
# refresh info
310341
"refresh_info": refresh_info,
311342
"refresh_info_forms": GET_forms,
312-
"page_title": "Incidents",
313-
"base": base_template,
343+
"filtered_count": filtered_count,
344+
"count": total_count,
314345
"page": page,
315346
"last_page_num": last_page_num,
316347
"second_to_last_page": last_page_num - 1,

src/argus/htmx/templates/htmx/_base_confirm_dialog.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- htmx/_base_confirm_dialog -->
12
<!-- This confirmation dialog is a special case of the base form modal that needs its own template.
23
It can be used as one of several confirm dialogs in DOM, for example as an item in HTML list.
34
In this case the item_id attribute must be provided when extending from this template.

src/argus/htmx/templates/htmx/incident/_delete_filter_confirm_dialog.html

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
1+
<!-- htmx/incident/_filter_controls.html -->
12
<div class="join join-horizontal items-center">
23
{% include "htmx/incident/_filter_select.html" %}
3-
{% include "htmx/incident/_filter_create_modal.html" with dialog_id="create-filter-dialog" button_title="Create filter" button_class="btn-sm text-xs join-item" header="Create new filter" explanation="Create new filter from currently selected filter parameters" cancel_text="Cancel" submit_text="Submit" %}
4-
{% include "htmx/incident/_filter_update_dropdown.html" %}
5-
{% include "htmx/incident/_filter_delete_dropdown.html" %}
4+
{% include "htmx/incident/_filter_create_modal.html" with dialog_id="create-filter-dialog" button_title="Save new" button_class="btn-sm text-xs join-item" header="Create new filter" explanation="Create new filter from currently selected filter parameters" cancel_text="Cancel" submit_text="Submit" %}
5+
{% with item_id=request.session.selected_filter_pk item_title=request.session.selected_filter_name item_class="btn btn-sm text-xs join-item rounded-l-none! ml-1" %}
6+
{% if request.session.selected_filter_pk %}
7+
{% url 'htmx:filter-update' pk=request.session.selected_filter_pk as update_filter_url %}
8+
{% include "htmx/incident/_filter_controls_confirm_dialog.html" with filter_url=update_filter_url modal_button_name="Update" dialog_id="filter-update-confirm" action="Update filter" confirmation_message="Are you sure you want to override this filter?" %}
9+
{% url 'htmx:filter-delete' pk=request.session.selected_filter_pk as delete_filter_url %}
10+
{% include "htmx/incident/_filter_controls_confirm_dialog.html" with filter_url=delete_filter_url modal_button_name="Delete" dialog_id="filter-delete-confirm" action="Delete filter" confirmation_message="Are you sure you want to delete this filter?" %}
11+
{% else %}
12+
<button class="{{ item_class }}" disabled>Update</button>
13+
<button class="{{ item_class }}" disabled>Delete</button>
14+
{% endif %}
15+
{% endwith %}
616
</div>

src/argus/htmx/templates/htmx/incident/_update_filter_confirm_dialog.html renamed to src/argus/htmx/templates/htmx/incident/_filter_controls_confirm_dialog.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
<!-- htmx/incident/_filter_alter_confirm_dialog.html -->
12
{% extends "htmx/_base_confirm_dialog.html" %}
23
{% block confirm_action_control %}
3-
hx-post="{% url 'htmx:filter-update' pk=filter.id %}"
4+
hx-post="{{ filter_url }}"
45
hx-include="#incident-filter-box fieldset"
56
{% endblock confirm_action_control %}

src/argus/htmx/templates/htmx/incident/_filter_create_modal.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- htmx/incident/_filter_create_modal.html -->
12
{% extends "htmx/_base_form_modal.html" %}
23
{% block form_control %}
34
hx-post="{% url 'htmx:filter-create' %}"

src/argus/htmx/templates/htmx/incident/_filter_delete_dropdown.html

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/argus/htmx/templates/htmx/incident/_filter_update_dropdown.html

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/argus/htmx/templates/htmx/incident/_incident_filterbox.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- htmx/incident/_incident_filterbox.html -->
12
{% load widget_tweaks %}
23
<form id="incident-filter-box"
34
class="incident-list-param"

0 commit comments

Comments
 (0)