Skip to content

Commit 8e6ee05

Browse files
committed
[IMP] mis_builder: allow to export multiple report in one xls
1 parent cc110d3 commit 8e6ee05

File tree

4 files changed

+69
-10
lines changed

4 files changed

+69
-10
lines changed

mis_builder/models/mis_report_instance.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,6 @@ def print_pdf(self):
770770
)
771771

772772
def export_xls(self):
773-
self.ensure_one()
774773
return self.env.ref("mis_builder.xls_export").report_action(
775774
self, data=dict(dummy=True)
776775
) # required to propagate context
@@ -940,3 +939,10 @@ def _get_drilldown_action_name(self, arg):
940939
return f"{kpi.description} - {account.display_name} - {period.display_name}"
941940
else:
942941
return f"{kpi.description} - {period.display_name}"
942+
943+
def _get_xlsx_report_name(self):
944+
self.ensure_one()
945+
return "{} - {}".format(
946+
self.name,
947+
", ".join([a.name for a in self.query_company_ids]),
948+
)

mis_builder/report/mis_report_instance_xlsx.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,18 @@ class MisBuilderXlsx(models.AbstractModel):
2626
_description = "MIS Builder XLSX report"
2727
_inherit = "report.report_xlsx.abstract"
2828

29-
def generate_xlsx_report(self, workbook, data, objects):
29+
def _get_worksheet_name(self, mis_instance):
30+
return mis_instance._get_xlsx_report_name()[:31]
31+
32+
def _generate_xlsx_one_report(self, workbook, mis_instance):
3033
# get the computed result of the report
31-
matrix = objects._compute_matrix()
34+
matrix = mis_instance._compute_matrix()
35+
3236
style_obj = self.env["mis.report.style"]
3337

3438
# create worksheet
35-
report_name = "{} - {}".format(
36-
objects[0].name, ", ".join([a.name for a in objects[0].query_company_ids])
37-
)
38-
sheet = workbook.add_worksheet(report_name[:31])
39+
worksheet_name = self._get_worksheet_name(mis_instance)
40+
sheet = workbook.add_worksheet(worksheet_name)
3941
row_pos = 0
4042
col_pos = 0
4143
# width of the labels column
@@ -48,13 +50,14 @@ def generate_xlsx_report(self, workbook, data, objects):
4850
header_format = workbook.add_format(
4951
{"bold": True, "align": "center", "bg_color": "#F0EEEE"}
5052
)
53+
report_name = mis_instance._get_xlsx_report_name()
5154
sheet.write(row_pos, 0, report_name, bold)
5255
row_pos += 2
5356

5457
# filters
55-
filter_descriptions = objects.get_filter_descriptions()
58+
filter_descriptions = mis_instance.get_filter_descriptions()
5659
if filter_descriptions:
57-
for filter_description in objects.get_filter_descriptions():
60+
for filter_description in mis_instance.get_filter_descriptions():
5861
sheet.write(row_pos, 0, filter_description)
5962
row_pos += 1
6063
row_pos += 1
@@ -79,7 +82,9 @@ def generate_xlsx_report(self, workbook, data, objects):
7982
else:
8083
sheet.write(row_pos, col_pos, label, header_format)
8184
col_width[col_pos] = max(
82-
col_width[col_pos], len(col.label or ""), len(col.description or "")
85+
col_width[col_pos],
86+
len(col.label or ""),
87+
len(col.description or ""),
8388
)
8489
col_pos += col.colspan
8590
row_pos += 1
@@ -174,3 +179,9 @@ def generate_xlsx_report(self, workbook, data, objects):
174179
min_col_pos = min(col_width.keys())
175180
max_col_pos = max(col_width.keys())
176181
sheet.set_column(min_col_pos, max_col_pos, data_col_width * COL_WIDTH)
182+
183+
return sheet
184+
185+
def generate_xlsx_report(self, workbook, data, objects):
186+
for instance in objects:
187+
self._generate_xlsx_one_report(workbook, instance)

mis_builder/report/mis_report_instance_xlsx.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,15 @@
88
<field name="report_type">xlsx</field>
99
<field name="report_file">mis_report_instance</field>
1010
</record>
11+
12+
<record model="ir.actions.server" id="mis_builder_print_xls_report">
13+
<field name="name">Export XLS</field>
14+
<field name="model_id" ref="mis_builder.model_mis_report_instance" />
15+
<field name="binding_model_id" ref="mis_builder.model_mis_report_instance" />
16+
<field name="binding_view_types">list</field>
17+
<field name="state">code</field>
18+
<field name="code">
19+
action = records.export_xls()
20+
</field>
21+
</record>
1122
</odoo>

mis_builder/tests/test_mis_report_instance.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,27 @@ def setUp(self):
355355
)
356356
)
357357

358+
# create a duplicate of first instance with different period
359+
self.report_instance_4 = self.env["mis.report.instance"].create(
360+
dict(
361+
name="test instance",
362+
report_id=self.report.id,
363+
company_id=self.env.ref("base.main_company").id,
364+
period_ids=[
365+
(
366+
0,
367+
0,
368+
dict(
369+
name="p2",
370+
mode="fix",
371+
manual_date_from="2015-01-01",
372+
manual_date_to="2015-12-31",
373+
),
374+
),
375+
],
376+
)
377+
)
378+
358379
def test_compute(self):
359380
matrix = self.report_instance._compute_matrix()
360381
for row in matrix.iter_rows():
@@ -512,6 +533,16 @@ def test_xlsx(self):
512533
report_type="xlsx",
513534
)
514535

536+
def test_xlsx_multiple_instances(self):
537+
self.report_instance.export_xls() # get action
538+
test_reports.try_report(
539+
self.env.cr,
540+
self.env.uid,
541+
"mis_builder.mis_report_instance_xlsx",
542+
[self.report_instance.id, self.report_instance_4.id],
543+
report_type="xlsx",
544+
)
545+
515546
def test_get_kpis_by_account_id(self):
516547
account_ids = (
517548
self.env["account.account"]

0 commit comments

Comments
 (0)