Browse Source

[ADD] report_field_length

pull/146/head
etobella 7 years ago
committed by Enric Tobella
parent
commit
1054078932
  1. 65
      report_qweb_parameter/README.rst
  2. 4
      report_qweb_parameter/__init__.py
  3. 27
      report_qweb_parameter/__manifest__.py
  4. 25
      report_qweb_parameter/demo/test_report_field_length.xml
  5. 4
      report_qweb_parameter/models/__init__.py
  6. 47
      report_qweb_parameter/models/ir_qweb.py
  7. BIN
      report_qweb_parameter/static/description/icon.png
  8. 4
      report_qweb_parameter/tests/__init__.py
  9. 50
      report_qweb_parameter/tests/test_report_qweb_parameter.py

65
report_qweb_parameter/README.rst

@ -0,0 +1,65 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://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/10.0
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/reporting-engine/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 <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
Contributors
------------
* Enric Tobella <etobella@creublanca.es>
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.

4
report_qweb_parameter/__init__.py

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

27
report_qweb_parameter/__manifest__.py

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
# noinspection PyStatementEffect
{
"name": "Report QWeb Parameter",
"version": "10.0.1.0.1",
"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": [
"report",
],
"data": [
],
"demo": [
"demo/test_report_field_length.xml"
],
"installable": True,
}

25
report_qweb_parameter/demo/test_report_field_length.xml

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<report
id="test_report_length_report_id"
model="res.company"
string="Length Report"
report_type="qweb-pdf"
name="report_qweb_parameter.test_report_length"
/>
<template id="test_report_length">
<t t-call="report.html_container">
<li name="esc_length" t-minlength="10" t-length="10"
t-esc="docs[0].fax" t-if="docs[0].fax"/>
<li name="esc_maxlength" t-maxlength="10"
t-esc="docs[0].website" t-if="docs[0].website"/>
<li name="raw_length" t-minlength="10" t-length="10"
t-raw="docs[0].vat" t-if="docs[0].vat"/>
<li name="raw_maxlength" t-maxlength="10"
t-raw="docs[0].company_registry"
t-if="docs[0].company_registry"/>
</t>
</template>
</odoo>

4
report_qweb_parameter/models/__init__.py

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

47
report_qweb_parameter/models/ir_qweb.py

@ -0,0 +1,47 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Creu Blanca
# License AGPL-3.0 or later (http://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)

BIN
report_qweb_parameter/static/description/icon.png

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

4
report_qweb_parameter/tests/__init__.py

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

50
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 (http://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_object = self.env['ir.actions.report.xml']
report_name = 'report_qweb_parameter.test_report_length'
docs = self.env['res.company'].search([], limit=1)
vat = docs.vat
website = docs.website
fax = docs.fax
company_registry = docs.company_registry
docs.update({
'fax': '12345678901',
'vat': '12345678901',
'website': '1234567890',
'company_registry': '1234567890'
})
rep = report_object.render_report(docs.ids, report_name, False)
root = ET.fromstring(
rep[0]
)
self.assertEqual(root[1][0][0][0].text, "1234567890")
self.assertEqual(root[1][0][0][2].text, "1234567890")
docs.update({'fax': '123456789'})
with self.assertRaises(QWebException):
report_object.render_report(docs.ids, report_name, False)
docs.update({'fax': '1234567890', 'vat': '123456789'})
with self.assertRaises(QWebException):
report_object.render_report(docs.ids, report_name, False)
docs.update({'vat': '1234567890', 'website': '12345678901'})
with self.assertRaises(QWebException):
report_object.render_report(docs.ids, report_name, False)
docs.update(
{'website': '1234567890', 'company_registry': '12345678901'})
with self.assertRaises(QWebException):
report_object.render_report(docs.ids, report_name, False)
docs.update({
'fax': fax,
'vat': vat,
'website': website,
'company_registry': company_registry
})
Loading…
Cancel
Save