odoo13 自定义模块开发简介 windows10环境(三)

一、高级视图

1、树视图

树视图可以采用补充属性来进一步自定义其行为:

decoration-{$name}

允许根据相应记录的属性更改行文本的样式。

值是Python表达式。对于每条记录,将使用记录的属性作为上下文值评估表达式,如果为true,则将相应样式应用于行。其他上下文值是 uid(当前用户的ID)和current_date(当前日期,形式为字符串yyyy-MM-dd)。

{$name}可以是bffont-weight: bold), (it ),font-style: italic或任何枚举上下文颜色danger, infomutedprimarysuccesswarning)。

列表着色

修改session树视图,使持续时间少于5天的会话显示为蓝色,而持续时间超过15天的会话显示为红色。

修改views/openacademy.xml中session树视图如下

            <field name="name">session.tree</field>
            <field name="model">openacademy.session</field>
            <field name="arch" type="xml">

                <!--decoration  filter -->
                <tree string="Session Tree" decoration-info="duration&lt;5" decoration-danger="duration&gt;15">
                    <field name="name"/>
                    <field name="course_id"/>

                    <!--add duration field -->
                    <field name="duration" invisible="1"/>
                    <field name="taken_seats" widget="progressbar"/>
                </tree>
            </field>

运行效果

2、行事历

 将记录显示为日历事件。它们的根元素是<calendar>,最常见的属性是:

color

用于颜色分割的字段名称。颜色将自动分配给事件,但是相同颜色段(其@color字段具有相同值的记录)中的事件将被赋予相同的颜色。

date_start

记录中包含事件开始日期/时间的字段

date_stop (可选的)

记录的字段,其中包含事件的结束日期/时间

string

记录的字段以定义每个日历事件的标签

修改models\models.py文件中session对象,增加一个计划属性end_date,其值由start_date和duration计算得出。

# -*- coding: utf-8 -*-

from datetime import timedelta
from odoo import models, fields, api, exceptions

class Session(models.Model):
#...

        taken_seats = fields.Float(string="Taken seats", compute='_taken_seats')
        #add end_date
        end_date = fields.Date(string="End Date", store=True, compute='_get_end_date', inverse='_set_end_date')

#...
#add compute function
    @api.depends('start_date', 'duration')
    def _get_end_date(self):
        for r in self:
            if not (r.start_date and r.duration):
                r.end_date = r.start_date
                continue

            # Add duration to start_date, but: Monday + 5 days = Saturday, so
            # subtract one second to get on Friday instead
            duration = timedelta(days=r.duration, seconds=-1)
            r.end_date = r.start_date + duration

    def _set_end_date(self):
        for r in self:
            if not (r.start_date and r.end_date):
                continue

            # Compute the difference between dates, but: Friday - Monday = 4 days,
            # so add one day to get 5 days instead
            r.duration = (r.end_date - r.start_date).days + 1







修改views/openacademy.xml,增加行事历视图


        <!--定义 calendar view -->
        <record model="ir.ui.view" id="session_calendar_view">
            <field name="name">session.calendar</field>
            <field name="model">openacademy.session</field>
            <field name="arch" type="xml">
                <calendar string="Session Calendar" date_start="start_date" date_stop="end_date" color="instructor_id">
                    <field name="name"/>
                </calendar>
            </field>
        </record>

        <record model="ir.actions.act_window" id="session_list_action">
            <field name="name">Sessions</field>
            <field name="res_model">openacademy.session</field>
            <!--增加行事历图 -->
            <field name="view_mode">tree,form,calendar</field>
        </record>

        <menuitem id="session_menu" name="Sessions"

 

运行效果

3、搜索视图

搜索视图<field>元素可以具有@filter_domain,以覆盖为在给定字段上进行搜索而生成的域。在给定的域中, self代表用户输入的值。在下面的例子中,它是用来在两个字段进行搜索namedescription

搜索视图还可以包含<filter>元素,这些元素充当预定义搜索的切换。筛选器必须具有以下属性之一:

domain

将给定的域添加到当前搜索中

context

在当前搜索中添加一些上下文;使用键group_by将结果按给定的字段名称分组

修改views/openacademy.xml中course视图

  1. 添加一个按钮以过滤课程搜索视图中当前用户负责的课程。使其默认为选中状态。
  2. 添加按钮以按负责任的用户对课程进行分组
                <search>
                    <field name="name"/>
                    <field name="description"/>
                    <!--增加搜索、分组按钮-->
                    <filter name="my_courses" string="My Courses"
                            domain="[('responsible_id', '=', uid)]"/>
                    <group string="Group By">
                        <filter name="by_responsible" string="Responsible"
                                context="{'group_by': 'responsible_id'}"/>
                    </group>
                </search>
            </field>
        </record>


<!--
...
-->

            <field name="name">Courses</field>
            <field name="res_model">openacademy.course</field>
            <field name="view_mode">tree,form</field>
            <!--courses by responsible user-->
            <field name="context" eval="{'search_default_my_courses': 1}"/>
            <field name="help" type="html">
                <p class="o_view_nocontent_smiling_face">Create the first course
                </p>

