Skip to content

Commit 42beb86

Browse files
JordiBForgeFlowsbidoul
authored andcommitted
[MIG][11.0] mis_builder
1 parent 77b209b commit 42beb86

23 files changed

+322
-339
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ addons:
77
packages:
88
- expect-dev # provides unbuffer utility
99
- python-lxml # because pip installation is slow
10-
10+
- pdftk # required in reporting-engine repo
1111

1212
language: python
1313

README.md

-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
Management Information System reports for Odoo: easily build super fast,
88
beautiful, custom reports such as P&L, Balance Sheets and more.
99

10-
**Odoo 11.0 is not supported yet, nothing to see here for now.**
11-
1210
**This is the 11.0 branch. Please note the development of new features occurs mainly on
1311
the 10.0 branch, to be forward-ported to 11.0. Please submit pull requests to the 10.0
1412
branch in priority, unless they are 11.0 specific bugs, or they rely on

mis_builder/__manifest__.py

+4-7
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@
44

55
{
66
'name': 'MIS Builder',
7-
'version': '10.0.3.1.1',
7+
'version': '11.0.3.1.1',
88
'category': 'Reporting',
99
'summary': """
1010
Build 'Management Information System' Reports and Dashboards
1111
""",
12-
'author': 'ACSONE SA/NV,'
13-
'Odoo Community Association (OCA)',
12+
'author': 'ACSONE SA/NV, Odoo Community Association (OCA)',
1413
'website': 'https://github.com/OCA/mis-builder/',
1514
'depends': [
1615
'account',
@@ -29,11 +28,9 @@
2928
'security/mis_builder_security.xml',
3029
'report/mis_report_instance_qweb.xml',
3130
'report/mis_report_instance_xlsx.xml',
31+
'views/mis_report_template.xml',
3232
],
33-
'qweb': [
34-
'static/src/xml/*.xml'
35-
],
36-
'installable': False,
33+
'installable': True,
3734
'application': True,
3835
'license': 'AGPL-3',
3936
}

mis_builder/datas/ir_cron.xml

+2-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77
<field name="interval_type">hours</field>
88
<field name="numbercall">-1</field>
99
<field eval="False" name="doall"/>
10-
<field eval="'mis.report.instance'" name="model"/>
11-
<field eval="'_vacuum_report'" name="function"/>
12-
<field eval="'(24,)'" name="args"/>
10+
<field ref="model_mis_report_instance" name="model_id"/>
11+
<field name="code">model._vacuum_report(24, 0)</field>
1312
<field name="active" eval="True" />
1413
</record>
1514

mis_builder/models/mis_kpi_data.py

+14-4
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,26 @@ class MisKpiData(models.AbstractModel):
4141
amount = fields.Float(
4242
)
4343
seq1 = fields.Integer(
44-
related='kpi_expression_id.kpi_id.sequence',
45-
store=True,
44+
compute='_compute_seq',
4645
readonly=True,
4746
)
4847
seq2 = fields.Integer(
49-
related='kpi_expression_id.subkpi_id.sequence',
50-
store=True,
48+
compute='_compute_seq',
5149
readonly=True,
5250
)
5351

