1212from django .db .models import Prefetch
1313from django_filters import rest_framework as filters
1414from drf_spectacular .utils import extend_schema
15- from drf_spectacular .utils import inline_serializer
1615from packageurl import PackageURL
1716from packageurl import normalize_qualifiers
1817from rest_framework import serializers
3231from vulnerabilities .models import VulnerabilitySeverity
3332from vulnerabilities .models import Weakness
3433from vulnerabilities .models import get_purl_query_lookups
34+ from vulnerabilities .severity_systems import EPSS , SCORING_SYSTEMS
3535from vulnerabilities .throttling import StaffUserRateThrottle
36+ from vulnerabilities .utils import get_severity_range
37+ from cvss .exceptions import CVSS2MalformedError
38+ from cvss .exceptions import CVSS3MalformedError
39+ from cvss .exceptions import CVSS4MalformedError
3640
3741
3842class VulnerabilitySeveritySerializer (serializers .ModelSerializer ):
@@ -193,6 +197,7 @@ class VulnerabilitySerializer(BaseResourceSerializer):
193197 aliases = AliasSerializer (many = True , source = "alias" )
194198 kev = KEVSerializer (read_only = True )
195199 weaknesses = WeaknessSerializer (many = True )
200+ severity_range_score = serializers .SerializerMethodField ()
196201
197202 def to_representation (self , instance ):
198203 data = super ().to_representation (instance )
@@ -205,6 +210,30 @@ def to_representation(self, instance):
205210 data .pop ("kev" )
206211
207212 return data
213+
214+ def get_severity_range_score (self , instance ):
215+ severity_vectors = []
216+ severity_values = set ()
217+ for s in instance .severities :
218+ if s .scoring_system == EPSS .identifier :
219+ continue
220+
221+ if s .scoring_elements and s .scoring_system in SCORING_SYSTEMS :
222+ try :
223+ vector_values = SCORING_SYSTEMS [s .scoring_system ].get (s .scoring_elements )
224+ severity_vectors .append (vector_values )
225+ except (
226+ CVSS2MalformedError ,
227+ CVSS3MalformedError ,
228+ CVSS4MalformedError ,
229+ NotImplementedError ,
230+ ):
231+ pass
232+
233+ if s .value :
234+ severity_values .add (s .value )
235+ severity_range = get_severity_range (severity_values )
236+ return severity_range
208237
209238 class Meta :
210239 model = Vulnerability
@@ -218,6 +247,7 @@ class Meta:
218247 "references" ,
219248 "weaknesses" ,
220249 "kev" ,
250+ "severity_range_score" ,
221251 ]
222252
223253
0 commit comments