52
52
53
53
from scancodeio import SCAN_NOTICE
54
54
from 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
55
60
from scanpipe .pipes import docker
61
+ from scanpipe .pipes import flag
56
62
from scanpipe .pipes import spdx
57
63
58
64
scanpipe_app = apps .get_app_config ("scanpipe" )
@@ -67,17 +73,15 @@ def get_queryset(project, model_name):
67
73
"""Return a consistent QuerySet for all supported outputs (json, xlsx, csv, ...)"""
68
74
querysets = {
69
75
"discoveredpackage" : (
70
- project . discoveredpackages . all () .order_by (
76
+ DiscoveredPackage . objects .order_by (
71
77
"type" ,
72
78
"namespace" ,
73
79
"name" ,
74
80
"version" ,
75
81
)
76
82
),
77
83
"discovereddependency" : (
78
- project .discovereddependencies .all ()
79
- .prefetch_for_serializer ()
80
- .order_by (
84
+ DiscoveredDependency .objects .prefetch_for_serializer ().order_by (
81
85
"type" ,
82
86
"namespace" ,
83
87
"name" ,
@@ -86,14 +90,20 @@ def get_queryset(project, model_name):
86
90
)
87
91
),
88
92
"codebaseresource" : (
89
- project . codebaseresources .without_symlinks ().prefetch_for_serializer ()
93
+ CodebaseResource . objects .without_symlinks ().prefetch_for_serializer ()
90
94
),
91
95
"codebaserelation" : (
92
- project . codebaserelations .select_related ("from_resource" , "to_resource" )
96
+ CodebaseRelation . objects .select_related ("from_resource" , "to_resource" )
93
97
),
94
- "projectmessage" : project .projectmessages .all (),
98
+ "projectmessage" : ProjectMessage .objects .all (),
99
+ "todos" : CodebaseResource .objects .files ().status (flag .REQUIRES_REVIEW ),
95
100
}
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
97
107
98
108
99
109
def queryset_to_csv_file (queryset , fieldnames , output_file ):
@@ -295,7 +305,11 @@ def to_json(project):
295
305
296
306
297
307
def 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 ,
299
313
):
300
314
"""
301
315
Add a new worksheet to the ``workbook`` ``xlsxwriter.Workbook`` using the
@@ -310,7 +324,7 @@ def queryset_to_xlsx_worksheet(
310
324
311
325
model_class = queryset .model
312
326
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 )
314
328
315
329
fields = get_serializer_fields (model_class )
316
330
exclude_fields = exclude_fields or []
@@ -346,8 +360,12 @@ def _add_xlsx_worksheet(workbook, worksheet_name, rows, fields):
346
360
347
361
for row_index , record in enumerate (rows , start = 1 ):
348
362
row_errors = []
363
+ record_is_dict = isinstance (record , dict )
349
364
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 )
351
369
352
370
if not value :
353
371
continue
@@ -481,6 +499,12 @@ def to_xlsx(project):
481
499
if layers_data := docker .get_layers_data (project ):
482
500
_add_xlsx_worksheet (workbook , "LAYERS" , layers_data , docker .layer_fields )
483
501
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
+
484
508
return output_file
485
509
486
510
0 commit comments