Skip to content

Commit ba28346

Browse files
committed
[IMP] mis_builder: allow to export multiple report in one xls
1 parent 6802866 commit ba28346

File tree

4 files changed

+68
-11
lines changed

4 files changed

+68
-11
lines changed

mis_builder/models/mis_report_instance.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,6 @@ def print_pdf(self):
781781
)
782782

783783
def export_xls(self):
784-
self.ensure_one()
785784
return self.env.ref("mis_builder.xls_export").report_action(
786785
self, data=dict(dummy=True)
787786
) # required to propagate context
@@ -1010,3 +1009,9 @@ def _compute_user_can_edit_annotation(self):
10101009
self.user_can_edit_annotation = self.env.user.has_group(
10111010
"mis_builder.group_edit_annotation"
10121011
)
1012+
def _get_xlsx_report_name(self):
1013+
self.ensure_one()
1014+
return "{} - {}".format(
1015+
self.name,
1016+
", ".join([a.name for a in self.query_company_ids]),
1017+
)

mis_builder/report/mis_report_instance_xlsx.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,19 @@ def _mis_builder_add_annotation(self, sheet, cell, row_pos, col_pos, notes):
3333
"""
3434
if cell and (annotation := notes.get(cell.cell_id, {}).get("text")):
3535
sheet.write_comment(row_pos, col_pos, annotation)
36+
37+
def _get_worksheet_name(self, mis_instance):
38+
return mis_instance._get_xlsx_report_name()[:31]
3639

37-
def generate_xlsx_report(self, workbook, data, objects):
40+
def _generate_xlsx_one_report(self, workbook, mis_instance):
3841
# get the computed result of the report
39-
matrix = objects._compute_matrix()
40-
notes = objects.get_notes_by_cell_id()
42+
matrix = mis_instance._compute_matrix()
43+
notes = mis_instance.get_notes_by_cell_id()
4144
style_obj = self.env["mis.report.style"]
4245

4346
# create worksheet
44-
report_name = "{} - {}".format(
45-
objects[0].name, ", ".join([a.name for a in objects[0].query_company_ids])
46-
)
47-
sheet = workbook.add_worksheet(report_name[:31])
47+
worksheet_name = self._get_worksheet_name(mis_instance)
48+
sheet = workbook.add_worksheet(worksheet_name)
4849
row_pos = 0
4950
col_pos = 0
5051
# width of the labels column
@@ -57,13 +58,14 @@ def generate_xlsx_report(self, workbook, data, objects):
5758
header_format = workbook.add_format(
5859
{"bold": True, "align": "center", "bg_color": "#F0EEEE"}
5960
)
61+
report_name = mis_instance._get_xlsx_report_name()
6062
sheet.write(row_pos, 0, report_name, bold)
6163
row_pos += 2
6264

6365
# filters
64-
filter_descriptions = objects.get_filter_descriptions()
66+
filter_descriptions = mis_instance.get_filter_descriptions()
6567
if filter_descriptions:
66-
for filter_description in objects.get_filter_descriptions():
68+
for filter_description in mis_instance.get_filter_descriptions():
6769
sheet.write(row_pos, 0, filter_description)
6870
row_pos += 1
6971
row_pos += 1
@@ -88,7 +90,9 @@ def generate_xlsx_report(self, workbook, data, objects):
8890
else:
8991
sheet.write(row_pos, col_pos, label, header_format)
9092
col_width[col_pos] = max(
91-
col_width[col_pos], len(col.label or ""), len(col.description or "")
93+
col_width[col_pos],
94+
len(col.label or ""),
95+
len(col.description or ""),
9296
)
9397
col_pos += col.colspan
9498
row_pos += 1
@@ -184,3 +188,9 @@ def generate_xlsx_report(self, workbook, data, objects):
184188
min_col_pos = min(col_width.keys())
185189
max_col_pos = max(col_width.keys())
186190
sheet.set_column(min_col_pos, max_col_pos, data_col_width * COL_WIDTH)
191+
192+
return sheet
193+
194+
def generate_xlsx_report(self, workbook, data, objects):
195+
for instance in objects:
196+
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)