lims_report_html: extend use of report templates
This commit is contained in:
parent
179d6d00f1
commit
0bbdddf87a
|
@ -3,6 +3,7 @@
|
|||
# the full copyright notices and license terms.
|
||||
|
||||
from trytond.pool import Pool
|
||||
from trytond.report import Report
|
||||
from . import action
|
||||
from . import html_template
|
||||
from . import configuration
|
||||
|
@ -15,6 +16,7 @@ from . import notebook
|
|||
|
||||
|
||||
def register():
|
||||
module = 'lims_report_html'
|
||||
Pool.register(
|
||||
action.ActionReport,
|
||||
html_template.ReportTemplate,
|
||||
|
@ -36,13 +38,15 @@ def register():
|
|||
results_report.GenerateReportStart,
|
||||
results_report.RelateAttachmentResultsReportStart,
|
||||
notebook.Notebook,
|
||||
module='lims_report_html', type_='model')
|
||||
module=module, type_='model')
|
||||
Pool.register(
|
||||
action.ReportTranslationSet,
|
||||
sample.CreateSample,
|
||||
results_report.GenerateReport,
|
||||
results_report.RelateAttachmentResultsReport,
|
||||
module='lims_report_html', type_='wizard')
|
||||
module=module, type_='wizard')
|
||||
Pool.register(
|
||||
results_report.ResultReport,
|
||||
module='lims_report_html', type_='report')
|
||||
module=module, type_='report')
|
||||
Pool.register_mixin(html_template.LimsReport, Report,
|
||||
module=module)
|
||||
|
|
|
@ -2,13 +2,23 @@
|
|||
# The COPYRIGHT file at the top level of this repository contains
|
||||
# the full copyright notices and license terms.
|
||||
|
||||
from trytond.model import fields
|
||||
from trytond.pool import PoolMeta
|
||||
from trytond.pyson import Eval
|
||||
from trytond.transaction import Transaction
|
||||
|
||||
|
||||
class ActionReport(metaclass=PoolMeta):
|
||||
__name__ = 'ir.action.report'
|
||||
|
||||
lims_template = fields.Many2One('lims.report.template', 'Report Template',
|
||||
domain=[
|
||||
('report_name', '=', Eval('report_name')),
|
||||
('type', 'in', [None, 'base']),
|
||||
],
|
||||
states={'invisible': Eval('template_extension') != 'lims'},
|
||||
depends=['report_name', 'template_extension'])
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
<tryton>
|
||||
<data>
|
||||
|
||||
<record model="ir.ui.view" id="action_report_view_form">
|
||||
<field name="model">ir.action.report</field>
|
||||
<field name="inherit" ref="ir.action_report_view_form"/>
|
||||
<field name="name">action_report_form</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</tryton>
|
|
@ -19,7 +19,6 @@ from mimetypes import guess_type as mime_guess_type
|
|||
from sql import Literal
|
||||
|
||||
from trytond.model import ModelSQL, ModelView, DeactivableMixin, fields
|
||||
from trytond.report import Report
|
||||
from trytond.pool import Pool
|
||||
from trytond.pyson import Eval, Bool, Or
|
||||
from trytond.transaction import Transaction
|
||||
|
@ -311,13 +310,51 @@ class ReportTemplateSection(ModelSQL, ModelView):
|
|||
raise UserError(gettext('lims_report_html.msg_section_pdf'))
|
||||
|
||||
|
||||
class LimsReport(Report):
|
||||
class LimsReport:
|
||||
__slots__ = ()
|
||||
|
||||
@classmethod
|
||||
def get_action(cls, data):
|
||||
pool = Pool()
|
||||
ActionReport = pool.get('ir.action.report')
|
||||
|
||||
action_id = data.get('action_id')
|
||||
if action_id is None:
|
||||
action_reports = ActionReport.search([
|
||||
('report_name', '=', cls.__name__),
|
||||
])
|
||||
assert action_reports, '%s not found' % cls
|
||||
action = action_reports[0]
|
||||
else:
|
||||
action = ActionReport(action_id)
|
||||
|
||||
return action, action.model or data.get('model')
|
||||
|
||||
@classmethod
|
||||
def execute(cls, ids, data):
|
||||
cls.check_access()
|
||||
action, model = cls.get_action(data)
|
||||
if action.template_extension != 'lims' or action.lims_template is None:
|
||||
return super().execute(ids, data)
|
||||
|
||||
if data is None:
|
||||
data = {}
|
||||
current_data = data.copy()
|
||||
|
||||
template = action.lims_template
|
||||
if template.type == 'base': # HTML
|
||||
result = cls.execute_html_lims_report(ids, current_data)
|
||||
else:
|
||||
current_data['action_id'] = None
|
||||
if template.report:
|
||||
current_data['action_id'] = template.report.id
|
||||
result = cls.execute_custom_lims_report(ids, current_data)
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def execute_custom_lims_report(cls, ids, data):
|
||||
pool = Pool()
|
||||
ActionReport = pool.get('ir.action.report')
|
||||
cls.check_access()
|
||||
|
||||
action_id = data.get('action_id')
|
||||
if action_id is None:
|
||||
|
@ -364,7 +401,6 @@ class LimsReport(Report):
|
|||
def execute_html_lims_report(cls, ids, data):
|
||||
pool = Pool()
|
||||
ActionReport = pool.get('ir.action.report')
|
||||
cls.check_access()
|
||||
|
||||
action_reports = ActionReport.search([
|
||||
('report_name', '=', cls.__name__),
|
||||
|
@ -385,11 +421,11 @@ class LimsReport(Report):
|
|||
@classmethod
|
||||
def _execute_html_lims_report(cls, records, data, action):
|
||||
record = records[0]
|
||||
template_id, tcontent, theader, tfooter = (
|
||||
template, tcontent, theader, tfooter = (
|
||||
cls.get_lims_template(action, record))
|
||||
context = Transaction().context
|
||||
context['template'] = template_id
|
||||
if not template_id:
|
||||
context['template'] = template.id
|
||||
if not template:
|
||||
context['default_translations'] = os.path.join(
|
||||
os.path.dirname(__file__), 'report', 'translations')
|
||||
with Transaction().set_context(**context):
|
||||
|
@ -409,8 +445,8 @@ class LimsReport(Report):
|
|||
if tfooter:
|
||||
stylesheets += cls.parse_stylesheets(tfooter)
|
||||
|
||||
page_orientation = (record.template and
|
||||
record.template.page_orientation or 'portrait')
|
||||
page_orientation = (template and
|
||||
template.page_orientation or 'portrait')
|
||||
|
||||
document = PdfGenerator(content,
|
||||
header_html=header, footer_html=footer,
|
||||
|
@ -418,17 +454,21 @@ class LimsReport(Report):
|
|||
stylesheets=stylesheets,
|
||||
page_orientation=page_orientation).render_html().write_pdf()
|
||||
|
||||
if record.previous_sections or record.following_sections:
|
||||
previous_sections = (hasattr(record, 'previous_sections') and
|
||||
record.previous_sections or [])
|
||||
following_sections = (hasattr(record, 'following_sections') and
|
||||
record.following_sections or [])
|
||||
if previous_sections or following_sections:
|
||||
merger = PdfFileMerger(strict=False)
|
||||
# Previous Sections
|
||||
for section in record.previous_sections:
|
||||
for section in previous_sections:
|
||||
filedata = BytesIO(section.data)
|
||||
merger.append(filedata)
|
||||
# Main Report
|
||||
filedata = BytesIO(document)
|
||||
merger.append(filedata)
|
||||
# Following Sections
|
||||
for section in record.following_sections:
|
||||
for section in following_sections:
|
||||
filedata = BytesIO(section.data)
|
||||
merger.append(filedata)
|
||||
output = BytesIO()
|
||||
|
@ -441,22 +481,22 @@ class LimsReport(Report):
|
|||
|
||||
@classmethod
|
||||
def get_lims_template(cls, action, record):
|
||||
template_id, content, header, footer = None, None, None, None
|
||||
if record.template:
|
||||
template_id = record.template
|
||||
content = '<body>%s</body>' % record.template.content
|
||||
header = (record.template.header and
|
||||
template, content, header, footer = None, None, None, None
|
||||
template = action.lims_template or record.template
|
||||
if template:
|
||||
content = '<body>%s</body>' % template.content
|
||||
header = (template.header and
|
||||
'<header id="header">%s</header>' %
|
||||
record.template.header.content)
|
||||
footer = (record.template.footer and
|
||||
template.header.content)
|
||||
footer = (template.footer and
|
||||
'<footer id="footer">%s</footer>' %
|
||||
record.template.footer.content)
|
||||
template.footer.content)
|
||||
if not content:
|
||||
content = (action.report_content and
|
||||
action.report_content.decode('utf-8'))
|
||||
if not content:
|
||||
raise UserError(gettext('lims_report_html.msg_no_template'))
|
||||
return template_id, content, header, footer
|
||||
return template, content, header, footer
|
||||
|
||||
@classmethod
|
||||
def render_lims_template(cls, action, template_string,
|
||||
|
|
|
@ -28,6 +28,39 @@
|
|||
<field name="name">template_section_list</field>
|
||||
</record>
|
||||
|
||||
<!-- Report Template -->
|
||||
|
||||
<record model="ir.ui.view" id="template_view_form">
|
||||
<field name="model">lims.report.template</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">template_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="template_view_list">
|
||||
<field name="model">lims.report.template</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">template_list</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.act_window" id="act_template_list">
|
||||
<field name="name">Report Templates</field>
|
||||
<field name="res_model">lims.report.template</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_template_view_list">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="template_view_list"/>
|
||||
<field name="act_window" ref="act_template_list"/>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_template_view_form">
|
||||
<field name="sequence" eval="20"/>
|
||||
<field name="view" ref="template_view_form"/>
|
||||
<field name="act_window" ref="act_template_list"/>
|
||||
</record>
|
||||
|
||||
<menuitem action="act_template_list"
|
||||
id="menu_template_list"
|
||||
parent="ir.menu_action" sequence="21"
|
||||
icon="tryton-list"/>
|
||||
|
||||
<!-- Results Report Template -->
|
||||
|
||||
<record model="ir.ui.view" id="result_template_view_form">
|
||||
|
|
|
@ -2,6 +2,10 @@
|
|||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "field:ir.action.report,lims_template:"
|
||||
msgid "Report Template"
|
||||
msgstr "Plantilla de Informe"
|
||||
|
||||
msgctxt "field:lims.analysis,result_template:"
|
||||
msgid "Report Template"
|
||||
msgstr "Plantilla de Informe"
|
||||
|
@ -257,6 +261,10 @@ msgctxt "model:ir.action,name:act_result_template_list"
|
|||
msgid "Results Report Templates"
|
||||
msgstr "Plantillas de Informe de resultados"
|
||||
|
||||
msgctxt "model:ir.action,name:act_template_list"
|
||||
msgid "Report Templates"
|
||||
msgstr "Plantillas de Informe"
|
||||
|
||||
msgctxt "model:ir.action,name:report_result_report_html"
|
||||
msgid "Results Report"
|
||||
msgstr "Informe de resultados"
|
||||
|
@ -290,6 +298,10 @@ msgctxt "model:ir.ui.menu,name:menu_result_template_list"
|
|||
msgid "Results Report Templates"
|
||||
msgstr "Plantillas de Informe"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_template_list"
|
||||
msgid "Report Templates"
|
||||
msgstr "Plantillas de Informe"
|
||||
|
||||
msgctxt "model:lims.report.template,name:"
|
||||
msgid "Report Template"
|
||||
msgstr "Plantilla de Informe"
|
||||
|
|
|
@ -3,6 +3,7 @@ version=6.0.0
|
|||
depends:
|
||||
lims
|
||||
xml:
|
||||
action.xml
|
||||
html_template.xml
|
||||
configuration.xml
|
||||
laboratory.xml
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0"?>
|
||||
<data>
|
||||
<xpath
|
||||
expr="/form/notebook/page[@id='general']/field[@name='extension']"
|
||||
position="after">
|
||||
<label name="lims_template"/>
|
||||
<field name="lims_template"/>
|
||||
</xpath>
|
||||
</data>
|
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0"?>
|
||||
<form>
|
||||
<label name="report_name"/>
|
||||
<field name="report_name"/>
|
||||
<label name="name"/>
|
||||
<field name="name"/>
|
||||
<label name="type"/>
|
||||
<field name="type"/>
|
||||
<label name="report"/>
|
||||
<field name="report"/>
|
||||
<label name="page_orientation"/>
|
||||
<field name="page_orientation"/>
|
||||
<label name="active"/>
|
||||
<field name="active" xexpand="0" width="25"/>
|
||||
<notebook>
|
||||
<page name="content">
|
||||
<field name="content" colspan="4" widget="html"/>
|
||||
</page>
|
||||
<page id="header_footer" string="Header and Footer">
|
||||
<label name="header"/>
|
||||
<field name="header"
|
||||
view_ids="lims_report_html.template_view_list,lims_report_html.template_view_form"/>
|
||||
<label name="footer"/>
|
||||
<field name="footer"
|
||||
view_ids="lims_report_html.template_view_list,lims_report_html.template_view_form"/>
|
||||
</page>
|
||||
<page name="translations">
|
||||
<field name="translations" colspan="4"/>
|
||||
</page>
|
||||
<page name="sections">
|
||||
<field name="previous_sections" colspan="4"/>
|
||||
<field name="following_sections" colspan="4"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</form>
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0"?>
|
||||
<tree>
|
||||
<field name="report_name"/>
|
||||
<field name="name" expand="2"/>
|
||||
<field name="type"/>
|
||||
<field name="report"/>
|
||||
</tree>
|
Loading…
Reference in New Issue