|
10 | 10 | from urllib.parse import unquote |
11 | 11 |
|
12 | 12 | from django.db.models import Prefetch |
13 | | -from django.db.models import Q |
14 | 13 | from django_filters import rest_framework as filters |
15 | 14 | from packageurl import PackageURL |
16 | 15 | from rest_framework import serializers |
@@ -159,7 +158,7 @@ class PackageFilterSet(filters.FilterSet): |
159 | 158 |
|
160 | 159 | class Meta: |
161 | 160 | model = Package |
162 | | - fields = ["name", "type", "version", "subpath", "purl"] |
| 161 | + fields = ["name", "type", "version", "subpath", "purl", "packagerelatedvulnerability__fix"] |
163 | 162 |
|
164 | 163 | def filter_purl(self, queryset, name, value): |
165 | 164 | purl = unquote(value) |
@@ -224,26 +223,33 @@ class Meta: |
224 | 223 |
|
225 | 224 |
|
226 | 225 | 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 | + |
227 | 241 | 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( |
240 | 247 | Prefetch( |
241 | 248 | "packages", |
242 | | - queryset=Package.objects.filter(query, packagerelatedvulnerability__fix=True), |
| 249 | + queryset=self.get_fixed_packages_qs(), |
243 | 250 | to_attr="filtered_fixed_packages", |
244 | 251 | ) |
245 | 252 | ) |
246 | | - return queryset |
247 | 253 |
|
248 | 254 | serializer_class = VulnerabilitySerializer |
249 | 255 | paginate_by = 50 |
|
0 commit comments