跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. odoo中有自带的实现后台主动通知客户端的功能嘛??

odoo中有自带的实现后台主动通知客户端的功能嘛??

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
2 帖子 2 发布者 499 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • Q 离线
    Q 离线
    qiaogang
    写于 最后由 编辑
    #1

    我现在的项目需要定期检查商品的效期,然后低于某个值之后需要通知到客户端有弹窗提醒。我不清楚odoo有没有自带的后台主动通知客户端的功能。我本来是准备是用websocket试试的,结果有些问题,代码如下:

    import asyncio
    
    from tornado import websocket, web, ioloop
    import logging
    import threading
    
    _logger = logging.getLogger(__name__)
    
    
    class EchoWebSocket(websocket.WebSocketHandler):
        live_web_sockets = set()
    
        def check_origin(self, origin):
            return True
    
        def open(self):
            _logger.info("连接打开")
            self.set_nodelay(True)
            self.live_web_sockets.add(self)
            self.write_message("你已经连接上WS服务")
    
        def on_message(self, message):
            self.write_message(u"你发送的数据: " + message)
    
        @classmethod
        def send_message(cls, message):
            removable = set()
            for ws in cls.live_web_sockets:
                if not ws.ws_connection or not ws.ws_connection.stream.socket:
                    removable.add(ws)
                else:
                    ws.write_message(message)
            for ws in removable:
                cls.live_web_sockets.remove(ws)
    
        def on_close(self):
            _logger.info("连接关闭")
    
    
    class WebSocketServer(threading.Thread):
        def run(self) -> None:
            asyncio.set_event_loop(asyncio.new_event_loop())
            application = web.Application([
                (r'/websocket', EchoWebSocket)
            ])
            application.listen(8888)
            ioloop.IOLoop.instance().start()
    
    
    WebSocketServer().start()
    
    

    然后在编写了检查效期的方法:

    import datetime
    
    from odoo import models, fields, api
    from .socketserver import EchoWebSocket
    
    
    class CronJob(models.Model):
        _inherit = "cron.job"
    
        def check_endvalidate(self):
            """
            近效期查询弹窗提示
            :return:
            """
            records = self.env['bicon_press_doc_v'].search([])
            for record in records:
                endvalidate = record.endvalidate
                now = datetime.date.today()
                limit = self.env['sys.params'].search([('key', '=', 'endvalidate_limit')]).value
                if (endvalidate - now).days < int(limit):
                    EchoWebSocket.send_message('存在近效期小于一年的商品,请前往业务大厅中的药品近效期促销表中查看!')
    

    js中就在右上角的UserMenu中添加了如下代码占时测试:

    var host = "ws://" + window.location.hostname + ":8888/websocket";
            var ws = new WebSocket(host);
            ws.onmessage = function (evt) {
                alert(evt.data);
            };
    

    之后页面打开会有你已经连接上WS服务的弹窗提醒,说明websocket是连接上的,然后,在odoo自带的定时器中设置定时执行check_endvalidate方法后就会报错:ValueError: <class 'RuntimeError'>: "There is no current event loop in thread 'odoo.service.cron.cron0'." while evaluating
    'model.check_endvalidate()'
    我很懵逼呀!
    所以想问下odoo自带的有没有后台主动通知客户端的功能,我需要定时执行一些逻辑后通知页面。希望各位大佬指点一哈!!!

    1 条回复 最后回复
    0
    • 卓忆卓 离线
      卓忆卓 离线
      卓忆
      写于 最后由 卓忆 编辑
      #2

      有几种方式,
      一:
      Odoo可以使用Automated Actions 来实现邮件通知等,
      而且 非常的灵活,
      可以参考:https://www.odoo.net.cn/topic/4569/休假申请自动邮件通知/3

      还有:https://www.cnblogs.com/odoouse/p/4690369.html

      二:还有种,就是参考 calendar 中的Remind 写法,这个可以浏览器弹窗(浏览器需要允许下),
      odoo apps 里面搜v12的 remind : http://www.odoo.com/apps/modules/browse/page/2?search=remind&series=12.0 给您参考下;

      三:Odoo11 开始,又多了个 Activities ;

      恬淡

      1 条回复 最后回复
      0

      • 登录

      • 没有帐号? 注册

      • 登录或注册以进行搜索。
      • 第一个帖子
        最后一个帖子
      0
      • 版块
      • 标签
      • 热门
      • 用户
      • 群组