Skip to content

Commit 9fd88d0

Browse files
committed
Add docstring for queryset filter
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 944cb23 commit 9fd88d0

1 file changed

Lines changed: 22 additions & 16 deletions

File tree

vulnerabilities/api.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from urllib.parse import unquote
1111

1212
from django.db.models import Prefetch
13-
from django.db.models import Q
1413
from django_filters import rest_framework as filters
1514
from packageurl import PackageURL
1615
from rest_framework import serializers
@@ -159,7 +158,7 @@ class PackageFilterSet(filters.FilterSet):
159158

160159
class Meta:
161160
model = Package
162-
fields = ["name", "type", "version", "subpath", "purl"]
161+
fields = ["name", "type", "version", "subpath", "purl", "packagerelatedvulnerability__fix"]
163162

164163
def filter_purl(self, queryset, name, value):
165164
purl = unquote(value)
@@ -224,26 +223,33 @@ class Meta:
224223

225224

226225
class VulnerabilityViewSet(viewsets.ReadOnlyModelViewSet):
226+
def get_fixed_packages_qs(self):
227+
"""
228+
Filter the packages that fixes a vulnerability
229+
on fields like name, namespace and type.
230+
"""
231+
package_filter_data = {"packagerelatedvulnerability__fix": True}
232+
233+
query_params = self.request.query_params
234+
for field_name in ["name", "namespace", "type"]:
235+
value = query_params.get(field_name)
236+
if value:
237+
package_filter_data[field_name] = value
238+
239+
return PackageFilterSet(package_filter_data).qs
240+
227241
def get_queryset(self):
228-
params = self.request.query_params
229-
query = Q()
230-
name = params.get("name")
231-
if name:
232-
query &= Q(name=name)
233-
namespace = params.get("namespace")
234-
if namespace:
235-
query &= Q(namespace=namespace)
236-
type = params.get("type")
237-
if type:
238-
query &= Q(type=type)
239-
queryset = Vulnerability.objects.prefetch_related(
242+
"""
243+
Assign filtered packages queryset from `get_fixed_packages_qs`
244+
to a custom attribute `filtered_fixed_packages`
245+
"""
246+
return Vulnerability.objects.prefetch_related(
240247
Prefetch(
241248
"packages",
242-
queryset=Package.objects.filter(query, packagerelatedvulnerability__fix=True),
249+
queryset=self.get_fixed_packages_qs(),
243250
to_attr="filtered_fixed_packages",
244251
)
245252
)
246-
return queryset
247253

248254
serializer_class = VulnerabilitySerializer
249255
paginate_by = 50

0 commit comments

Comments
 (0)