前面客户来了需求:投诉要进行分类,用看板可以看到不同分类的投诉数量,点击数量时可以跳转到记录列表进行查看。
odoo中看板只能展示本model的数据看板,要实现汇总跳转,就要利用其它的model。
我们分析客户需求可以明显看出,要根据投诉类型进行汇总,那就需要有一个投诉分类的model。
这一章,是对前几章的汇总,我们再快速从头走一遍。复习都安排好了。最后,我们再引入本章的重点,用看板做分析。
1、在models目录新建my_customer_complain_type.py,init.py中引入。
# -*- coding:utf-8 -*- from odoo import fields, models class MyCustomerComplainType(models.Model): _name = 'my.customer.complain.type' _description = '客户投诉类型' name = fields.Char('投诉类型')
2、增加销售配置中增加按钮,名称为投诉类型,新建my_customer_complain_type.xml,在__manifest__.py中引入。
<?xml version="1.0" encoding="UTF-8" ?> <odoo> <!--在销售配置栏增加投诉类型按钮--> <act_window id="action_my_customer_complaint_type" name="投诉类型页" res_model="my.customer.complain.type" /> <menuitem id="menu_my_customer_complaint_type" name="投诉类型" action="action_my_customer_complaint_type" parent="sale.menu_sale_config" sequence="10" /> </odoo>
3、在ir.model.access.csv中添加权限配置
access_my_customer_complain_type,my.customer.complain.type,model_my_customer_complain_type,,1,1,1,1
4、升级下,就可以看到页面了,创建几条记录试试。
5、加入一下看板吧,就不要选颜色了,在my_customer_complain_type.xml中增加如下内容:
<record id="action_my_customer_complaint_type" model="ir.actions.act_window"> <field name="view_mode">kanban,tree,form</field> </record> <!-- kanban --> <record id="kanban_my_customer_complain_type" model="ir.ui.view"> <field name="name">kanban.my.customer.complain.type</field> <field name="model">my.customer.complain.type</field> <field name="arch" type="xml"> <kanban> <templates> <t t-name="kanban-box"> <div t-attf-class="oe_kanban_global_click"> <div> <div class="o_primary"> <field name="name"/> </div> </div> </div> </t> </templates> </kanban> </field> </record>
升级下,view_mode中我调整了一下kanban加入的顺序,会发现按钮的顺序也变了,默认视图就是kanban了,好赞。
以上基本上就是之前的内容了,现在我们开始搞看板分析。
我要展示数量,就得有字段啊,没字段往上放啥啊。先加字段吧。
7、在my_customer_complain.py中增加字段,用于绑定类型:
type_id = fields.Many2one('my.customer.complain.type', '投诉类型')
8、在my_customer_complain.xml中添加字段,并修改my.customer.complain模型的数据,添加上类型,造点分析数据。
<group name="top_left"> <field name="supplier_id"/> <field name="type_id"/> </group>
9、在my_customer_complain_type.py中增加数量字段,我们先加个计算字段试试
number = fields.Integer('数量', default=0, compute='_get_type_complain_number') def _get_type_complain_number(self): for record in self: record.number = record.env['my.customer.complain'].search_count( [('type_id', '=', record.id), ('state', '=', 'done')]) # 点击数量进行跳转的方法 def go_complains(self): pass
10、在my_customer_complain_type.xml中修改一下kanban,增加number字段,再修改下样式
<!-- kanban --> <record id="kanban_my_customer_complain_type" model="ir.ui.view"> <field name="name">kanban.my.customer.complain.type</field> <field name="model">my.customer.complain.type</field> <field name="arch" type="xml"> <kanban class="o_kanban_dashboard"> <templates> <t t-name="kanban-box"> <div t-attf-class="oe_kanban_global_click"> <div t-attf-class="o_kanban_card_header"> <div class="o_kanban_card_header_title"> <div class="o_primary"> <field name="name"/> </div> </div> </div> <div> <div class="o_kanban_primary_left"> <a name="go_complains" type="object" role="button"> 数量<field name="number"/>个 </a> </div> </div> </div> </t> </templates> </kanban> </field> </record>
升级下,可以看到数量正常显示,原本我以为需要在看板上引入字段number,后来去掉没影响,看来只要不对字段进行操作,就可以不引入,当然只是我个人的看法,还望了解的人指导。
点击数量跳转其实就是在a标签中调用了后端的一个方法,固定写法而已,类似于之前的button写法。
这个时候点击,并没有什么卵用,还没有点击事件。
这个时候我们需要转换一下思路:
※ 如何实现在点击数量时跳转到另一个model(my.customer.complain)的列表中去呢?
※ 跳转到列表如何能只显示我想要的数据呢?
※ 我点击的是a标签,a标签调用后端方法,那么后端方法怎么触发点击事件呢?
我们想到,点击菜单时候可以跳转列表,只要定义一个action就可以了,那这里是不是也可以呢,当然可以。
而且可以在跳转时候指定默认的筛选条件,我去,这样不就可以只显示我想要的数据了吗,完美。
如何触发点击事件呢,当然不知道了,但odoo肯定有这个功能啊,源码走一趟,搞定。
11、在my_customer_complain_type.xml里增加一个action动作:
<record id="action_go_my_customer_complains" model="ir.actions.act_window"> <field name="name">go.complains</field> <field name="res_model">my.customer.complain</field> <field name="type">ir.actions.act_window</field> <field name="view_mode">tree,form</field> <field name="context">{ 'search_default_type_id': [active_id], 'search_default_finish': 1 } </field> <field name="search_view_id" ref="search_my_customer_complain"/> <field name="help" type="html"> <p class="o_view_nocontent_smiling_face"> 暂无数据 </p> </field> </record>
看看定义的动作:
模型指向的是my.customer.complain。
类型是ir.actions.act_window,固定的。
要展示的是列表和表单。
传入了默认的筛选条件,一个是传入了点击看板的id,按照类型筛选,type_id就是my.customer.complain模型关联看板模型的字段名,固定写法,一个是调用了一个定义好的筛选条件。
search_view_id对应的就是筛选条件定义的search视图的id。
help中的内容是固定写法,当列表没有数据时的友好提示。(赠送的彩蛋)
当然,筛选条件我们还没定义,let's go...
12、在my_customer_complain.xml定义一下筛选条件:
<record id="search_my_customer_complain" model="ir.ui.view"> <field name="name">search.my.customer.complain</field> <field name="model">my.customer.complain</field> <field name="arch" type="xml"> <search> <field name="type_id"/> <filter name="draft" string="未处理" domain="[('state', '=', 'draft')]"/> <filter name="finish" string="完成" domain="[('state', '=', 'done')]"/> <group> <filter string="状态" name="state" context="{'group_by':'state'}"/> </group> </search> </field> </record>
增加了type_id字段的引入(必须引入,否则关于type_id的筛选不生效),和finish筛选条件的定义。这个和上面search_default_为前缀定义的默认筛选条件是对应的。好了剩下最后一个问题了,如何在方法中调用动作呢:
13、在my_customer_complain_type.py中加入如下内容:
def _get_action(self, action_xmlid): action = self.env.ref(action_xmlid).read()[0] if self: action['display_name'] = self.display_name return action def go_complains(self): return self._get_action('my_pro_extension.action_go_my_customer_complains')
第一个方法就是源码中触发动作的方法,第二个方法就是我们在kanban中定义的,点击a标签是调用的方法,这里要说明一下,my_pro_extension是我项目名,就是__mainifest__.py的name属性值,必须要加,要不找不到动作,会报错。action_go_my_customer_complains就是我定义的动作id。好了,这样就完活了。升级下,看看效果吧。
我觉着基础篇到这里就差不多了。
现在工作上的事情不少,能坚持写到这儿,和大家分享,我也很开心。
后面有时间,我可能会再开下提升篇,介绍一下常用的琐碎功能,比如报表,权限,定时任务啥的。
好了,跟基础篇就说再见了。
2020年9月16日 14点52分
项目git地址:https://github.com/SamNicole1809/odoo12_my_pro,带目录