@@ -101,7 +101,7 @@ def get_queryset(project, model_name):
101
101
102
102
queryset = querysets .get (model_name )
103
103
if project :
104
- queryset = queryset .filter ( project = project )
104
+ queryset = queryset .project ( project )
105
105
106
106
return queryset
107
107
@@ -303,6 +303,14 @@ def to_json(project):
303
303
"projectmessage" : "MESSAGES" ,
304
304
}
305
305
306
+ model_name_to_object_type = {
307
+ "discoveredpackage" : "package" ,
308
+ "discovereddependency" : "dependency" ,
309
+ "codebaseresource" : "resource" ,
310
+ "codebaserelation" : "relation" ,
311
+ "projectmessage" : "message" ,
312
+ }
313
+
306
314
307
315
def queryset_to_xlsx_worksheet (
308
316
queryset ,
@@ -333,15 +341,15 @@ def queryset_to_xlsx_worksheet(
333
341
if prepend_fields :
334
342
fields = prepend_fields + fields
335
343
336
- return _add_xlsx_worksheet (
344
+ return add_xlsx_worksheet (
337
345
workbook = workbook ,
338
346
worksheet_name = worksheet_name ,
339
347
rows = queryset ,
340
348
fields = fields ,
341
349
)
342
350
343
351
344
- def _add_xlsx_worksheet (workbook , worksheet_name , rows , fields ):
352
+ def add_xlsx_worksheet (workbook , worksheet_name , rows , fields ):
345
353
"""
346
354
Add a new ``worksheet_name`` worksheet to the ``workbook``
347
355
``xlsxwriter.Workbook``. Write the iterable of ``rows`` objects using their
@@ -478,6 +486,7 @@ def to_xlsx(project):
478
486
"license_detections" ,
479
487
"other_license_detections" ,
480
488
"license_clues" ,
489
+ "affected_by_vulnerabilities" ,
481
490
]
482
491
483
492
if not project .policies_enabled :
@@ -497,17 +506,79 @@ def to_xlsx(project):
497
506
queryset_to_xlsx_worksheet (queryset , workbook , exclude_fields )
498
507
499
508
if layers_data := docker .get_layers_data (project ):
500
- _add_xlsx_worksheet (workbook , "LAYERS" , layers_data , docker .layer_fields )
509
+ add_xlsx_worksheet (workbook , "LAYERS" , layers_data , docker .layer_fields )
501
510
502
- todos_queryset = get_queryset (project , "todos" )
503
- if todos_queryset :
504
- queryset_to_xlsx_worksheet (
505
- todos_queryset , workbook , exclude_fields , worksheet_name = "TODOS"
506
- )
511
+ add_vulnerabilities_sheet (workbook , project )
512
+ add_todos_sheet (workbook , project , exclude_fields )
507
513
508
514
return output_file
509
515
510
516
517
+ def add_vulnerabilities_sheet (workbook , project ):
518
+ vulnerable_packages_queryset = (
519
+ DiscoveredPackage .objects .project (project )
520
+ .vulnerable ()
521
+ .only_package_url_fields (extra = ["affected_by_vulnerabilities" ])
522
+ .order_by_package_url ()
523
+ )
524
+ vulnerable_dependencies_queryset = (
525
+ DiscoveredDependency .objects .project (project )
526
+ .vulnerable ()
527
+ .only_package_url_fields (extra = ["affected_by_vulnerabilities" ])
528
+ .order_by_package_url ()
529
+ )
530
+ vulnerable_querysets = [
531
+ vulnerable_packages_queryset ,
532
+ vulnerable_dependencies_queryset ,
533
+ ]
534
+
535
+ vulnerability_fields = [
536
+ "vulnerability_id" ,
537
+ "aliases" ,
538
+ "summary" ,
539
+ "risk_score" ,
540
+ "exploitability" ,
541
+ "weighted_severity" ,
542
+ "resource_url" ,
543
+ ]
544
+ sheet_fields = ["object_type" , "package_url" ] + vulnerability_fields
545
+
546
+ rows = []
547
+ for queryset in vulnerable_querysets :
548
+ model_name = queryset .model ._meta .model_name
549
+ object_type = model_name_to_object_type .get (model_name )
550
+
551
+ for package in queryset :
552
+ package_url = package .package_url
553
+
554
+ for vulnerability_data in package .affected_by_vulnerabilities :
555
+ row = {
556
+ "object_type" : object_type ,
557
+ "package_url" : package_url ,
558
+ ** {
559
+ field_name : vulnerability_data .get (field_name , "" )
560
+ for field_name in vulnerability_fields
561
+ },
562
+ }
563
+ rows .append (row )
564
+
565
+ if rows :
566
+ add_xlsx_worksheet (
567
+ workbook = workbook ,
568
+ worksheet_name = "VULNERABILITIES" ,
569
+ rows = rows ,
570
+ fields = sheet_fields ,
571
+ )
572
+
573
+
574
+ def add_todos_sheet (workbook , project , exclude_fields ):
575
+ todos_queryset = get_queryset (project , "todos" )
576
+ if todos_queryset :
577
+ queryset_to_xlsx_worksheet (
578
+ todos_queryset , workbook , exclude_fields , worksheet_name = "TODOS"
579
+ )
580
+
581
+
511
582
def _get_spdx_extracted_licenses (license_expressions ):
512
583
"""
513
584
Generate and return the SPDX `extracted_licenses` from provided
0 commit comments