码迷,mamicode.com
首页 > 其他好文 > 详细

odoo12 修行基础篇之 利用kanban做分析 点击跳转分析模型列表 (九)

时间:2020-09-18 03:04:37      阅读:30      评论:0      收藏:0      [点我收藏+]

标签:处理   turn   ring   search   完美   seq   创建   基础   count   

前面客户来了需求:投诉要进行分类,用看板可以看到不同分类的投诉数量,点击数量时可以跳转到记录列表进行查看。

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分

odoo12 修行基础篇之 利用kanban做分析 点击跳转分析模型列表 (九)

标签:处理   turn   ring   search   完美   seq   创建   基础   count   

原文地址:https://www.cnblogs.com/SamNicole1809/p/13679112.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有
迷上了代码!