diff --git a/LICENSE b/LICENSE index 3ffc5678..8410c200 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -643,7 +643,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -658,4 +658,4 @@ specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see -. \ No newline at end of file +. \ No newline at end of file diff --git a/report_qweb_parameter/README.rst b/report_qweb_parameter/README.rst new file mode 100644 index 00000000..e3659433 --- /dev/null +++ b/report_qweb_parameter/README.rst @@ -0,0 +1,65 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +===================== +Report QWeb Parameter +===================== + +This module allows you to add new parameters on QWeb reports. +Currently, we have defined a field maximum on a report and a validation of +maximal and minimal size. +It is useful on xml reports in order to validate length. +XML are sometimes XSD dependant and we must validate its format. +For example, in spanish facturae (http://www.facturae.gob.es/Paginas/Index.aspx), where +length and format must be validated in several fields in order to send an invoice. + + +Usage +===== + +#. Add a t-length attribute on report templates fields that will truncate the field +#. Add a t-minlength attribute on report template fields that will check the min length +#. Add a t-maxlength attribute on report template fields that will check the max length + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/143/11.0 + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Enric Tobella + + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/report_qweb_parameter/__init__.py b/report_qweb_parameter/__init__.py new file mode 100644 index 00000000..b44d7659 --- /dev/null +++ b/report_qweb_parameter/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/report_qweb_parameter/__manifest__.py b/report_qweb_parameter/__manifest__.py new file mode 100644 index 00000000..1d8d7060 --- /dev/null +++ b/report_qweb_parameter/__manifest__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Creu Blanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Report QWeb Parameter", + "version": "11.0.1.0.0", + "license": "AGPL-3", + "summary": """ + Add new parameters for qweb templates in order to reduce field length + and check minimal length + """, + "author": "Creu Blanca," + "Odoo Community Association (OCA)", + "website": "https://github.com/oca/reporting-engine", + "category": "Technical Settings", + "depends": [ + "web", + ], + "demo": [ + "demo/test_report_field_length.xml" + ], + "installable": True, +} diff --git a/report_qweb_parameter/demo/test_report_field_length.xml b/report_qweb_parameter/demo/test_report_field_length.xml new file mode 100644 index 00000000..2b127431 --- /dev/null +++ b/report_qweb_parameter/demo/test_report_field_length.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/report_qweb_parameter/models/__init__.py b/report_qweb_parameter/models/__init__.py new file mode 100644 index 00000000..dd58c12a --- /dev/null +++ b/report_qweb_parameter/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import ir_qweb diff --git a/report_qweb_parameter/models/ir_qweb.py b/report_qweb_parameter/models/ir_qweb.py new file mode 100644 index 00000000..67e80044 --- /dev/null +++ b/report_qweb_parameter/models/ir_qweb.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Creu Blanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models, _ +from odoo.exceptions import ValidationError + + +class IrQWeb(models.AbstractModel): + _inherit = 'ir.qweb' + + @staticmethod + def check_length(value, min_length=False, max_length=False): + if min_length and len(value) < min_length: + raise ValidationError( + _('Length cannot be less than %s') % str(min_length)) + if max_length and len(value) > max_length: + raise ValidationError( + _('Length cannot be more than %s') % str(max_length)) + return value + + def _compile_directive_esc(self, el, options): + min_value = el.attrib.pop('t-minlength', False) + max_value = el.attrib.pop('t-maxlength', False) + if min_value or max_value: + el.attrib['t-esc'] = 'docs.env["ir.qweb"].check_length(' + \ + el.attrib['t-esc'] + ', ' + \ + (min_value or 'False') + ', ' + \ + (max_value or 'False') + ')' + if 't-length' in el.attrib: + length = el.attrib.pop('t-length') + el.attrib['t-esc'] = '(' + el.attrib[ + 't-esc'] + ')[:' + length + ']' + return super(IrQWeb, self)._compile_directive_esc(el, options) + + def _compile_directive_raw(self, el, options): + min_value = el.attrib.pop('t-minlength', False) + max_value = el.attrib.pop('t-maxlength', False) + if min_value or max_value: + el.attrib['t-raw'] = 'docs.env["ir.qweb"].check_length(' + \ + el.attrib['t-raw'] + ', ' + \ + (min_value or 'False') + ', ' + \ + (max_value or 'False') + ')' + if 't-length' in el.attrib: + length = el.attrib.pop('t-length') + el.attrib['t-raw'] = el.attrib['t-raw'] + '[:' + length + ']' + return super(IrQWeb, self)._compile_directive_raw(el, options) diff --git a/report_qweb_parameter/static/description/icon.png b/report_qweb_parameter/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/report_qweb_parameter/static/description/icon.png differ diff --git a/report_qweb_parameter/tests/__init__.py b/report_qweb_parameter/tests/__init__.py new file mode 100644 index 00000000..e6422248 --- /dev/null +++ b/report_qweb_parameter/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_report_qweb_parameter diff --git a/report_qweb_parameter/tests/test_report_qweb_parameter.py b/report_qweb_parameter/tests/test_report_qweb_parameter.py new file mode 100644 index 00000000..510770ab --- /dev/null +++ b/report_qweb_parameter/tests/test_report_qweb_parameter.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Creu Blanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import xml.etree.ElementTree as ET + +from odoo.addons.base.ir.ir_qweb import QWebException +from odoo.tests import common + + +class TestReportQWebParameter(common.TransactionCase): + def test_qweb_parameter(self): + report_name = 'report_qweb_parameter.test_report_length' + report_obj = self.env['ir.actions.report'] + report_object = report_obj._get_report_from_name(report_name) + + docs = self.env['res.company'].search([], limit=1) + vat = docs.vat + website = docs.website + street = docs.street + company_registry = docs.company_registry + docs.update({ + 'street': '12345678901', + 'vat': '12345678901', + 'website': '1234567890', + 'company_registry': '1234567890' + }) + rep = report_object.render(docs.ids, False) + root = ET.fromstring(rep[0]) + self.assertEqual(root[0].text, "1234567890") + self.assertEqual(root[2].text, "1234567890") + docs.update({'street': '123456789'}) + with self.assertRaises(QWebException): + report_object.render(docs.ids, False) + docs.update({'street': '1234567890', 'vat': '123456789'}) + with self.assertRaises(QWebException): + report_object.render(docs.ids, False) + docs.update({'vat': '1234567890', 'website': '12345678901'}) + with self.assertRaises(QWebException): + report_object.render(docs.ids, False) + docs.update( + {'website': '1234567890', 'company_registry': '12345678901'}) + with self.assertRaises(QWebException): + report_object.render(docs.ids, False) + docs.update({ + 'street': street, + 'vat': vat, + 'website': website, + 'company_registry': company_registry + })