@@ -140,14 +140,15 @@ def resolve_datasource(self, datasource, report_filename, open_conns):
140
140
open_conns .append (conn )
141
141
return conn
142
142
143
- def compile_report (self , report_filename , fill_params , tmpdir , resources , permitted_resources , compile_subreport = False ):
143
+ def compile_report (self , report_filename , fill_params , tmpdir , resources , permitted_resources , single_report , compile_subreport = False ):
144
144
""" Compile a report (or subreport), resolving the datasource, mapping parameter values, and processing permitted subreports.
145
145
146
146
:param report_filename str: The filename of the jrxml report source
147
147
:param fill_params dict: Report fill parameters
148
148
:param tmpdir str: Tempdir in which to write processed .jrxml sources and compiled .jasper reports
149
149
:param resources dict: Resource configuration
150
150
:param permitted_resources list: List of permitted resources
151
+ :param single_report bool: Whether to produce single report, passing the array of feature IDs, instead of producing one report per feature
151
152
:param compile_subreport bool: Whether a subreport is being compiled
152
153
"""
153
154
@@ -227,11 +228,14 @@ def compile_report(self, report_filename, fill_params, tmpdir, resources, permit
227
228
fill_params [data_param ] = [fill_params [data_param ]]
228
229
229
230
# Iterate over parameters, try to map parameters
231
+ data_param_nested_class = None
230
232
parameters = root .findall (".//jasper:parameter" , namespace )
231
233
for parameter in parameters :
232
234
parameterName = parameter .get ("name" )
233
235
if parameterName in fill_params :
234
236
parameterClass = parameter .get ("class" )
237
+ if parameterName == data_param :
238
+ data_param_nested_class = parameter .get ("nestedType" )
235
239
if isinstance (fill_params [parameterName ], list ):
236
240
try :
237
241
fill_params [parameterName ] = [jpype .JClass (parameterClass )(value ) for value in fill_params [parameterName ]]
@@ -257,7 +261,7 @@ def compile_report(self, report_filename, fill_params, tmpdir, resources, permit
257
261
self .logger .info ("Subreport template %s" % subreport_template )
258
262
if os .path .exists (subreport_filename ):
259
263
if subreport_template in permitted_resources :
260
- subreport_result = self .compile_report (subreport_filename , fill_params , tmpdir , resources , permitted_resources , True )
264
+ subreport_result = self .compile_report (subreport_filename , fill_params , tmpdir , resources , permitted_resources , single_report , True )
261
265
if not subreport_result :
262
266
self .logger .info ("Failed to compile subreport %s" % subreport_filename )
263
267
subreportExpression .text = ""
@@ -298,9 +302,16 @@ def compile_report(self, report_filename, fill_params, tmpdir, resources, permit
298
302
jasperReport = self .JasperCompileManager .getInstance (self .jContext ).compile (temp_report_filename )
299
303
jasperPrints = self .ArrayList ()
300
304
if data_param is not None and data_param in fill_params :
301
- feature_ids = fill_params [data_param ]
302
- for feature_id in feature_ids :
303
- fill_params [data_param ] = feature_id
305
+ if not single_report :
306
+ feature_ids = fill_params [data_param ]
307
+ for feature_id in feature_ids :
308
+ fill_params [data_param ] = feature_id
309
+ jasperPrints .add (self .SimpleExporterInputItem (self .JasperFillManager .getInstance (self .jContext ).fill (jasperReport , fill_params , conn )))
310
+ else :
311
+ data_param_list = self .ArrayList ()
312
+ for value in fill_params [data_param ]:
313
+ data_param_list .add (jpype .JClass (data_param_nested_class )(value ))
314
+ fill_params [data_param ] = data_param_list
304
315
jasperPrints .add (self .SimpleExporterInputItem (self .JasperFillManager .getInstance (self .jContext ).fill (jasperReport , fill_params , conn )))
305
316
else :
306
317
jasperPrints .add (self .SimpleExporterInputItem (self .JasperFillManager .getInstance (self .jContext ).fill (jasperReport , fill_params , conn )))
@@ -384,6 +395,12 @@ def get_document(self, config, permitted_resources, tenant, template, fill_param
384
395
# Set the tenant in fill_params
385
396
fill_params ["TENANT" ] = tenant
386
397
398
+ # Read/clear single_report param
399
+ if "single_report" in fill_params :
400
+ single_report = fill_params .get ("single_report" , "" ).lower () in ["1" ,"true" ]
401
+ del fill_params ["single_report" ]
402
+
403
+
387
404
tmpdir = tempfile .mkdtemp ()
388
405
389
406
# Set virtualizer in fill_params
@@ -399,7 +416,7 @@ def get_document(self, config, permitted_resources, tenant, template, fill_param
399
416
fill_params [self .JRParameter .REPORT_VIRTUALIZER ] = virtualizer
400
417
401
418
# Compile report
402
- jasperPrints = self .compile_report (report_filename , fill_params , tmpdir , resources , permitted_resources )
419
+ jasperPrints = self .compile_report (report_filename , fill_params , tmpdir , resources , permitted_resources , single_report )
403
420
shutil .rmtree (tmpdir )
404
421
405
422
if jasperPrints is None :
0 commit comments