添加了一个三级菜单,由此创建向导,可选择按照性别分类进行打印,打印符合条件的PDF报表
打印出的PDF表如图所示:
代码部分:先写向导部分,创建一个新的向导 patient_report:【向导文件放在wizard里】
py文件代码:【all_patient_report.py】
from odoo import fields, models, api, _
class PatientReportWizard(models.TransientModel):
_name = "patient.report.wizard"
_description = "这是一个瞬态模型patient_report_wizard"
gender = fields.Selection([('male', '男的'), ('female', '女的'), ('other', '其它')],
required=True, default='other')
age = fields.Integer(string="Age")
def action_print_report(self):
data = {
'form_data': self.read()[0],
'email': '6370@163.com',
}
return self.env.ref('mysale.action_report_all_patient_details').report_action(self, data=data)
xml文件代码:【all_patient_report_view.xml】
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="action_report_patient" model="ir.actions.act_window">
<field name="name">patient_report</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">patient.report.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_report_patient_form"/>
<field name="target">new</field>
</record>
<record id="view_report_patient_form" model="ir.ui.view">
<field name="name">patient_report_form</field>
<field name="model">patient.report.wizard</field>
<field name="arch" type="xml">
<form string="创建一个向导">
<group>
<group>
<field name="gender"/>
</group>
<group>
<field name="age"/>
</group>
</group>
<footer>
<button name="action_print_report" string="打印" type="object" class="btn-primary"/>
<button string="取消" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
<menuitem id="menu_print_report"
name="create_print_report"
parent="menu_1_list"
action="action_report_patient"
sequence="35"/>
</odoo>
还是要在init与manifest文件里配置一下的,导入模块以及添加视图文件,还有就是设置权限。
再写模板部分:放在【report】文件中:
py文件代码:【all_patient_report.py】
from odoo import api, fields, models
class AllPatientReport(models.AbstractModel):
_name = 'report.mysale.report_all_patient_list'
_description = 'patient Report'
@api.model
def _get_report_values(self, docids, data=None):
print("----", docids, data)
domain = []
gender = data.get('form_data').get('gender')
age = data.get('form_data').get('age')
if gender:
domain += [('gender', '=', gender)]
if age != 0:
domain += [('age', '=', age)]
docs = self.env['mysale.mysale'].search(domain)
return {
'docs': docs,
'email': '6370@163.com'
}
这里是一个简单逻辑:首先我们可以先打印出来data里边的东西看一下:【data内容】
---- None {'context': {'lang': 'zh_CN', 'tz': 'Asia/Shanghai',
'uid': 2, 'allowed_company_ids': [1], 'active_model': 'patient.report.wizard',
'active_id': 18, 'active_ids': [18]},
'form_data': {'id': 18, 'gender': 'other', 'age': 0,
'__last_update': '2022-04-24 08:18:12',
'display_name': 'patient.report.wizard,18',
'create_uid': [2, 'Administrator'], 'create_date': '2022-04-24 08:18:12',
'write_uid': [2, 'Administrator'], 'write_date': '2022-04-24 08:18:12'},
'email': '6370@163.com', 'report_type': 'pdf'}
'form_data'出现在wizard/all_patient_report.py中,从data.get('form_data').get('gender')拿到gender里边的value然后进行对比判断里边的值是【male】【female】或者【other】然后做筛选,年龄判断的话不为0即可。email字段下面再说。
xml文件代码:【all_patient_list.xml】
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_all_patient_list">
<t t-call="web.html_container">
<t t-call="web.external_layout">
<div class="page">
<div class="oe_structure"/>
<div class="text-center">
<h2>Patients</h2>
</div>
<br/>
<table class="table table-bordered mt32">
<thead>
<tr>
<th name="th_name" class="text-left">
<span>Name</span>
</th>
<th name="th_name" class="text-left">
<span>Gender</span>
</th>
<th name="th_name" class="text-left">
<span>Age</span>
</th>
</tr>
</thead>
<span>Email
<t t-esc="email"/>
</span>
<t t-foreach="docs" t-as="line">
<tr>
<td>
<span t-field="line.name"/>
</td>
<td>
<span t-field="line.gender"/>
</td>
<td>
<span t-field="line.age"/>
</td>
</tr>
</t>
</table>
</div>
</t>
</t>
</template>
</odoo>
模板中添加email的视图 <span>Emai l<t t-esc = "email"/ ></span>report的py的return中添加了'email': '自定义的邮箱@163.com'在模板中能直接显示出来打印,但是控制台的data里拿不到,把这个'email': '自定义的邮箱@163.com'放在瞬态模型的py中控制台输出data中就能拿得到email这个字段以及后面的值,暂且没搞懂,记录一下以后研究。
xml文件代码:【report.xml】
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="action_report_all_patient_details" model="ir.actions.report">
<field name="name">patient details</field>
<field name="model">patient.report.wizard</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">mysale.report_all_patient_list</field>
<field name="report_file">mysale.report_all_patient_list</field>
<field name="binding_model_id" ref="model_mysale_mysale"/>
<field name="binding_type">report</field>
</record>
</odoo>
在report.xml里添加的动作都是ir.actions.report的动作,直接在这里显示:【patient details】
这个动作ID【action_report_all_patient_details】在瞬态模型的return中出现过,应该是它的一个return动作
至于打印出来的公司logo与公司名可以在: 【设置---> 用户和公司--->公司】中设置。
总结:本节非常的迷茫,并没有搞太懂这个案例,如果可以我希望能听中文的视频,英文的教程真是太难懂了。