「Odoo 基础教程系列」第三篇——从 Todo 应用开始(2)

「Odoo 基础教程系列」第三篇——从 Todo 应用开始(2)

Powered by @rawpixel

在这篇教程里我们将会了解到 Odoo 模型里的一些其他类型的字段和特殊机制,而我依然会继续带领大家一起完善我们的 Todo 应用,不断地往里面添加一些新的功能特性,让它看起来更丰满也更实用一些。

选择字段

在上一篇教程中,我们已经创建好了待办事项的模型,但是只是添加了「描述」和「已完成?」两个字段,这肯定是不能满足我们的需求的。现在我们来给待办事项增加一个「紧急程度」的字段,用来表示当前任务的优先级。

# models.py
class TodoTask(models.Model):
    _name = 'todo.task'
    _description = '待办事项'

    name = fields.Char('描述', required=True)
    is_done = fields.Boolean('已完成?')
    priority = fields.Selection([
        ('todo', '待办'),
        ('normal', '普通'),
        ('urgency', '紧急')
    ], default='todo', string='紧急程度')

我们添加了一个 Selection 类型的字段 priority,并且指定了三个可供选择的程度类型,一般情况下,如果一个字段只有固定的几种可选值,通常都会选择使用 Selection 字段,它接受一个元组列表作为参数,其中元组的组成为 (value, string),左边的是数据库中存储的值,右边的是一个用于界面显示的描述。

此处我们还给这个字段添加了默认值 todo,表示当一个待办事项被创建后,如果没有指定紧急程度,将默认是待办状态。我们可以为任意类型的字段添加默认值

在上一篇教程中我们提到过,在对模型进行改动之后,需要对模块进行升级才能看到变更后的样子,除了从应用列表中找到模块进行升级外,我们还可以在命令行中给 Odoo 的启动命令加上参数 -u todo 指定升级 todo 模块。

./odoo-bin --addons-path=addons,../mymodules --db-filter=^demo$ -d demo -u todo

紧急程度

升级后创建或打开任意一条待办事项进入到表单页面,就可以看到已经多了「紧急程度」这个字段了,并且默认选择了「待办」这一状态。

日期字段

我们已经给待办事项加上紧急程度了,可是光有这个还不够,我们还要给它加上截止时间,毕竟 deadline 是第一生产力呀!

# models.py
deadline = fields.Datetime(u'截止时间')

我们把截止日期也放到 TreeView 中,方便查看各个任务的 deadline

<!-- views.xml -->
<field name="arch" type="xml">
    <tree string="Todo">
        <field name="name"/>
        <field name="deadline"/>
        <field name="is_done"/>
    </tree>
</field>

截止时间 FormView

计算字段与视图装饰器

很多时候我们会需要用不同的颜色对待办事项进行标记,例如我们会希望已经过期的任务以红色标记来提醒我们,这个任务过期了。任务是否已经过期,我们要先知道任务的截止时间(上面一小节已经加上了)和当前时间,然后进行比较判断任务的截止时间是否小于当前时间,如果是则表示任务已经过期了,我们需要在视图上用红色将对应的任务标记起来。那将这个需求转化成代码应该怎么做呢?

