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
+ })