Skip to content

Commit 8fc0661

Browse files
committed
Filtering of Non Vulnerable packages added in API v2
1 parent fabe035 commit 8fc0661

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

vulnerabilities/api_v2.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,10 @@ class PackageV2FilterSet(filters.FilterSet):
254254
)
255255
fixing_vulnerability = filters.CharFilter(field_name="fixing_vulnerabilities__vulnerability_id")
256256
purl = filters.CharFilter(field_name="package_url")
257+
is_vulnerable = filters.BooleanFilter(method="filter_is_vulnerable")
258+
259+
def filter_is_vulnerable(self, queryset, name, value):
260+
return queryset.filter(is_vulnerable=value)
257261

258262

259263
class PackageV2ViewSet(viewsets.ReadOnlyModelViewSet):
@@ -273,6 +277,7 @@ def get_queryset(self):
273277
package_purls = self.request.query_params.getlist("purl")
274278
affected_by_vulnerability = self.request.query_params.get("affected_by_vulnerability")
275279
fixing_vulnerability = self.request.query_params.get("fixing_vulnerability")
280+
is_vulnerable = self.request.query_params.get("is_vulnerable")
276281

277282
if package_purls:
278283
queryset = queryset.filter(package_url__in=package_purls)
@@ -284,6 +289,12 @@ def get_queryset(self):
284289
queryset = queryset.filter(
285290
fixing_vulnerabilities__vulnerability_id=fixing_vulnerability
286291
)
292+
if is_vulnerable is not None:
293+
queryset = queryset.with_is_vulnerable()
294+
is_vulnerable = is_vulnerable.lower() == "true"
295+
queryset = queryset.filter(is_vulnerable=is_vulnerable)
296+
297+
queryset = queryset.exclude(version="")
287298
return queryset.with_is_vulnerable()
288299

289300
def list(self, request, *args, **kwargs):

vulnerabilities/templates/packages.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@
1818
<div>
1919
{{ page_obj.paginator.count|intcomma }} results
2020
</div>
21+
<form method="get" style="display: inline;">
22+
{% if search %}<input type="hidden" name="search" value="{{ search }}">{% endif %}
23+
<select name="vulnerable_only" class="select" id="vulnerable-select" onchange="this.form.submit()">
24+
<option value="">All Packages</option>
25+
<option value="true" {% if request.GET.vulnerable_only == 'true' %}selected{% endif %}>Vulnerable Only</option>
26+
<option value="false" {% if request.GET.vulnerable_only == 'false' %}selected{% endif %}>Non-Vulnerable Only</option>
27+
</select>
28+
</form>
2129
{% if is_paginated %}
2230
{% include 'includes/pagination.html' with page_obj=page_obj %}
2331
{% endif %}

vulnerabilities/views.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,18 @@ def get_queryset(self, query=None):
5858
on exact purl, partial purl or just name and namespace.
5959
"""
6060
query = query or self.request.GET.get("search") or ""
61-
return (
61+
queryset = (
6262
self.model.objects.search(query)
6363
.with_vulnerability_counts()
6464
.prefetch_related()
6565
.order_by("package_url")
6666
)
67+
if hasattr(self, "request"):
68+
vulnerable_only = self.request.GET.get("vulnerable_only", "").lower()
69+
if vulnerable_only in ["true", "false"]:
70+
queryset = queryset.with_is_vulnerable()
71+
queryset = queryset.filter(is_vulnerable=vulnerable_only == "true")
72+
return queryset
6773

6874

6975
class VulnerabilitySearch(ListView):

0 commit comments

Comments
 (0)