Skip to content

Commit 2297812

Browse files
metrics filters: improve handling when nothing matches the filters (#12687)
* metrics filters: improve handling when nothign matches the filters * fix no endpoint data error * fix endpoints metrics test * fix test
1 parent 2d42ffd commit 2297812

File tree

3 files changed

+27
-25
lines changed

3 files changed

+27
-25
lines changed

dojo/metrics/utils.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11

2+
import logging
23
import operator
34
from collections.abc import Callable
45
from datetime import date, datetime, timedelta
@@ -32,6 +33,8 @@
3233
queryset_check,
3334
)
3435

36+
logger = logging.getLogger(__name__)
37+
3538

3639
def get_metrics_finding_filter_class() -> type[MetricsFindingFilter | MetricsFindingFilterWithoutObjectLookups]:
3740
if get_system_setting("filter_string_matching", False):
@@ -62,14 +65,12 @@ def finding_queries(
6265
findings_filter = finding_filter_class(request.GET, queryset=all_authorized_findings)
6366
form = findings_filter.form
6467
filtered_findings: QuerySet[Finding] = queryset_check(findings_filter)
65-
# Quick check to determine if the filters were too tight and filtered everything away. If so, fall back to using all
66-
# authorized Findings instead.
67-
if not filtered_findings.exists() and all_authorized_findings.exists():
68-
filtered_findings = all_authorized_findings
68+
69+
if not filtered_findings.exists():
6970
messages.add_message(
7071
request,
71-
messages.ERROR,
72-
_("All objects have been filtered away. Displaying all objects"),
72+
messages.WARNING,
73+
_("No findings match the current filters."),
7374
extra_tags="alert-danger")
7475

7576
start_date, end_date = get_date_range(filtered_findings)
@@ -161,14 +162,13 @@ def endpoint_queries(
161162
endpoints_qs = queryset_check(endpoints)
162163

163164
if not endpoints_qs.exists():
164-
endpoints = endpoints_query
165-
endpoints_qs = endpoints if isinstance(endpoints, QuerySet) else endpoints.qs
166165
messages.add_message(
167166
request,
168-
messages.ERROR,
169-
_("All objects have been filtered away. Displaying all objects"),
167+
messages.WARNING,
168+
_("No endpoints match the current filters."),
170169
extra_tags="alert-danger")
171170

171+
endpoints = endpoints_qs
172172
start_date, end_date = get_date_range(endpoints_qs)
173173

174174
if len(prod_type) > 0:

dojo/product/views.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ def identify_view(request):
364364
return "Finding"
365365

366366

367-
def finding_querys(request, prod):
367+
def finding_queries(request, prod):
368368
filters = {}
369369
findings_query = Finding.objects.filter(test__engagement__product=prod)
370370
# prefetch only what's needed to avoid lots of repeated queries
@@ -433,7 +433,7 @@ def finding_querys(request, prod):
433433
return filters
434434

435435

436-
def endpoint_querys(request, prod):
436+
def endpoint_queries(request, prod):
437437
filters = {}
438438
endpoints_query = Endpoint_Status.objects.filter(finding__test__engagement__product=prod,
439439
finding__severity__in=(
@@ -449,13 +449,11 @@ def endpoint_querys(request, prod):
449449
filters["form"] = endpoints.form
450450

451451
if not endpoints_qs and not endpoints_query:
452-
endpoints = endpoints_query
453-
endpoints_qs = queryset_check(endpoints)
454-
messages.add_message(request,
455-
messages.ERROR,
456-
_("All objects have been filtered away. Displaying all objects"),
457-
extra_tags="alert-danger")
458-
452+
messages.add_message(
453+
request,
454+
messages.WARNING,
455+
_("No Endpoints match the current filters."),
456+
extra_tags="alert-danger")
459457
try:
460458
start_date = endpoints_qs.earliest("date").date
461459
start_date = datetime(start_date.year,
@@ -538,9 +536,9 @@ def view_product_metrics(request, pid):
538536

539537
filters = {}
540538
if view == "Finding":
541-
filters = finding_querys(request, prod)
539+
filters = finding_queries(request, prod)
542540
elif view == "Endpoint":
543-
filters = endpoint_querys(request, prod)
541+
filters = endpoint_queries(request, prod)
544542

545543
start_date = timezone.make_aware(datetime.combine(filters["start_date"], datetime.min.time()))
546544
end_date = filters["end_date"]

unittests/test_metrics_queries.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from django.urls import reverse
99

1010
from dojo.metrics import utils
11-
from dojo.models import User
11+
from dojo.models import Product_Type, User
1212

1313
from .dojo_test_case import DojoTestCase
1414

@@ -184,10 +184,14 @@ def test_endpoint_queries_no_data(self):
184184
[],
185185
)
186186

187-
def test_endpoint_queries(self):
187+
@patch("dojo.filters.now")
188+
def test_endpoint_queries(self, mock_now):
189+
fake_now = pytz.UTC.localize(datetime(2020, 7, 1))
190+
mock_now.return_value = fake_now
191+
188192
# Queries over Finding and Endpoint_Status
189-
with self.assertNumQueries(43):
190-
product_types = []
193+
with self.assertNumQueries(44):
194+
product_types = Product_Type.objects.all()
191195
endpoint_queries = utils.endpoint_queries(
192196
product_types,
193197
self.request,

0 commit comments

Comments
 (0)