odoo开发笔记:Server+Action服务器动作自动触发执行

摘要:
系统将根据定义的条件过滤出符合条件的数据记录,并自动执行定义的ServerAction。ODO服务器操作ServerAction如下图所示。添加ServerAction,“删除过期的SaaSClientDB”。ServerAction有多种类型。这个例子是Python代码。Odoo的自动操作是通过“CheckActionRules”执行的计划任务。默认情况下,每4小时检查一次“自动操作”。如果您想更频繁地执行“自动操作”,可以在此处进行修改。OODO设计模式-消息通知问题Odoo系统根据文档更新发送消息通知相关人员。

       Odoo的市场定位是SME(中小型企业),这个市场的ERP产品,多如牛毛,产品各具特色。不过,Odoo的自动化处理机制,可以睥睨天下,无人能及。包括一些大型国产软件,如用友、金蝶也不具备如此强大的自动化业务处理功能。Odoo的业务自动化机制,可以非常容易地扩充ERP系统功能,非常容易地让业务工作自动化。

Odoo自动化动作

如下图,增加一个自动化动作,“自动删除过期的SaaS DB”。系统会按定义好的条件筛选出符合条件的数据记录(业务对象),自动执行定义好的Server Action(服务器端动作)。

  • 相关的文档模型:本自动化处理适用于哪个业务对象
  • 何时运行:什么时候触发本自动化动作,选项有“业务对象创建时候”,“业务对象更新时候”,“业务对象创建或更新时候”,“基于时间条件触发”
  • 筛选:定义一个过滤条件,仅对符合该过滤条件的业务对象执行本自动化动作
  • 触发日期:业务对象上的一个日期型字段
  • 使用日期:触发日期的前/后多少天(或小时、分钟)触发本动作。如果是触发日期前则填写负数。
  • 使用日历:如果是希望定义触发日期前/后多少个工作天,则需要使用该字段。该字段定义工作日历。
  • 最后运行:本动作最近一次运行的时间。
  • 动作:定义要自动执行的Server Action,可以有多个。

需要注意的是,系统的时间条件是,假设 触发日期 + 使用日期 后得到的时间 为DT,本动作最后运行时间 LT,当前时间CT。当满足条件 LT < DT <= CT时候,系统才会促发本动作。如果某次执行失败,下次再执行时候,失败的那条记录,由于不满足条件 LT < DT,系统不会再次执行该对象。

odoo开发笔记:Server+Action服务器动作自动触发执行第1张
odoo开发笔记:Server+Action服务器动作自动触发执行第2张

Odoo服务端动作Server Action

      如下图,增加一个Server Action,“删除过期的SaaS Client DB”。Server Action有多种类型,本例是Python代码。Python代码最为灵活,你可以自己写Python代码,完成任意你希望的业务处理。本例是调用业务对象的删除数据库的方法"delete_database_server()"。

      非常有用的是,你可以将定义好的Server Action添加到对象视图的“更多”按钮下面,从而点击按钮自动执行

odoo开发笔记:Server+Action服务器动作自动触发执行第3张

Odoo筛选条件

      如下图,自动化动作中,可以定义需要执行自动化动作的对象过滤条件。过滤条件可以在对象的列表视图中自定义,然后“保存当前过滤器”。需要注意的是,保存时候,一定要勾选“与所有用户共享”。

odoo开发笔记:Server+Action服务器动作自动触发执行第4张

Odoo计划任务

      如下图,Odoo有一个计划任务机制,类似于Linux的 crontab,或者Windows的计划任务。计划任务机制中,你可以指定系统每隔多少时间执行指定的对象方法。

      Odoo的自动动作,是通过“Check Action Rules”的计划任务,默认情况是每隔4小时检查一遍“自动动作”,如果你希望更频繁地执行“自动动作”,你可以在此修改。

odoo开发笔记:Server+Action服务器动作自动触发执行第5张
 


OODO设计模式一消息通知

问题

Odoo系统根据单据更新发送消息通知相关人员。

举例:
生产订单下发,库管人员就会得到需要发货的消息。

相关的设计模式有:

  • 重写动作函数.
  • 自动化动作
  • 定制开发,根据单据状态,发送消息

下面就,讨论不同模式的实现方法,和利弊。

重写动作函数

odoo v8 中 确认生产订单 通过workflow完成,
workflow 调用的确认函数是:

复制代码
def action_confirm(self, cr, uid, ids, context=None):
        """ Confirms production order.
        @return: Newly generated Shipment Id.
        """
        user_lang = self.pool.get('res.users').browse(cr, uid, [uid]).partner_id.lang
        context = dict(context, lang=user_lang)
        uncompute_ids = filter(lambda x: x, [not x.product_lines and x.id or False for x in self.browse(cr, uid, ids, context=context)])
        self.action_compute(cr, uid, uncompute_ids, context=context)
        for production in self.browse(cr, uid, ids, context=context):
            self._make_production_produce_line(cr, uid, production, context=context)

            stock_moves = []
            for line in production.product_lines:
                if line.product_id.type != 'service':
                    stock_move_id = self._make_production_consume_line(cr, uid, line, context=context)
                    stock_moves.append(stock_move_id)
                else:
                    self._make_service_procurement(cr, uid, line, context=context)
            if stock_moves:
                self.pool.get('stock.move').action_confirm(cr, uid, stock_moves, context=context)
            production.write({'state': 'confirmed'})
        return 0
