5252
5353from scancodeio import SCAN_NOTICE
5454from scancodeio import __version__ as scancodeio_version
55+ from scanpipe .models import CodebaseRelation
56+ from scanpipe .models import CodebaseResource
57+ from scanpipe .models import DiscoveredDependency
58+ from scanpipe .models import DiscoveredPackage
59+ from scanpipe .models import ProjectMessage
5560from scanpipe .pipes import docker
61+ from scanpipe .pipes import flag
5662from scanpipe .pipes import spdx
5763
5864scanpipe_app = apps .get_app_config ("scanpipe" )
@@ -67,17 +73,15 @@ def get_queryset(project, model_name):
6773 """Return a consistent QuerySet for all supported outputs (json, xlsx, csv, ...)"""
6874 querysets = {
6975 "discoveredpackage" : (
70- project . discoveredpackages . all () .order_by (
76+ DiscoveredPackage . objects .order_by (
7177 "type" ,
7278 "namespace" ,
7379 "name" ,
7480 "version" ,
7581 )
7682 ),
7783 "discovereddependency" : (
78- project .discovereddependencies .all ()
79- .prefetch_for_serializer ()
80- .order_by (
84+ DiscoveredDependency .objects .prefetch_for_serializer ().order_by (
8185 "type" ,
8286 "namespace" ,
8387 "name" ,
@@ -86,14 +90,20 @@ def get_queryset(project, model_name):
8690 )
8791 ),
8892 "codebaseresource" : (
89- project . codebaseresources .without_symlinks ().prefetch_for_serializer ()
93+ CodebaseResource . objects .without_symlinks ().prefetch_for_serializer ()
9094 ),
9195 "codebaserelation" : (
92- project . codebaserelations .select_related ("from_resource" , "to_resource" )
96+ CodebaseRelation . objects .select_related ("from_resource" , "to_resource" )
9397 ),
94- "projectmessage" : project .projectmessages .all (),
98+ "projectmessage" : ProjectMessage .objects .all (),
99+ "todos" : CodebaseResource .objects .files ().status (flag .REQUIRES_REVIEW ),
95100 }
96- return querysets .get (model_name )
101+
102+ queryset = querysets .get (model_name )
103+ if project :
104+ queryset = queryset .filter (project = project )
105+
106+ return queryset
97107
98108
99109def queryset_to_csv_file (queryset , fieldnames , output_file ):
@@ -295,7 +305,11 @@ def to_json(project):
295305
296306
297307def queryset_to_xlsx_worksheet (
298- queryset , workbook , exclude_fields = None , extra_fields = None
308+ queryset ,
309+ workbook ,
310+ exclude_fields = None ,
311+ extra_fields = None ,
312+ worksheet_name = None ,
299313):
300314 """
301315 Add a new worksheet to the ``workbook`` ``xlsxwriter.Workbook`` using the
@@ -310,7 +324,7 @@ def queryset_to_xlsx_worksheet(
310324
311325 model_class = queryset .model
312326 model_name = model_class ._meta .model_name
313- worksheet_name = model_name_to_worksheet_name .get (model_name )
327+ worksheet_name = worksheet_name or model_name_to_worksheet_name .get (model_name )
314328
315329 fields = get_serializer_fields (model_class )
316330 exclude_fields = exclude_fields or []
@@ -346,8 +360,12 @@ def _add_xlsx_worksheet(workbook, worksheet_name, rows, fields):
346360
347361 for row_index , record in enumerate (rows , start = 1 ):
348362 row_errors = []
363+ record_is_dict = isinstance (record , dict )
349364 for col_index , field in enumerate (fields ):
350- value = getattr (record , field )
365+ if record_is_dict :
366+ value = record .get (field )
367+ else :
368+ value = getattr (record , field )
351369
352370 if not value :
353371 continue
@@ -481,6 +499,12 @@ def to_xlsx(project):
481499 if layers_data := docker .get_layers_data (project ):
482500 _add_xlsx_worksheet (workbook , "LAYERS" , layers_data , docker .layer_fields )
483501
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+ )
507+
484508 return output_file
485509
486510
0 commit comments