13
13
from cvss .exceptions import CVSS3MalformedError
14
14
from cvss .exceptions import CVSS4MalformedError
15
15
from django .db .models import Prefetch
16
+ from django .db .models import Exists
17
+ from django .db .models import OuterRef
18
+ from django .http import Http404
19
+ from django .shortcuts import get_object_or_404
16
20
from django_filters import rest_framework as filters
17
21
from drf_spectacular .utils import extend_schema
18
22
from packageurl import PackageURL
22
26
from rest_framework import viewsets
23
27
from rest_framework .decorators import action
24
28
from rest_framework .response import Response
29
+ from rest_framework .reverse import reverse
25
30
from rest_framework .throttling import AnonRateThrottle
26
31
27
32
from vulnerabilities .models import Alias
@@ -236,6 +241,10 @@ class VulnerabilitySerializer(BaseResourceSerializer):
236
241
exploits = ExploitSerializer (many = True , read_only = True )
237
242
weaknesses = WeaknessSerializer (many = True )
238
243
severity_range_score = serializers .SerializerMethodField ()
244
+ url = serializers .HyperlinkedIdentityField (
245
+ view_name = "vulnerability-detail" ,
246
+ lookup_field = "vulnerability_id"
247
+ )
239
248
240
249
def to_representation (self , instance ):
241
250
data = super ().to_representation (instance )
@@ -308,6 +317,8 @@ class PackageSerializer(BaseResourceSerializer):
308
317
next_non_vulnerable_version = serializers .CharField (read_only = True )
309
318
latest_non_vulnerable_version = serializers .CharField (read_only = True )
310
319
320
+ url = serializers .SerializerMethodField ()
321
+
311
322
purl = serializers .CharField (source = "package_url" )
312
323
313
324
affected_by_vulnerabilities = serializers .SerializerMethodField ("get_affected_vulnerabilities" )
@@ -318,6 +329,10 @@ class PackageSerializer(BaseResourceSerializer):
318
329
319
330
is_vulnerable = serializers .BooleanField ()
320
331
332
+ def get_url (self , package ):
333
+ request = self .context .get ("request" )
334
+ return reverse ("package_details" , kwargs = {'purl' : package .purl }, request = request )
335
+
321
336
def get_qualifiers (self , package ):
322
337
return normalize_qualifiers (package .qualifiers , encode = False )
323
338
@@ -469,6 +484,7 @@ class PackageViewSet(viewsets.ReadOnlyModelViewSet):
469
484
470
485
queryset = Package .objects .all ()
471
486
serializer_class = PackageSerializer
487
+ lookup_field = "package_url"
472
488
filter_backends = (filters .DjangoFilterBackend ,)
473
489
filterset_class = PackageFilterSet
474
490
throttle_classes = [StaffUserRateThrottle , AnonRateThrottle ]
@@ -689,6 +705,7 @@ def get_queryset(self):
689
705
filter_backends = (filters .DjangoFilterBackend ,)
690
706
filterset_class = VulnerabilityFilterSet
691
707
throttle_classes = [StaffUserRateThrottle , AnonRateThrottle ]
708
+ lookup_field = "vulnerability_id"
692
709
693
710
694
711
class CPEFilterSet (filters .FilterSet ):
0 commit comments