Browse Source

[MIG] report_xml: Migration to 11.0

pull/168/head
Enric Tobella 7 years ago
committed by etobella
parent
commit
581eb52a08
No known key found for this signature in database GPG Key ID: 1A2546A1B7BA2451
  1. 11
      report_xml/README.rst
  2. 2
      report_xml/__init__.py
  3. 7
      report_xml/__manifest__.py
  4. 2
      report_xml/controllers/__init__.py
  5. 11
      report_xml/controllers/main.py
  6. 3
      report_xml/demo/report.xml
  7. 3
      report_xml/models/__init__.py
  8. 55
      report_xml/models/report_action.py
  9. 25
      report_xml/models/report_generator.py
  10. 41
      report_xml/static/src/js/report/qwebactionmanager.js
  11. 2
      report_xml/tests/__init__.py
  12. 17
      report_xml/tests/test_report_xml.py
  13. 8
      report_xml/views/report_xml_templates.xml
  14. 9
      report_xml/views/webclient_templates.xml

11
report_xml/README.rst

@ -1,5 +1,5 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg .. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3 :alt: License: AGPL-3
=========== ===========
@ -84,11 +84,4 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and mission is to support the collaborative development of Odoo features and
promote its widespread use. promote its widespread use.
To contribute to this module, please visit http://odoo-community.org.
.. _custom report: https://www.odoo.com/documentation/8.0/reference/reports.html#custom-reports
.. _instructions to create reports: https://www.odoo.com/documentation/8.0/reference/reports.html
.. _reporting-engine: https://github.com/OCA/reporting-engine
.. _sample module: https://github.com/OCA/reporting-engine/tree/8.0/report_xml_sample
.. _lxml: http://lxml.de/
To contribute to this module, please visit https://odoo-community.org.

2
report_xml/__init__.py

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
from . import controllers from . import controllers
from . import models from . import models

