77# See https://aboutcode.org for more information about nexB OSS projects.
88#
99import logging
10- from itertools import groupby
11- from operator import attrgetter
1210
1311from cvss .exceptions import CVSS2MalformedError
1412from cvss .exceptions import CVSS3MalformedError
2422from django .views import generic
2523from django .views .generic .detail import DetailView
2624from django .views .generic .list import ListView
27- from univers .version_range import RANGE_CLASS_BY_SCHEMES
28- from univers .version_range import AlpineLinuxVersionRange
2925
3026from vulnerabilities import models
3127from vulnerabilities .forms import ApiUserCreationForm
3228from vulnerabilities .forms import PackageSearchForm
3329from vulnerabilities .forms import VulnerabilitySearchForm
34- from vulnerabilities .models import VulnerabilityStatusType
3530from vulnerabilities .severity_systems import EPSS
3631from vulnerabilities .severity_systems import SCORING_SYSTEMS
37- from vulnerabilities .utils import get_severity_range
32+ from vulnerabilities .utils import get_purl_version_class
3833from vulnerablecode .settings import env
3934
4035PAGE_SIZE = 20
@@ -54,15 +49,6 @@ def purl_sort_key(purl: models.Package):
5449 return (purl .type , purl .namespace , purl .name , purl_sort_version , purl .qualifiers , purl .subpath )
5550
5651
57- def get_purl_version_class (purl : models .Package ):
58- RANGE_CLASS_BY_SCHEMES ["alpine" ] = AlpineLinuxVersionRange
59- purl_version_class = None
60- check_version_class = RANGE_CLASS_BY_SCHEMES .get (purl .type , None )
61- if check_version_class :
62- purl_version_class = check_version_class .version_class
63- return purl_version_class
64-
65-
6652class PackageSearch (ListView ):
6753 model = models .Package
6854 template_name = "packages.html"
@@ -183,7 +169,7 @@ def get_context_data(self, **kwargs):
183169 sorted_fixed_by_packages ,
184170 sorted_affected_packages ,
185171 all_affected_fixed_by_matches ,
186- ) = self .aggregate_fixed_and_affected_packages ()
172+ ) = self .object . aggregate_fixed_and_affected_packages ()
187173
188174 context .update (
189175 {
@@ -204,57 +190,6 @@ def get_context_data(self, **kwargs):
204190 )
205191 return context
206192
207- def aggregate_fixed_and_affected_packages (self ):
208- sorted_fixed_by_packages = self .object .fixed_by_packages .filter (is_ghost = False ).order_by (
209- "type" , "namespace" , "name" , "qualifiers" , "subpath"
210- )
211-
212- sorted_affected_packages = self .object .affected_packages .all ()
213-
214- grouped_fixed_by_packages = {
215- key : list (group )
216- for key , group in groupby (
217- sorted_fixed_by_packages ,
218- key = attrgetter ("type" , "namespace" , "name" , "qualifiers" , "subpath" ),
219- )
220- }
221-
222- all_affected_fixed_by_matches = []
223-
224- for sorted_affected_package in sorted_affected_packages :
225- affected_fixed_by_matches = {
226- "affected_package" : sorted_affected_package ,
227- "matched_fixed_by_packages" : [],
228- }
229-
230- # Build the key to find matching group
231- key = (
232- sorted_affected_package .type ,
233- sorted_affected_package .namespace ,
234- sorted_affected_package .name ,
235- sorted_affected_package .qualifiers ,
236- sorted_affected_package .subpath ,
237- )
238-
239- # Get matching group from pre-grouped fixed_by_packages
240- matching_fixed_packages = grouped_fixed_by_packages .get (key , [])
241-
242- # Get version classes for comparison
243- affected_version_class = get_purl_version_class (sorted_affected_package )
244- affected_version = affected_version_class (sorted_affected_package .version )
245-
246- # Compare versions and filter valid matches
247- matched_fixed_by_packages = [
248- fixed_by_package .purl
249- for fixed_by_package in matching_fixed_packages
250- if get_purl_version_class (fixed_by_package )(fixed_by_package .version )
251- > affected_version
252- ]
253-
254- affected_fixed_by_matches ["matched_fixed_by_packages" ] = matched_fixed_by_packages
255- all_affected_fixed_by_matches .append (affected_fixed_by_matches )
256- return sorted_fixed_by_packages , sorted_affected_packages , all_affected_fixed_by_matches
257-
258193 def get_severity_vectors_and_values (self ):
259194 """
260195 Collect severity vectors and values, excluding EPSS scoring systems and handling errors gracefully.
0 commit comments