oca-ocb-mail/odoo-bringout-oca-ocb-im_livechat/im_livechat/models/im_livechat_expertise.py
Ernad Husremovic daa394e8b0 19.0 vanilla
2026-03-09 09:31:39 +01:00

51 lines
2.1 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from odoo import Command, fields, models
class Im_LivechatExpertise(models.Model):
"""Expertise of Live Chat users."""
_name = "im_livechat.expertise"
_description = "Live Chat Expertise"
_order = "name"
name = fields.Char("Name", required=True, translate=True)
user_ids = fields.Many2many(
"res.users",
string="Operators",
compute="_compute_user_ids",
inverse="_inverse_user_ids",
store=False,
)
_name_unique = models.UniqueIndex("(name)")
def _compute_user_ids(self):
users_by_expertise = self._get_users_by_expertise()
for expertise in self:
expertise.user_ids = users_by_expertise[expertise]
def _inverse_user_ids(self):
users_by_expertise = self._get_users_by_expertise()
for expertise in self:
for user in expertise.user_ids - users_by_expertise[expertise]:
# sudo: res.users: livechat manager can add expertise on users
user.sudo().livechat_expertise_ids = [Command.link(expertise.id)]
for user in users_by_expertise[expertise] - expertise.user_ids:
# sudo: res.users: livechat manager can remove expertise on users
user.sudo().livechat_expertise_ids = [Command.unlink(expertise.id)]
def _get_users_by_expertise(self):
users_by_expertise = defaultdict(lambda: self.env["res.users"])
settings_domain = [("livechat_expertise_ids", "in", self.ids)]
# sudo: res.users.settings: livechat manager can read expertise on users
user_settings = self.env["res.users.settings"].sudo().search(settings_domain)
for user_setting in user_settings:
for expertise in user_setting.livechat_expertise_ids:
users_by_expertise[expertise] |= user_setting.user_id
for expertise, users in users_by_expertise.items():
users_by_expertise[expertise] = users.with_prefetch(user_settings.user_id.ids)
return users_by_expertise