7
report_xml/__manifest__.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2014-2015 Grupo ESOC <www.grupoesoc.es> # Copyright (C) 2014-2015 Grupo ESOC <www.grupoesoc.es>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
{ {
"name": "XML Reports", "name": "XML Reports",
"version": "10.0.1.0.0",
"version": "11.0.1.0.0",
"category": "Reporting", "category": "Reporting",
"website": "https://github.com/OCA/reporting-engine", "website": "https://github.com/OCA/reporting-engine",
"author": "Grupo ESOC Ingeniería de Servicios, " "author": "Grupo ESOC Ingeniería de Servicios, "
@ -14,10 +14,11 @@
"application": False, "application": False,
"summary": "Allow to generate XML reports", "summary": "Allow to generate XML reports",
"depends": [ "depends": [
"report",
"web",
], ],
"data": [ "data": [
"views/report_xml_templates.xml", "views/report_xml_templates.xml",
"views/webclient_templates.xml",
], ],
"demo": [ "demo": [
"demo/report.xml", "demo/report.xml",

2
report_xml/controllers/__init__.py

@ -1,4 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
from . import main from . import main

11
report_xml/controllers/main.py

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2014-2015 Grupo ESOC <www.grupoesoc.es> # Copyright (C) 2014-2015 Grupo ESOC <www.grupoesoc.es>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
from odoo.addons.report.controllers import main as report
from odoo.addons.web.controllers import main as report
from odoo.http import route from odoo.http import route
@ -19,8 +19,9 @@ class ReportController(report.ReportController):
# XML header must be before any spaces, and it is a common error, # XML header must be before any spaces, and it is a common error,
# so let's fix that here and make developers happier # so let's fix that here and make developers happier
response.data = response.data.strip() response.data = response.data.strip()
# XML files should be downloaded
response.headers.set("Content-Type", "text/xml") response.headers.set("Content-Type", "text/xml")
response.headers.set('Content-length', len(response.data))
response.headers.set(
'Content-Disposition',
'attachment; filename="'+reportname+".xml")
return response return response

3
report_xml/demo/report.xml

@ -11,11 +11,12 @@
</root> </root>
</t> </t>
</template> </template>
<report id="demo_xml_report" <report id="demo_xml_report"
name="report_xml.demo_report_xml_view" name="report_xml.demo_report_xml_view"
string="Demo xml report" string="Demo xml report"
report_type="qweb-xml" report_type="qweb-xml"
print_report_name="'Demo xml report'"
file="report_xml.xml"
model="res.company"/> model="res.company"/>
</odoo> </odoo>

3
report_xml/models/__init__.py

@ -1,5 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
from . import report_action from . import report_action
from . import report_generator

55
report_xml/models/report_action.py

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2014-2015 Grupo ESOC <www.grupoesoc.es> # Copyright (C) 2014-2015 Grupo ESOC <www.grupoesoc.es>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
import logging import logging
@ -11,39 +11,30 @@ _logger = logging.getLogger(__name__)
class ReportAction(models.Model): class ReportAction(models.Model):
_inherit = "ir.actions.report.xml"
_inherit = "ir.actions.report"
report_type = fields.Selection(selection_add=[("qweb-xml", "XML")]) report_type = fields.Selection(selection_add=[("qweb-xml", "XML")])
def _lookup_report(self, name):
"""Enable ``qweb-xml`` report lookup."""
try:
return super(ReportAction, self)._lookup_report(name)
except Exception as ex:
# Somebody thought it was a good idea to use standard exceptions
if "qweb-xml" not in ex.message:
raise ex
else:
self._cr.execute(
"SELECT * FROM ir_act_report_xml WHERE report_name=%s",
(name,))
return self._cr.dictfetchone()["report_name"]
@api.model
def _get_report_from_name(self, report_name):
res = super(ReportAction, self)._get_report_from_name(report_name)
if res:
return res
report_obj = self.env['ir.actions.report']
qwebtypes = ['qweb-xml']
conditions = [('report_type', 'in', qwebtypes),
('report_name', '=', report_name)]
context = self.env['res.users'].context_get()
return report_obj.with_context(context).search(conditions, limit=1)
@api.model @api.model
def render_report(self, res_ids, name, data):
"""Special handling for ``qweb-xml`` reports."""
xml_report = self.search([('report_name', '=', name),
('report_type', '=', 'qweb-xml')], limit=1)
if xml_report:
xml_report = xml_report.ensure_one()
result = self.env["report"].get_html(res_ids,
xml_report.report_name,
data=data)
return (
etree.tostring(
etree.fromstring(result.strip()),
encoding='UTF-8', xml_declaration=True, pretty_print=True
), "xml")
else:
return super(ReportAction, self).render_report(
res_ids, name, data)
def render_qweb_xml(self, docids, data):
result = self.render_qweb_html(docids, data=data)
return etree.tostring(
etree.fromstring(
str(result[0], 'UTF-8').lstrip('\n').lstrip().encode('UTF-8')
),
encoding='UTF-8',
xml_declaration=True,
pretty_print=True
), "xml"

25
report_xml/models/report_generator.py

@ -1,25 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright (C) 2014-2015 Grupo ESOC <www.grupoesoc.es>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging
from odoo import api, models
_logger = logging.getLogger(__name__)
class ReportGenerator(models.Model):
_inherit = "report"
@api.model
def _get_report_from_name(self, report_name):
res = super(ReportGenerator, self)._get_report_from_name(report_name)
if res:
return res
report_obj = self.env['ir.actions.report.xml']
qwebtypes = ['qweb-xml']
conditions = [('report_type', 'in', qwebtypes),
('report_name', '=', report_name)]
context = self.env['res.users'].context_get()
return report_obj.with_context(context).search(conditions, limit=1)

41
report_xml/static/src/js/report/qwebactionmanager.js

@ -0,0 +1,41 @@
odoo.define('report_xml.report', function(require){
'use strict';
var ActionManager= require('web.ActionManager');
var crash_manager = require('web.crash_manager');
var framework = require('web.framework');
ActionManager.include({
ir_actions_report: function (action, options){
var self = this;
action = _.clone(action);
if (action.report_type === 'qweb-xml') {
framework.blockUI()
var report_xml_url = 'report/xml/' + action.report_name;
if(action.context.active_ids){
report_xml_url += '/' + action.context.active_ids.join(',');
}
else{
report_xml_url += '?options=' + encodeURIComponent(JSON.stringify(action.data));
report_xml_url += '&context=' + encodeURIComponent(JSON.stringify(action.context));
}
self.getSession().get_file({
url: report_xml_url,
data: {data: JSON.stringify([
report_xml_url,
action.report_type,
])},
error: crash_manager.rpc_error.bind(crash_manager),
success: function (){
if(action && options && !action.dialog){
options.on_close();
}
},
});
framework.unblockUI();
return
}
return self._super(action, options);
}
});
});

2
report_xml/tests/__init__.py

@ -1,4 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
from . import test_report_xml from . import test_report_xml

17
report_xml/tests/test_report_xml.py

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright 2017 Creu Blanca # Copyright 2017 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl).
from lxml import etree from lxml import etree
from odoo.tests import common from odoo.tests import common
@ -8,17 +8,12 @@ from odoo.tests import common
class TestXmlReport(common.TransactionCase): class TestXmlReport(common.TransactionCase):
def test_xml(self): def test_xml(self):
report_object = self.env['ir.actions.report.xml']
report_object = self.env['ir.actions.report']
report_name = 'report_xml.demo_report_xml_view' report_name = 'report_xml.demo_report_xml_view'
self.assertEqual(
report_name, report_object._lookup_report(report_name))
report = report_object._get_report_from_name(report_name)
docs = self.env['res.company'].search([], limit=1) docs = self.env['res.company'].search([], limit=1)
rep = report_object.render_report(
docs.ids, report_name, {}
)
self.assertEqual(report.report_type, 'qweb-xml')
rep = report.render(docs.ids, {})
root = etree.fromstring(rep[0]) root = etree.fromstring(rep[0])
el = root.xpath('/root/user/name') el = root.xpath('/root/user/name')
self.assertEqual(
el[0].text,
docs.ensure_one().name
)
self.assertEqual(el[0].text, docs.ensure_one().name)

8
report_xml/views/report_xml_templates.xml

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo> <odoo>
<template id="utf8_header">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
<t t-raw="0"/>
</template>
<template id="utf8_header">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
<t t-raw="0"/>
</template>
</odoo> </odoo>

9
report_xml/views/webclient_templates.xml

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<template id="report_xml.assets_backend" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/report_xml/static/src/js/report/qwebactionmanager.js"/>
</xpath>
</template>
</odoo>
Loading…
Cancel
Save