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

在 Odoo 14 中统计在线人数通常涉及到定制开发或者使用特定的模块。

  1. 自定义开发:如果没有现成的模块,您可能需要进行一些自定义开发。这通常涉及到扩展Odoo的用户模型,以跟踪用户的登录和登出活动。以下是一个基本的实现思路:

    • 扩展用户模型:在用户模型(通常是res.users)中添加字段来记录用户的最后活动时间。
    • 更新最后活动时间:在用户进行操作时更新这个字段。这可以通过继承并修改相应的控制器和方法来实现。
    • 计算在线用户:创建一个方法或计划任务,定期检查用户的最后活动时间,并确定哪些用户可以被视为"在线"。例如,您可以认为在过去几分钟内有活动的用户是在线的。
  2. 视图和报告:为了方便查看在线用户,您可以创建一个特定的视图或报告,显示当前在线的用户列表。

  3. 安全性和性能考虑:在实现这样的功能时,请确保考虑到数据的安全性和对系统性能的影响。例如,频繁地更新用户的最后活动时间可能会对数据库性能产生影响。

这些只是基本的指导思路,具体实现会根据您的具体需求和Odoo环境的配置有所不同。如果您不熟悉Odoo的开发,建议咨询专业的Odoo开发人员或者公司以获得更具体的帮助。
  为了在 Odoo 14 中监控在线人数,我们需要创建一个自定义模块。这个模块将扩展res.users模型来记录用户的最后活动时间,并提供一个方法来计算当前在线的用户数量。以下是实现这一功能的步骤和代码示例。

步骤 1:创建模块结构

首先,您需要创建一个新的 Odoo 模块。这通常涉及到创建以下文件和目录:

  • __init__.py:初始化文件。
  • __manifest__.py:模块的元数据文件。
  • models/:包含模型扩展的目录。
  • models/__init__.py:初始化模型目录。
  • models/res_users.py:包含用户模型扩展的文件。

步骤 2:扩展res.users模型

models/res_users.py文件中,我们将扩展res.users模型以添加一个字段来记录用户的最后活动时间。

复制代码
from odoo import fields, models

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

    last_activity_time = fields.Datetime("Last Activity Time")

    def update_last_activity(self):
        """ 更新用户的最后活动时间 """
        self.sudo().write({'last_activity_time': fields.Datetime.now()})

步骤 3:创建一个计算在线用户的方法

在同一个文件中,我们可以添加一个方法来计算在线用户的数量。这里我们定义"在线"为在过去10分钟内有活动的用户。

复制代码
from odoo import fields, models
from datetime import timedelta

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

    # ... [之前的代码]

    @classmethod
    def get_online_users_count(cls):
        """ 计算当前在线用户的数量 """
        last_10_minutes = fields.Datetime.now() - timedelta(minutes=10)
        return cls.search_count([('last_activity_time', '>=', last_10_minutes)])

步骤 4:更新用户活动

您需要在用户执行操作时更新last_activity_time字段。这可能涉及到修改多个地方,例如在登录时或者在执行特定操作时。这里是一个简化的例子,展示如何在用户登录时更新:

复制代码
from odoo import api, models

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

    # ... [之前的代码]

    @api.model
    def _update_last_activity_after_login(self, db, login, password):
        """ 登录后更新用户的最后活动时间 """
        user = self.search([('login', '=', login)])
        if user:
            user.update_last_activity()

步骤 5:__init__.py文件

确保在__init__.py文件中导入扩展后的res.users模型。

复制代码
from . import models

步骤 6:__manifest__.py文件

__manifest__.py中定义模块的元数据。

复制代码
{
    'name': 'Online Users Monitoring',
    'version': '1.0',
    'summary': 'Monitor Online Users in Odoo',
    'category': 'Tools',
    'depends': ['base'],
    'data': [],
    'installable': True,
}

好了,到此就可以构成odoo14的所有文件,下面把上面的分析整合成一个完整的文件

=====================================================================================================================================================

为了实现在 Odoo 14 中监控在线用户的功能,我们需要创建一个自定义模块,该模块将会记录用户的最后活动时间,并提供一个视图来展示当前在线的用户。以下是整合的 Python 和 XML 文件,这些文件应该构成模块的主要部分。

1. __init__.py 文件

这个文件将导入我们自定义的模型。

复制代码
from . import models

2. __manifest__.py 文件

这个文件包含了模块的基本信息。

复制代码
{
    'name': 'Online Users Monitoring',
    'version': '1.0',
    'summary': 'Monitor Online Users in Odoo',
    'category': 'Tools',
    'depends': ['base', 'web'],
    'data': [
        'views/online_users_view.xml',
    ],
    'installable': True,
    'application': True,
}

3. models/__init__.py 文件

这个文件导入了扩展后的用户模型。

复制代码
from . import res_users

4. models/res_users.py 文件

这个文件包含了扩展后的用户模型和相关方法。

复制代码
from odoo import api, fields, models, http
from datetime import timedelta

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

    last_activity_time = fields.Datetime("Last Activity Time")

    @api.model
    def update_last_activity(self):
        """ 更新用户的最后活动时间 """
        self.sudo().write({'last_activity_time': fields.Datetime.now()})

    @classmethod
    def get_online_users_count(cls):
        """ 计算当前在线用户的数量 """
        last_10_minutes = fields.Datetime.now() - timedelta(minutes=10)
        return cls.search_count([('last_activity_time', '>=', last_10_minutes)])

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_activity()
        return response

5. views/online_users_view.xml 文件

这个 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_activity_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>

使用说明

  1. 创建模块:您需要按照上述结构创建一个 Odoo 模块。这包括创建文件夹和相应的文件。
  2. 安装模块:在 Odoo 中安装这个模块。
  3. 使用:安装后,您可以在 Odoo 的界面上找到"在线用户"的菜单项,查看当前在线的用户。

注意事项

  • 这个实现假定用户在最后一次HTTP请求后的10分钟内为在线。这不一定能完美地检测浏览器关闭的情况,但它提供了一种近似的方法。
  • 在实际部署之前,请在开发环境中进行充分的测试。
  • 根据您的具体需求,您可能需要调整代码中的一些参数,
相关推荐
odoo中国1 天前
如何在 Odoo 19 中加载演示数据
xml·csv·odoo·odoo 19·odoo 演示数据加载
odoo中国3 天前
Odoo 19 模块结构概述
开发语言·python·module·odoo·核心组件·py文件按
odoo中国8 天前
如何在 Odoo 中从 XML 文件调用函数
xml·odoo·odoo开发·调用函数
odoo中国10 天前
Odoo 19 中的基础视图有哪些?
odoo·odoo19·基础视图
李怀瑾25 天前
在Odoo18中实现多选下拉框搜索功能
odoo
Odoo老杨1 个月前
Odoo全球领先的开源ERP:助力洛民塑料激活民族品牌拓界出海
odoo·erp·中小企业数字化
odoo-卜永4 个月前
odoo阿里云大模型多字段内容翻译
阿里云·odoo·大模型翻译
一只花里胡哨的程序猿4 个月前
odoo18应用、队列服务器分离(SSHFS)
运维·服务器·odoo
一只花里胡哨的程序猿4 个月前
odoo打印pdf速度慢问题
pdf·odoo
向上的车轮4 个月前
Odoo与Django 的区别是什么?
后端·python·django·odoo