运行效果

 

4、图表视图

图形视图允许对模型进行汇总概述和分析,其根元素为<graph>

图表视图具有4种显示模式,使用@type属性可以选择默认模式 。

Bar(默认)

在条形图中,第一维用于定义水平轴上的组,其他维用于定义每个组内的聚合条。

默认情况下,条形是并排放置的,可以通过 @stacked="True"<graph>

Line

二维折线图

Pie

二维派

图形视图包含<field>带有强制@type属性的值:

row (默认)

该字段应默认汇总

measure

该字段应汇总而不是分组

修改models\models.py,在“Session”对象中添加一个“图形”视图,该视图以条形图的形式显示每个课程的参加人数。

  1. 将与会者人数attendees_count添加为存储的计算字段
  2. 然后添加相关视图
    end_date = fields.Date(string="End Date", store=True,
        compute='_get_end_date', inverse='_set_end_date')
#添加与会人数计算属性
    attendees_count = fields.Integer(
        string="Attendees count", compute='_get_attendees_count', store=True)

    @api.depends('seats', 'attendee_ids')
    def _taken_seats(self):
        for r in self:
            # so add one day to get 5 days instead
            r.duration = (r.end_date - r.start_date).days + 1

#添加计算函数
    @api.depends('attendee_ids')
    def _get_attendees_count(self):
        for r in self:
            r.attendees_count = len(r.attendee_ids)

    @api.constrains('instructor_id', 'attendee_ids')
    def _check_instructor_not_in_attendees(self):
        for r in self:

在openacademy.xml添加图表视图

            </field>
        </record>
 
        <!--添加图表视图-->
        <record model="ir.ui.view" id="openacademy_session_graph_view">
            <field name="name">openacademy.session.graph</field>
            <field name="model">openacademy.session</field>
            <field name="arch" type="xml">
                <graph string="Participations by Courses">
                    <field name="course_id"/>
                    <field name="attendees_count" type="measure"/>
                </graph>
            </field>
        </record>

        <record model="ir.actions.act_window" id="session_list_action">
            <field name="name">Sessions</field>
            <field name="res_model">openacademy.session</field>
            <!--添加图表-->
            <field name="view_mode">tree,form,calendar,graph</field>
        </record>

        <menuitem id="session_menu" name="Sessions"

 

运行效果

5、看板

用于组织任务,生产过程等……其根元素是 <kanban>

看板视图显示一组可能按列分组的卡片。每张卡代表一条记录,每列代表一个聚合字段的值。

例如,项目任务可以按阶段(每个列是一个阶段)或负责任的方式(每个列是一个用户)进行组织,等等。

添加一个看板视图,该视图显示按课程分组的会话(因此,列就是课程)。

  1. 将一个整数color字段添加到会话模型
  2. 添加看板视图并更新操作

