• 自定义开发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.treefield>
            <field name="model">res.usersfield>
            <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 Usersfield>
            <field name="res_model">res.usersfield>
            <field name="view_mode">treefield>
            <field name="view_id" ref="view_online_users_tree"/>
            <field name="domain">[('last_activity_time','>=', (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分钟内为在线。这不一定能完美地检测浏览器关闭的情况,但它提供了一种近似的方法。
    • 在实际部署之前,请在开发环境中进行充分的测试。
    • 根据您的具体需求,您可能需要调整代码中的一些参数,
  • 相关阅读:
    RabbitMQ初步到精通-第十章-RabbitMQ之Spring客户端源码
    uniapp在线打包ipa - iOS篇
    docker基础命令快速入门
    项目架构:prettier 提交检测、全局||自动格式化代码
    19、L298N 电机驱动板
    Kotlin 协程 知识点
    [MyBatisPlus]DML编程控制①(多记录操作、逻辑删除)
    web server apache tomcat11-20-connectors 连接器
    八问八答 | 目前IAA出海到了什么阶段?原来赚钱的尽头满是营销
    微信小游戏adapter对document和windows 支持不足的错误
  • 原文地址:https://www.cnblogs.com/lyt263/p/17928368.html