这个需求跟时间有关,并且时间是流动(一直在变化)的,所以我们应该要有一个方法在用户每次打开待办事项之前,把这个结果计算好,并且反馈给用户,还好 Odoo 的 ORM 已经为我们实现了相关的机制——计算字段(Computed fields

# models.py
is_expired = fields.Boolean(u'已过期', compute='_compute_is_expired')

@api.depends('deadline')
@api.multi
def _compute_is_expired(self):
    for record in self:
        if record.deadline:
            record.is_expired = record.deadline < fields.Datetime.now()
        else:
            record.is_expired = False

计算字段其实和其他字段一样,只不过多了一个 compute 属性,它的值是计算这个字段值的方法名。我们来看一下对应的方法 _compute_is_expired 头顶上的 @api.depends 这个装饰器,它接受了一个参数 deadline,表示的是 is_expired 这个字段的计算会用到 deadline 这个字段的值(我们需要用它的值和当前时间进行比较),如果一个计算字段会用到多个其他字段的值,这里就需要以逗号分隔,将用到的值的字段名依次传入装饰器中。

@api.multi 则表示该方法中的 self 是一个记录集(多个实例的集合),如果不理解,可以暂时不深究,到后面自然会知道这里的实际用法。

再来看看实际的计算逻辑部分,只有一个循环以及一条赋值语句,刚刚已经提到过这里的 self 表示一个记录集,我们需要对这个记录集里的每一条记录进行计算,判断这个待办事项是否已经过期,这里的 record 就是每一条记录的实例对象,我们用这条记录的 deadline 的值和当前时间 fields.Datetime.now() 进行比较,然后将结果赋值给字段 is_expired,就是这么简单。

PS: 这里我们对 deadline 进行了判断,是因为如果没有设置截止时间,又或者是在新建代办事项时,这里的 deadline 会是一个布尔值,是不能和时间字符串进行比较的。

其中大家可能会有疑问的应该是当前时间的获取,为什么不是用 datetime.now() 吧?实际上获取当前时间用的也是这个方法,只不过 Odoo 的 ORM 替我们封装了一层,fields.Datetime.now() 是类 Datetime 的静态方法:

# fields.py
class Datetime(Field):
    type = 'datetime'
    column_type = ('timestamp', 'timestamp')
    column_cast_from = ('date',)

    @staticmethod
    def now(*args):
        """ Return the current day and time in the format expected by the ORM.
            This function may be used to compute default values.
        """
        return datetime.now().strftime(DATETIME_FORMAT)

好的,这里先不过多纠结细节问题,现在我们已经可以计算出来每个待办事项是否已经过期了,那要怎么去用这个计算字段呢?我们打开视图文件来加点东西上去:

<!-- views.xml -->
<field name="arch" type="xml">
    <tree string="Todo" decoration-danger="is_expired">
        <field name="name"/>
        <field name="deadline"/>
        <field name="is_done"/>
        <field name="is_expired" invisible="True"/>
    </tree>
</field>

在视图中我们把 is_expired 字段加了进去,并且还加上了属性 invisible,这个属性的作用是将当前字段隐藏起来,因为这里我们不希望用户看到这个字段的值,而是将结果反映在颜色上。然后我们再看到 <tree /> 标签多了一个属性 decoration-danger,这个属性可以接受表达式或字段名作为值,当结果为真时,这个属性就会生效,将 TreeView 中满足表达式的行以红色标记,实际的效果如下:

过期任务

今天这篇教程的内容就先到这里了,下一篇再继续带大家深入更多的内容。这篇教程中的代码同样会更新在我的 GitHub 仓库中。

仓库地址:Odoo-Tutorial-Demo

写在最后

距离上一次更新,已经过了好几个月了,这段时间除了忙公司的事情,还额外在做一些别的东西,然后最近在开发一个小程序。一直很想抽空出来更新这个系列的教程,一边又有很多事情在忙,拖更了实在是抱歉了!

如果你有任何的疑问,欢迎留言,我将会尽快给出答复,如果想要加群或者加好友,可以发送站内信给我,我会回复你微信号~

期待下一篇教程可以继续和你们见面。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101480.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 小程序获取openid40029[通俗易懂]

    小程序获取openid40029[通俗易懂]小程序获取openid40029{“errcode”:40029,“errmsg”:“invalidcode,hints:[req_id:XDgCIfyFe-.LPgiA]”}还出现了errcode:002的情况错误原因:小程序开发者工具中的appid和后台的appid不一致总结40029有可能是因为1.appid与密钥不一致(重置下密钥也可以)2.前后端的a…

    2022年4月28日
    45
  • Python暴力激活成功教程密码

    Python暴力激活成功教程密码一、导入包此处我们需要用到itertools和zipfile两个包importitertoolsimportzipfile我们先来简单认识一下itertools包的简单用法digital_list=list(itertools.permutations([‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9’],3))d_list=[”.join(x)forxindigital_list]print(digital_list)print(d_

    2022年8月22日
    9
  • Lambda架构简介

    Lambda架构简介参考文章:深入理解大数据架构之——Lambda架构传统系统的问题“我们正在从IT时代走向DT时代(数据时代)。IT和DT之间,不仅仅是技术的变革,更是思想意识的变革,IT主要是为自我服务,用来更好地自我控制和管理,DT则是激活生产力,让别人活得比你好”——阿里巴巴董事局主席马云。数据量从M的级别到G的级别到现在T的级、P的级别。数据量的变化数据管理系统(DBMS)和数仓系统(DW)也在悄然的变化着。传统应用的数据系统架构设计时,应用直接访问数据库系统。当用户访问量增加时,数据库无法支撑

    2022年6月25日
    34
  • sql2012数据库可疑如何修复_sql数据库mdf还原

    sql2012数据库可疑如何修复_sql数据库mdf还原USEMASTERGOSP_CONFIGURE’ALLOWUPDATES’,1RECONFIGUREWITHOVERRIDEGOALTERDATABASEworkerSETEMERGENCYGOsp_dboption’worker’,’singleuser’,’true’GODBCCCHECKDB(‘worker’,’REPAIR_AL

    2022年8月21日
    9
  • Java解析XML文件

    Java解析XML文件1.DOM方式解析XMLDom解析是将xml文件全部载入到内存,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,与平台无关,java提供的一种基础的解析XML文件的API,理解较简单,但是由于整个文档都需要载入内存,不适用于文档较大时。2.SAX方式解析XML基于事件驱动,逐条解析,适用于只处理xml数据,不易编码,而且很难同时访问同一个文档中的多处不同数据3.JDOM方式解

    2022年5月4日
    38
  • Hmily 临时笔记「建议收藏」

    Hmily 临时笔记「建议收藏」概述Hmily是一款高性能分布式事务tcc开源框架。基于java语言来开发(JDK1.8),支持Dubbo、SpringCloud、Motan等RPC框架进行分布式事务。功能高可靠性:支持分布式场景下,事务异常回滚,超时异常恢复,防止事务悬挂易用性:提供零侵入性式的Spring-Boot,Spring-Name…

    2022年5月21日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号