changeset 0e8c33ac7eeb in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=0e8c33ac7eeb
description:
Allow modify record name on the reports
issue10749
review373541002
diffstat:
CHANGELOG | 1 +
doc/topics/reports/index.rst | 3 +++
trytond/ir/action.py | 22 ++++++++++++++++++++++
trytond/ir/message.xml | 3 +++
trytond/ir/view/action_report_form.xml | 3 ++-
trytond/report/report.py | 10 +++++++++-
6 files changed, 40 insertions(+), 2 deletions(-)
diffs (121 lines):
diff -r 4eb15d8c9f95 -r 0e8c33ac7eeb CHANGELOG
--- a/CHANGELOG Thu Oct 07 17:46:14 2021 +0200
+++ b/CHANGELOG Fri Oct 08 19:26:46 2021 +0200
@@ -1,3 +1,4 @@
+* Allow modify record name on the reports
* Add methods to format number and symbol on Lang
* Add format number with symbol on Report
* Allow locking tables by calling ModelSQL.lock without records
diff -r 4eb15d8c9f95 -r 0e8c33ac7eeb doc/topics/reports/index.rst
--- a/doc/topics/reports/index.rst Thu Oct 07 17:46:14 2021 +0200
+++ b/doc/topics/reports/index.rst Fri Oct 08 19:26:46 2021 +0200
@@ -56,6 +56,9 @@
report is called with more than one record, a zip file containing all the
reports will be generated.
+ * ``record_name``: A Genshi Expression to compute the filename for each
+ record.
+
Report Usage
============
diff -r 4eb15d8c9f95 -r 0e8c33ac7eeb trytond/ir/action.py
--- a/trytond/ir/action.py Thu Oct 07 17:46:14 2021 +0200
+++ b/trytond/ir/action.py Fri Oct 08 19:26:46 2021 +0200
@@ -6,6 +6,7 @@
from functools import partial
from sql import Null
+from genshi.template.text import TextTemplate
from trytond.cache import Cache, MemoryCache
from trytond.config import config
@@ -549,6 +550,10 @@
], translate=False,
string='Extension', help='Leave empty for the same as template, '
'see LibreOffice documentation for compatible format.')
+ record_name = fields.Char(
+ "Record Name", translate=True,
+ help="A Genshi expression to compute the name using 'record'.\n"
+ "Leave empty for the default name.",)
module = fields.Char('Module', readonly=True, select=True)
_template_cache = MemoryCache('ir.action.report.template', context=False)
@@ -695,6 +700,23 @@
def set_template_cached(self, template):
self._template_cache.set(self.id, template)
+ @classmethod
+ def validate(cls, reports):
+ super().validate(reports)
+ for report in reports:
+ report.check_record_name()
+
+ def check_record_name(self):
+ if not self.record_name:
+ return
+ try:
+ TextTemplate(self.record_name)
+ except Exception as exception:
+ raise ValidationError(
+ gettext('ir.msg_report_invalid_record_name',
+ report=self.rec_name,
+ exception=exception)) from exception
+
class ActionActWindow(ActionMixin, ModelSQL, ModelView):
"Action act window"
diff -r 4eb15d8c9f95 -r 0e8c33ac7eeb trytond/ir/message.xml
--- a/trytond/ir/message.xml Thu Oct 07 17:46:14 2021 +0200
+++ b/trytond/ir/message.xml Fri Oct 08 19:26:46 2021 +0200
@@ -238,6 +238,9 @@
<record model="ir.message" id="msg_report_invalid_email">
<field name="text">Invalid email definition for report
"%(name)s".</field>
</record>
+ <record model="ir.message" id="msg_report_invalid_record_name">
+ <field name="text">Invalid record name definition for report
"%(report)s" with exception "%(exception)s".</field>
+ </record>
<record model="ir.message" id="msg_action_invalid_views">
<field name="text">Invalid view "%(view)s" for action
"%(action)s".</field>
</record>
diff -r 4eb15d8c9f95 -r 0e8c33ac7eeb trytond/ir/view/action_report_form.xml
--- a/trytond/ir/view/action_report_form.xml Thu Oct 07 17:46:14 2021 +0200
+++ b/trytond/ir/view/action_report_form.xml Fri Oct 08 19:26:46 2021 +0200
@@ -22,7 +22,8 @@
<field name="report_name"/>
<label name="icon"/>
<field name="icon"/>
- <newline/>
+ <label name="record_name"/>
+ <field name="record_name"/>
<label name="report_content"/>
<group col="-1" id="report_content">
<field name="report_content" xexpand="0"/>
diff -r 4eb15d8c9f95 -r 0e8c33ac7eeb trytond/report/report.py
--- a/trytond/report/report.py Thu Oct 07 17:46:14 2021 +0200
+++ b/trytond/report/report.py Fri Oct 08 19:26:46 2021 +0200
@@ -29,6 +29,7 @@
weasyprint = None
from genshi.filters import Translator
+from genshi.template.text import TextTemplate
from trytond.i18n import gettext
from trytond.pool import Pool, PoolBase
@@ -161,8 +162,15 @@
name_length = 0
record_count = len(records)
max_length = REPORT_NAME_MAX_LENGTH - len(str(record_count)) - 2
+ if action_report.record_name:
+ template = TextTemplate(action_report.record_name)
+ else:
+ template = None
for record in records[:5]:
- record_name = record.rec_name
+ if template:
+ record_name = template.generate(record=record).render()
+ else:
+ record_name = record.rec_name
name_length += len(record_name) + 1
if name_length > max_length:
break