首页 > 其他分享 >自定义开发odoo14的统计在线用户人数 (续)

自定义开发odoo14的统计在线用户人数 (续)

时间:2023-12-26 16:35:08浏览次数:33  
标签:last users 自定义 odoo14 用户 online 心跳 heartbeat 在线

上一篇是只统计在过去几分钟内有活动的用户是在线的。
今天我们来处理当浏览器关闭后,才算是离线用户,否则算在线用户。

 

要实现当浏览器关闭后才算用户离线的功能,在 Odoo 中较为复杂,因为 Odoo 服务器端无法直接检测到客户端浏览器的关闭事件。不过,我们可以通过一种近似的方法来实现这个功能:定期从客户端(浏览器)发送心跳信号到服务器,以表示用户仍然在线。如果服务器在一定时间内没有收到某个用户的心跳信号,则认为该用户已离线。

以下是按照这种思路修改和更新代码的方法:

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

class ResUsers(models.Model):
    _inherit = 'res.users'

    last_heartbeat_time = fields.Datetime("Last Heartbeat Time")

    @api.model
    def update_last_heartbeat(self):
        """ 更新用户的最后心跳时间 """
        self.sudo().write({'last_heartbeat_time': fields.Datetime.now()})

    def is_online(self):
        """ 判断用户是否在线 """
        if not self.last_heartbeat_time:
            return False
        return fields.Datetime.now() - self.last_heartbeat_time < timedelta(minutes=5)

class IrHttp(models.AbstractModel):
    _inherit = 'ir.http'

    @classmethod
    def _dispatch(cls):
        """ 拦截 HTTP 请求并更新用户的最后心跳时间 """
        response = super(IrHttp, cls)._dispatch()
        current_user = http.request.env.user
        if current_user:
            current_user.update_last_heartbeat()
        return response

添加 JavaScript 代码

在 Odoo 中,我们需要添加一个 JavaScript 文件来定期发送心跳信号。这个 JavaScript 文件应该被包含在我们的模块中。

  1. 创建 static/src/js/heartbeat.js 文件:
    odoo.define('online_users_monitoring.heartbeat', function (require) {
        "use strict";
    
        var session = require('web.session');
    
        function sendHeartbeat() {
            session.rpc('/online_users_monitoring/heartbeat', {});
        }
    
        $(window).on('beforeunload', sendHeartbeat); // 当浏览器窗口关闭时发送心跳
        setInterval(sendHeartbeat, 300000); // 每5分钟发送一次心跳
    });

    __manifest__.py 中添加 JavaScript 文件的引用:

  2. {
        # ... 其他代码 ...
        'qweb': [
            'static/src/xml/*.xml',
        ],
        'web.assets_backend': [
            'online_users_monitoring/static/src/js/heartbeat.js',
        ],
    }

    添加 Controller 来处理心跳信号

    controllers/main.py文件中,我们需要添加一个控制器来处理心跳信号的请求。

    from odoo import http
    
    class OnlineUsersMonitoring(http.Controller):
        @http.route('/online_users_monitoring/heartbeat', type='json', auth='user')
        def heartbeat(self):
            request.env.user.update_last_heartbeat()
            return {'status': 'success'}

    并在 __init__.py 文件中导入这个控制器:

    from . import controllers

    更新 views/online_users_view.xml

    online_users_view.xml中,我们应该展示用户的最后心跳时间而不是最后活动时间。

    <odoo>
        <record id="view_online_users_tree" model="ir.ui.view">
            <field name="name">online.users.tree</field>
            <field name="model">res.users</field>
            <field name="arch" type="xml">
                <tree>
                    <field name="name"/>
                    <field name="login"/>
                    <field name="last_heartbeat_time"/>
                </tree>
            </field>
        </record>
    
        <record id="action_online_users" model="ir.actions.act_window">
            <field name="name">Online Users</field>
            <field name="res_model">res.users</field>
            <field name="view_mode">tree</field>
            <field name="view_id" ref="view_online_users_tree"/>
            <field name="domain">[('last_activity_time','&gt;=', (DateTime.now() - timedelta(minutes=10)).strftime('%Y-%m-%d %H:%M:%S'))]</field>
        </record>
    
        <menuitem id="menu_online_users"
                  name="Online Users"
                  action="action_online_users"
                  parent="base.menu_management"/>
    </odoo>

    结论

    这种方法依赖于客户端定期向服务器发送心跳信号。如果用户关闭了浏览器或者与服务器的连接断开,心跳信号将不再发送,从而允许服务器判断用户已离线。不过,请注意,这种方法可能不是完全准确的,因为如果用户的网络连接断开但浏览器没有关闭,用户也会被判断为离线。此外,这种方法可能会增加服务器的负担,因为每个在线用户都需要定期发送心跳信号。