修改models\models.py,为session对象增加color属性

    duration = fields.Float(digits=(6, 2), help="Duration in days")
    seats = fields.Integer(string="Number of seats")
    active = fields.Boolean(default=True)
    # 增加
    color = fields.Integer()

    instructor_id = fields.Many2one('res.partner', string="Instructor",
        domain=['|', ('instructor', '=', True),

 

修改views\openacademy.xml增加kanban视图

            </field>
        </record>

        <!--看板视图-->
        <record model="ir.ui.view" id="view_openacad_session_kanban">
            <field name="name">openacademy.session.kanban</field>
            <field name="model">openacademy.session</field>
            <field name="arch" type="xml">
                <kanban default_group_by="course_id">
                    <field name="color"/>
                    <templates>
                        <t t-name="kanban-box">
                            <div
                                    t-attf-class="oe_kanban_color_{{kanban_getcolor(record.color.raw_value)}}
                                                  oe_kanban_global_click_edit oe_semantic_html_override
                                                  oe_kanban_card {{record.group_fancy==1 ? 'oe_kanban_card_fancy' : ''}}">
                                <div class="oe_dropdown_kanban">
                                    <!-- dropdown menu -->
                                    <div class="oe_dropdown_toggle">
                                        <i class="fa fa-bars fa-lg" title="Manage" aria-label="Manage"/>
                                        <ul class="oe_dropdown_menu">
                                            <li>
                                                <a type="delete">Delete</a>
                                            </li>
                                            <li>
                                                <ul class="oe_kanban_colorpicker"
                                                    data-field="color"/>
                                            </li>
                                        </ul>
                                    </div>
                                    <div class="oe_clear"></div>
                                </div>
                                <div t-attf-class="oe_kanban_content">
                                    <!-- title -->
                                    Session name:
                                    <field name="name"/>
                                    <br/>
                                    Start date:
                                    <field name="start_date"/>
                                    <br/>
                                    duration:
                                    <field name="duration"/>
                                </div>
                            </div>
                        </t>
                    </templates>
                </kanban>
            </field>
        </record>

        <record model="ir.actions.act_window" id="session_list_action">
            <field name="name">Sessions</field>
            <field name="res_model">openacademy.session</field>
            <!-- 增加看板 -->
            <field name="view_mode">tree,form,calendar,graph,kanban</field>
        </record>

运行效果

参考文档

https://www.odoo.com/documentation/13.0/howtos/backend.html#build-an-odoo-module

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 ERP 简介 1 1.1 Odoo 历史 1 1.2 ERPⅡ 或商业智能化 2 1.2.1 什么是商业智能 4 2 Odoo 框架简介 7 2.1 python 模块分析 8 2.2 python2 还是 python3 8 3 Odoo 的安装和配置 9 3.1 PostgreSQL 数据库 10 3.2 Ubuntu14.04 下可能缺失的软件包 11 3.3 网页显示 node.js 方面 11 3.4 其他问题 12 3.5 通过命令行运行时的配置 12 3.5.1 –xmlrpc-port=8888 12 3.5.2 –addons-path=addons 12 3.5.3 数据库的一些配置 13 3.5.4 –save 13 3.6 将安装环境封装起来 13 3.7 文档编译 14 4 初入 Odoo 17 4.1 管理数据库 17 4.2 登录界面 18 4.3 Administrator 首选项 19 4.4 导入一个翻译 20 4.5 新的 Demo 用户 20 4.6 模块管理 21 4.7 修改公司信息 21 4.8 打开技术特性支持之后 22 4.9 进销存和财务系统的抽象讨论 22 4.9.1 以采购部门为例 23 4.10 安装和配置模块 24 5 创建自己的模块 27 5.1 快速生成模块骨架 27 5.1.1 python 模块的 init 文件 28 5.1.2 作为 Odoo 模块的说明文件 29 5.2 安装自定义模块 32 5.2.1 模块文件夹管理 32 5.3 一个简单的演示模块 33 5.3.1 controllers 33 5.3.2 views 33 5.3.3 models 35 5.3.4 security 37 5.3.5 美化网页 38 5.4 加分项: 通过 pgadmin3 来查看数据库 39 5.4.1 安装 39 5.4.2 连接服务器 39 5.4.3 图形化查询 40 6 Odoo 开发基础: 请假模块第一谈 43 6.1 纯理论讨论 43 6.2 定义模型 45 6.3 加入菜单 46 6.3.1 act_window 的属性 48 6.3.2 menuitem 的属性 48 6.4 视图优化 48 6.4.1 修改 tree 视图 49 6.4.2 修改 form 视图 49 6.5 完整的 views.xml 51 6.6 给模块加个图标 53 7 Odoo 开发基础: 工作计划模块第一谈 55 7.1 数据访问权限管理 61 7.1.1 access rule 62 7.1.2 record rule 62 8 扩展现有模块-继承机制 65 8.1 给模块增加 field 65 8.2 修改已有的 field 66 8.3 重载原模型的方法 66 8.3.1 什么是 Recordset 67 8.3.2 Odoo 里面的 domain 语法 68 8.3.3 recordset 的 search 方法 69 8.4 视图 xml 文件的继承式修改 70 8.4.1 视图元素添加 71 8.4.2 原视图元素属性修改 71 8.5 多态继承 72 8.6 修改其他数据文件 73 8.6.1 删除记录 73 8.6.2 更新数据 73 8.7 委托继承 74 9 理解模型内的数据文件 75 9.1 理解外部 id 75 9.2 使用外部 id 77 9.3 导出或导入数据文件 77 9.4 快捷输入标签 78 9.5 用 field 标签设置值 78 9.5.1 eval 语法 78 9.5.2 ref 属性 79 9.5.3 One2many 和 Many2many 的 eval 赋值 79 10 Odoo 开发基础: 请假模块第二谈 81 10.1 本例涉及到的数据库表格简介 89 10.2 工作流概念入门 89 10.2.1 定义工作流对象 90 10.2.2 创建节点 91 10.2.3 创建连接 91 11 Odoo 模型层详解 93 11.1 _name 93 11.2 各个表头属性 93 11.3 name 字段 94 11.4 具体模型的数据 94 11.5 模型间的关系 95 11.6 工作流 95 12 Odoo 视图层详解 97 13 附录 99 13.1 Odoo 里老的 API 99 13.2 PostgreSQL 数据库命令行操作 99 13.2.1 命令行数据库备份 99 13.3 反向代理 (reverse proxy) 99 13.3.1 安装 ngnix 软件 100 13.3.2 强制 https 连接 102 13.3.3 nginx 优化 102 13.3.4 轮询机制 102 13.4 跟踪项目源码初始化进程 102 13.4.1 base 模块 104 13.4.2 web 模块 105 13.4.3 web_kanban 模块 105 13.5 配置会计科目 105 13.5.1 配置会计科目类型 105 13.5.2 配置会计科目 106 13.6 分录 106 13.7 新建业务伙伴 106 13.7.1 新建业务伙伴标签 106 13.7.2 新建客户 106 13.8 创建新的产品 107 13.9 设置会计年度 107 13.10向供应商下单 107 13.11会计学入门 107 13.11.1财务报表 108 13.11.2原始凭证 108 13.11.3账户 108 13.11.4分类帐 109 13.11.5会计科目表 109 13.11.6报告期间 110 13.12参考资料 110

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值