|
43 | 43 | from vulnerabilities.throttling import PermissionBasedUserRateThrottle |
44 | 44 |
|
45 | 45 |
|
| 46 | +class CharInFilter(filters.BaseInFilter, filters.CharFilter): |
| 47 | + pass |
| 48 | + |
| 49 | + |
46 | 50 | class WeaknessV2Serializer(serializers.ModelSerializer): |
47 | 51 | cwe_id = serializers.CharField() |
48 | 52 | name = serializers.CharField() |
@@ -374,9 +378,24 @@ class PackageV2FilterSet(filters.FilterSet): |
374 | 378 |
|
375 | 379 |
|
376 | 380 | class AdvisoryPackageV2FilterSet(filters.FilterSet): |
377 | | - affected_by_vulnerability = filters.CharFilter(field_name="affected_by_advisory__advisory_id") |
378 | | - fixing_vulnerability = filters.CharFilter(field_name="fixing_advisories__advisory_id") |
379 | | - purl = filters.CharFilter(field_name="package_url") |
| 381 | + affected_by_advisory = filters.CharFilter( |
| 382 | + field_name="affected_in_impacts__advisory__avid", |
| 383 | + label="Affected By Advisory ID", |
| 384 | + help_text="Filter packages affected by a specific Advisory ID.", |
| 385 | + ) |
| 386 | + |
| 387 | + fixing_advisory = filters.CharFilter( |
| 388 | + field_name="fixed_in_impacts__advisory__avid", |
| 389 | + label="Fixed By Advisory ID", |
| 390 | + help_text="Filter packages fixed by a specific Advisory ID.", |
| 391 | + ) |
| 392 | + |
| 393 | + purls = CharInFilter( |
| 394 | + field_name="package_url", |
| 395 | + lookup_expr="in", |
| 396 | + label="Package URL", |
| 397 | + help_text="Filter by one or more Package URLs. Multi-value supported (comma-separated).", |
| 398 | + ) |
380 | 399 |
|
381 | 400 |
|
382 | 401 | class PackageV2ViewSet(viewsets.ReadOnlyModelViewSet): |
@@ -961,42 +980,33 @@ def get_view_name(self): |
961 | 980 |
|
962 | 981 |
|
963 | 982 | class AdvisoriesPackageV2ViewSet(viewsets.ReadOnlyModelViewSet): |
964 | | - queryset = ( |
965 | | - PackageV2.objects.all() |
966 | | - .prefetch_related( |
967 | | - Prefetch( |
968 | | - "affected_in_impacts", |
969 | | - queryset=ImpactedPackage.objects.select_related("advisory").prefetch_related( |
970 | | - "fixed_by_packages", |
971 | | - ), |
972 | | - ), |
973 | | - Prefetch( |
974 | | - "fixed_in_impacts", |
975 | | - queryset=ImpactedPackage.objects.select_related("advisory"), |
976 | | - ), |
977 | | - ) |
978 | | - .with_is_vulnerable() |
979 | | - ) |
| 983 | + queryset = PackageV2.objects.all() |
980 | 984 | serializer_class = AdvisoryPackageV2Serializer |
981 | | - filter_backends = (filters.DjangoFilterBackend,) |
| 985 | + filter_backends = [filters.DjangoFilterBackend] |
982 | 986 | filterset_class = AdvisoryPackageV2FilterSet |
983 | 987 |
|
984 | 988 | def get_queryset(self): |
985 | | - queryset = super().get_queryset() |
986 | | - package_purls = self.request.query_params.getlist("purl") |
987 | | - affected_by_advisory = self.request.query_params.get("affected_by_advisory") |
988 | | - fixing_advisory = self.request.query_params.get("fixing_advisory") |
989 | | - if package_purls: |
990 | | - queryset = queryset.filter(package_url__in=package_purls) |
991 | | - if affected_by_advisory: |
992 | | - queryset = queryset.filter(affected_by_advisories__advisory_id=affected_by_advisory) |
993 | | - if fixing_advisory: |
994 | | - queryset = queryset.filter(fixing_advisories__advisory=fixing_advisory) |
995 | | - return queryset.with_is_vulnerable() |
| 989 | + return ( |
| 990 | + super() |
| 991 | + .get_queryset() |
| 992 | + .prefetch_related( |
| 993 | + Prefetch( |
| 994 | + "affected_in_impacts", |
| 995 | + queryset=ImpactedPackage.objects.select_related("advisory").prefetch_related( |
| 996 | + "fixed_by_packages", |
| 997 | + ), |
| 998 | + ), |
| 999 | + Prefetch( |
| 1000 | + "fixed_in_impacts", |
| 1001 | + queryset=ImpactedPackage.objects.select_related("advisory"), |
| 1002 | + ), |
| 1003 | + ) |
| 1004 | + .with_is_vulnerable() |
| 1005 | + ) |
996 | 1006 |
|
997 | 1007 | def list(self, request, *args, **kwargs): |
998 | | - queryset = self.get_queryset() |
999 | | - page = self.paginate_queryset(queryset) |
| 1008 | + filtered_queryset = self.filter_queryset(self.get_queryset()) |
| 1009 | + page = self.paginate_queryset(filtered_queryset) |
1000 | 1010 |
|
1001 | 1011 | advisories = set() |
1002 | 1012 | if page is not None: |
|
0 commit comments