自定義開發odoo14的統計線上使用者人數

*感悟人生*發表於2023-12-26
在 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分鐘內為線上。這不一定能完美地檢測瀏覽器關閉的情況,但它提供了一種近似的方法。
  • 在實際部署之前,請在開發環境中進行充分的測試。
  • 根據您的具體需求,您可能需要調整程式碼中的一些引數,

相關文章