复制代码

重写函数, 增加以下代码实现。

SUPER(mrp_prodduction, self).action_confirm(cr, uid, ids, context=None)
self.message_post(cr, uid, ids, body=_("Order %s confirmed. Please Send Material") % self._description, context=context)

修改结果

odoo开发笔记:Server+Action服务器动作自动触发执行第8张
rewrite_function.png

优点: 简单直接
缺点: 需要找到代码函数,重写函数。

定制,根据状态变化

此方法需要修改代码,在单据状态变化的时候,自动推送消息。

依赖代码部分
模块集成

    _inherit = ['mail.thread', 'ir.needaction_mixin']

定义状态, 增加track_visibility属性

复制代码
'state': fields.selection(
            [('draft', 'New'), ('cancel', 'Cancelled'), ('confirmed', 'Awaiting Raw Materials'),
                ('ready', 'Ready to Produce'), ('in_production', 'Production Started'), ('done', 'Done')],
            string='Status', readonly=True,
            track_visibility='onchange', copy=False,
复制代码

定义_trace 字段以及参数
ps. mrp.production 中未定义_track, 故状态更新 不会推送消息通知。

复制代码
# Automatic logging system if mail installed
    # _track = {
    #   'field': {
    #       'module.subtype_xml': lambda self, cr, uid, obj, context=None: obj[state] == done,
    #       'module.subtype_xml2': lambda self, cr, uid, obj, context=None: obj[state] != done,
    #   },
    #   'field2': {
    #       ...
    #   },
    # }
    # where
    #   :param string field: field name
    #   :param module.subtype_xml: xml_id of a mail.message.subtype (i.e. mail.mt_comment)
    #   :param obj: is a browse_record
    #   :param function lambda: returns whether the tracking should record using this subtype
复制代码

其中 module.subtype_xml 需要在xml中定义消息类型。 例如 account_voucher 的跟踪消息类型

1
2
3
4
5
6
7
<!--Voucher-related subtypes formessaging /Chatter -->
       <record id="mt_voucher_state_change"model="mail.message.subtype">
           <field name="name">Status Change</field>
           <field name="res_model">account.voucher</field>
           <field name="default"eval="False"/>
           <field name="description">Status changed</field>
       </record>

  

优点:根据状态或其他字段自动推送消息。
缺点:定义复杂。

自动化动作

创建自动话动作,定义对象和条件

odoo开发笔记:Server+Action服务器动作自动触发执行第13张
Automatci_action.png

定义动作: 更改负责人 或增加关注者(本例中可以增加仓库人员)

odoo开发笔记:Server+Action服务器动作自动触发执行第14张
set_action1.png

或 更复杂动作,用服务器动作定义

odoo开发笔记:Server+Action服务器动作自动触发执行第15张
create_server_action.png

优点 : 用户可配置
缺点: server action 需要写python代码

总结

以上三种方法,都是使用message_post方法发送消息给关注者,如需使用其他发送消息方法,需要在mail thread寻找新的方法。
方法三,可以自定义配置条件,也可以增加关注者,也可以增加复杂动作,灵活。
方法一,对开发者来说更直接。

参考:https://www.zhiyunerp.com/blog/2/post/15

免责声明:文章转载自《odoo开发笔记:Server+Action服务器动作自动触发执行》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 从数据包获取校验和自然语言处理——词的表示下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring AOP之使用注解创建切面

上节中我们已经定义了Performance接口,他是切面中的切点的一个目标对象。那么现在就让我们使用AspectJ注解来定义切面吧。 1.定义切面 下面我们就来定义一场舞台剧中观众的切面类Audience: package com.spring.aop.service.aop; import org.aspectj.lang.ProceedingJoi...

Asp.net 使用weboffice实现Word在线编辑

项目中客户需要在页面中实现Word的在线编辑,Word写保护等功能。之前写了篇文章,用的是dsoframer.ocx,参考的都是网络上的资源。用的时候页面卡, 而且word2003和word2007有问题。现在找了个另外一个组件,点聚公司的weboffice,还不错。主要是免费的。 关于weboffice的使用,大家可以看看官网,他那有演示。我这也把我找的...

Android 自己实现更新下载自动安装

1、一些公司开发完一款App之后可能并不会去上架App商店,但事后期也需要定时进行维护更新,所以会选择把打包好的apk 发布到自己的服务器,然后在数据库建一个版本号的表,然后剩下的就交给你android开发了,android自己要实现版本检测更新,由于android自带的DownloadManager 就可以实现下载功能,用起来就会很简单了,不用再写很多下...

iOS数据持久化的方式

概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 沙盒 在介绍各种存储方法之前,有必要说明以...

Odoo 模型之间的关系 笔记

Many2one 关系需要两个参数:关联模块(设置对应模块的关键参数)和展示字符。它会在数据库表中创建一个拥有外键的字段去关联数据库表。 这种类型的字段,也可以使用一些其它的参数: ondelete 在关联的记录被删除时,将会触发。默认值是null,也就是说,当关联的记录被删除时,它将被置空。其它值为restrict,当记录被关联时,禁止删除,cascad...

2系统启动后的 wifi加载 过程图解

Wifi模块的初始化: 系统启动 首先加载init.rc,这个文件 会加载所有service,在 SystemServer 启动的时候,会生成一个ConnectivityService 的实例, try { Log.i(TAG, "Starting Connectivity Service."); ServiceManager.addService(Con...