52+
@api.depends('kpi_expression_id.kpi_id.sequence',
53+
'kpi_expression_id.subkpi_id.sequence')
54+
def _compute_seq(self):
55+
for rec in self:
56+
seq1 = rec.kpi_expression_id.kpi_id.sequence
57+
if seq1:
58+
rec.seq1 = seq1
59+
60+
seq2 = rec.kpi_expression_id.subkpi_id.sequence
61+
if seq2:
62+
rec.seq2 = seq2
63+
5464
@api.depends('kpi_expression_id.subkpi_id.name',
5565
'kpi_expression_id.kpi_id.name',
5666
'date_from',

mis_builder/models/mis_report_instance.py

+50-20
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99

1010
from odoo import api, fields, models, _
1111
from odoo.exceptions import ValidationError, UserError
12+
from odoo.tools.safe_eval import safe_eval
1213

1314
from .aep import AccountingExpressionProcessor as AEP
1415

16+
1517
_logger = logging.getLogger(__name__)
1618

1719

@@ -431,6 +433,30 @@ def _default_company_id(self):
431433
date_from = fields.Date(string="From")
432434
date_to = fields.Date(string="To")
433435
temporary = fields.Boolean(default=False)
436+
mis_report_view = fields.Text(string='MIS Report view',
437+
compute='_compute_mis_report_view')
438+
439+
def _compute_mis_report_view(self):
440+
"""This method is dummy because we use this field as a placeholder
441+
to render the actual mis report instance in the html format using the
442+
widget"""
443+
for rec in self:
444+
rec.mis_report_view = ""
445+
446+
@api.model
447+
def get_mis_report_view_html(self):
448+
mis_report_data = self.compute()
449+
rcontext = {}
450+
rcontext['mis_report_data'] = mis_report_data
451+
rcontext['mis_report_data']['report_name'] = self.name
452+
rcontext['mis_instance_id'] = self.id
453+
return self.env.ref(
454+
'mis_builder.MisReportInstance').render(rcontext)
455+
456+
@api.multi
457+
def get_mis_report_view_from_id(self):
458+
for rec in self:
459+
return rec.get_mis_report_view_html()
434460

435461
@api.onchange('company_id', 'multi_company')
436462
def _onchange_company(self):
@@ -527,43 +553,31 @@ def _onchange_dates(self):
527553
self.date_to != self.date_range_id.date_end:
528554
self.date_range_id = False
529555

530-
@api.multi
531-
def preview(self):
532-
self.ensure_one()
533-
view_id = self.env.ref('mis_builder.'
534-
'mis_report_instance_result_view_form')
535-
return {
536-
'type': 'ir.actions.act_window',
537-
'res_model': 'mis.report.instance',
538-
'res_id': self.id,
539-
'view_mode': 'form',
540-
'view_type': 'form',
541-
'view_id': view_id.id,
542-
'target': 'current',
543-
}
544-
545556
@api.multi
546557
def print_pdf(self):
547558
self.ensure_one()
559+
context = dict(self.env.context, active_ids=self.ids)
548560
return {
549561
'name': 'MIS report instance QWEB PDF report',
550562
'model': 'mis.report.instance',
551-
'type': 'ir.actions.report.xml',
563+
'type': 'ir.actions.report',
552564
'report_name': 'mis_builder.report_mis_report_instance',
553565
'report_type': 'qweb-pdf',
554-
'context': self.env.context,
566+
'context': context,
555567
}
556568

557569
@api.multi
558570
def export_xls(self):
559571
self.ensure_one()
572+
context = dict(self.env.context, active_ids=self.ids)
560573
return {
561574
'name': 'MIS report instance XLSX report',
562575
'model': 'mis.report.instance',
563-
'type': 'ir.actions.report.xml',
564-
'report_name': 'mis.report.instance.xlsx',
576+
'type': 'ir.actions.report',
577+
'report_name': 'mis_builder.mis_report_instance_xlsx',
565578
'report_type': 'xlsx',
566-
'context': self.env.context,
579+
'report_file': 'mis_report_instance',
580+
'context': context,
567581
}
568582

569583
@api.multi
@@ -675,6 +689,21 @@ def _compute_matrix(self):
675689
kpi_matrix.compute_sums()
676690
return kpi_matrix
677691

692+
@api.multi
693+
def preview(self):
694+
self.ensure_one()
695+
view_id = self.env.ref('mis_builder.'
696+
'mis_report_instance_result_view_form')
697+
return {
698+
'type': 'ir.actions.act_window',
699+
'res_model': 'mis.report.instance',
700+
'res_id': self.id,
701+
'view_mode': 'form',
702+
'view_type': 'form',
703+
'view_id': view_id.id,
704+
'target': 'current',
705+
}
706+
678707
@api.multi
679708
def compute(self):
680709
self.ensure_one()
@@ -684,6 +713,7 @@ def compute(self):
684713
@api.multi
685714
def drilldown(self, arg):
686715
self.ensure_one()
716+
arg = safe_eval(arg)
687717
period_id = arg.get('period_id')
688718
expr = arg.get('expr')
689719
account_id = arg.get('account_id')

mis_builder/report/mis_report_instance_qweb.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010

1111

1212
class Report(models.Model):
13-
_inherit = "report"
13+
_inherit = "ir.actions.report"
1414

15-
@api.model
16-
def get_pdf(self, docids, report_name, html=None, data=None):
15+
@api.multi
16+
def render_qweb_pdf(self, res_ids=None, data=None):
1717
ctx = self.env.context.copy()
18-
if docids:
19-
report = self._get_report_from_name(report_name)
20-
obj = self.env[report.model].browse(docids)[0]
18+
if res_ids:
19+
obj = self.env[self.model].browse(res_ids)[0]
2120
if hasattr(obj, 'landscape_pdf') and obj.landscape_pdf:
2221
ctx.update({'landscape': True})
23-
return super(Report, self.with_context(ctx)).get_pdf(
24-
docids, report_name, html=html, data=data)
22+
return super(Report, self.with_context(ctx)).render_qweb_pdf(
23+
res_ids, data
24+
)

mis_builder/report/mis_report_instance_qweb.xml

+6-12
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,28 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<odoo>
33

4-
<record id="qweb_pdf_export" model="ir.actions.report.xml">
4+
<record id="qweb_pdf_export" model="ir.actions.report">
55
<field name="name">MIS report instance QWEB PDF report</field>
66
<field name="model">mis.report.instance</field>
7-
<field name="type">ir.actions.report.xml</field>
7+
<field name="type">ir.actions.report</field>
88
<field name="report_name">mis_builder.report_mis_report_instance</field>
99
<field name="report_type">qweb-pdf</field>
10-
<field name="auto" eval="False"/>
1110
</record>
12-
13-
<template id="assets_report" inherit_id="report.assets_common">
14-
<xpath expr="." position="inside">
15-
<link href="/mis_builder/static/src/css/report.css" rel="stylesheet"/>
16-
</xpath>
17-
</template>
18-
11+
1912
<!--
2013
TODO we use divs with css table layout, but this has drawbacks:
2114
(bad layout of first column, no colspan for first header row),
2215
consider getting back to a plain HTML table.
2316
-->
2417

2518
<template id="report_mis_report_instance">
26-
<t t-call="report.html_container">
19+
<t t-call="web.html_container">
2720
<t t-foreach="docs" t-as="o">
28-
<t t-call="report.internal_layout">
21+
<t t-call="web.internal_layout">
2922
<t t-set="matrix" t-value="o._compute_matrix()"/>
3023
<t t-set="style_obj" t-value="o.env['mis.report.style']"/>
3124
<div class="page">
25+
<link href="/mis_builder/static/src/css/report.css" rel="stylesheet"/>
3226
<h3><span t-field="o.name" /><span> - </span>
3327
<t t-foreach="o.query_company_ids" t-as="company">
3428
<span t-field="company.name" /><span t-if="company != o.query_company_ids[-1]">, </span>

mis_builder/report/mis_report_instance_xlsx.py

+4-20
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,23 @@
66
import logging
77
import numbers
88

9-
from odoo.report import report_sxw
9+
from odoo import models
1010

1111
from ..models.accounting_none import AccountingNone
1212
from ..models.data_error import DataError
1313

1414
_logger = logging.getLogger(__name__)
1515

16-
try:
17-
from odoo.addons.report_xlsx.report.report_xlsx import ReportXlsx
18-
except ImportError:
19-
_logger.debug("report_xlsx not installed, Excel export non functional")
20-
21-
class ReportXlsx(object):
22-
def __init__(self, *args, **kwargs):
23-
pass
24-
2516

2617
ROW_HEIGHT = 15 # xlsxwriter units
2718
COL_WIDTH = 0.9 # xlsxwriter units
2819
MIN_COL_WIDTH = 10 # characters
2920
MAX_COL_WIDTH = 50 # characters
3021

3122

32-
class MisBuilderXlsx(ReportXlsx):
33-
34-
def __init__(self, name, table, rml=False, parser=False, header=True,
35-
store=False):
36-
super(MisBuilderXlsx, self).__init__(
37-
name, table, rml, parser, header, store)
23+
class MisBuilderXlsx(models.AbstractModel):
24+
_name = 'report.mis_builder.mis_report_instance_xlsx'
25+
_inherit = 'report.report_xlsx.abstract'
3826

3927
def generate_xlsx_report(self, workbook, data, objects):
4028

@@ -144,7 +132,3 @@ def generate_xlsx_report(self, workbook, data, objects):
144132
min_col_pos = min(col_width.keys())
145133
max_col_pos = max(col_width.keys())
146134
sheet.set_column(min_col_pos, max_col_pos, data_col_width * COL_WIDTH)
147-
148-
149-
MisBuilderXlsx('report.mis.report.instance.xlsx',
150-
'mis.report.instance', parser=report_sxw.rml_parse)
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<odoo>
33

4-
<record id="xls_export" model="ir.actions.report.xml">
5-
<field name="name">MIS report instance XLS report</field>
6-
<field name="model">mis.report.instance</field>
7-
<field name="type">ir.actions.report.xml</field>
8-
<field name="report_name">mis.report.instance.xlsx</field>
9-
<field name="report_type">xlsx</field>
10-
<field name="auto" eval="False"/>
4+
<record id="xls_export" model="ir.actions.report">
5+
<field name="name">MIS report instance XLS report</field>
6+
<field name="model">mis.report.instance</field>
7+
<field name="type">ir.actions.report</field>
8+
<field name="report_name">mis_builder.mis_report_instance_xlsx</field>
9+
<field name="report_type">xlsx</field>
10+
<field name="report_file">mis_report_instance</field>
1111
</record>
1212

1313
</odoo>

0 commit comments

Comments
 (0)