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


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

    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,带目录

  • 相关阅读:
    Repeater控件用法
    python的文件锁使用
    python的文件锁使用
    python的文件锁使用
    linux下文件描述符的介绍
    linux下文件描述符的介绍
    linux下文件描述符的介绍
    Linux 2.6 中的文件锁
    Linux 2.6 中的文件锁
    Linux 2.6 中的文件锁
  • 原文地址:https://www.cnblogs.com/SamNicole1809/p/13679112.html
Copyright © 2020-2023  润新知