标签:last,users,自定义,odoo14,用户,online,心跳,heartbeat,在线
From: https://www.cnblogs.com/lyt263/p/17928420.html

相关文章

  • 自定义开发odoo14的统计在线用户人数
    在Odoo14中统计在线人数通常涉及到定制开发或者使用特定的模块。自定义开发:如果没有现成的模块,您可能需要进行一些自定义开发。这通常涉及到扩展Odoo的用户模型,以跟踪用户的登录和登出活动。以下是一个基本的实现思路:扩展用户模型:在用户模型(通常是res.users)中添加字段来记......
  • 微信小程序自定义ui库开发记录
    首先去翻官网,看有没有提供,发现微信官方提供了命令行工具,用于快速初始化一个项目npminstall-g@wechat-miniprogram/miniprogram-cli自定义组件/开发第三方自定义组件(qq.com)使用体验打包后的组件,每个js顶部都会带上一大段代码,增大了文件体积。没有相关的组件文档生......
  • uniGUI学习之自定义Hint(74)
    默认Hint样式 procedureTMainForm.UniFormShow(Sender:TObject);vari:Integer;beginfori:=0toSelf.ControlCount-1dobeginwithTUniFormControl(Self.Controls[i])dobeginifHint<>''thenbeginShowHint......
  • 在线helpdesk帮助台软件
    随着企业的数字化转型和信息化建设,IT部门承担着越来越重要的职责。为了更好地管理和解决用户的技术问题,许多企业选择采用在线helpdesk帮助台软件。在本文中,我们将探讨在线helpdesk帮助台软件的定义、功能和优势。 首先,什么是在线helpdesk帮助台软件?在线helpdesk帮助台软件是一......
  • Salesforce LWC学习(四十七) 标准页面更新以后自定义页面如何捕捉?
    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_subscribe_lc.htmhttps://developer.salesforce.com/docs/component-library/bundle/lightning-emp-api/documentationsalesforce零基础学习(九十六)Platfor......
  • [CSS]border-image-slice宽高不确定时自定义边框
    宽高不确定时自定义边框效果: <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>borde......
  • 初中英语优秀范文100篇-038Should Students Make Firiends Online?学生应该在线交友吗
    PDF格式公众号回复关键字:SHCZFW038记忆树1Nowadays,manyteenagersshowagreatinterestinmakingfriendsonline.翻译现如今,许多青少年对于在网上交朋友表现出很大的兴趣。简化记忆兴趣句子结构1"Nowadays"是一个副词,表示这个句子描述的是现在的情景。2"man......
  • 自定义指令
    介绍​除了Vue内置的一系列指令(比如v-model或v-show)之外,Vue还允许你注册自定义的指令(CustomDirectives)。我们已经介绍了两种在Vue中重用代码的方式:组件和组合式函数。组件是主要的构建模块,而组合式函数则侧重于有状态的逻辑。另一方面,自定义指令主要是为了重用......
  • 【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
    问题描述当在AppServiceforWindows环境中所列出的TomcatVersion没有所需要的情况下,如何实现自定义Tomcat环境呢? 问题解答第一步: 从官网下载要使用的 tomcat版本,解压到本地目录第二步:修改 conf/server.xml 配置文件将 port 改成 -1:将 Http-connectport 改成 ${po......
  • 【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
    问题描述当在AppServiceforWindows环境中所列出的TomcatVersion没有所需要的情况下,如何实现自定义Tomcat环境呢? 问题解答第一步: 从官网下载要使用的tomcat版本,解压到本地目录 第二步:修改 conf/server.xml 配置文件将 port 改成 -1:将 Http-connect......