forked from Mapan/odoo17e
122 lines
4.4 KiB
Python
122 lines
4.4 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import logging
|
|
|
|
from odoo import api, fields, models
|
|
from odoo.exceptions import UserError
|
|
from odoo.tools.translate import _
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class VoipQueueMixin(models.AbstractModel):
|
|
_name = "voip.queue.mixin"
|
|
_description = "VOIP Queue support"
|
|
|
|
has_call_in_queue = fields.Boolean("Is in the Call Queue", compute="_compute_has_call_in_queue")
|
|
|
|
def _compute_has_call_in_queue(self):
|
|
activity_count_by_res_id = dict(
|
|
self.env["mail.activity"]._read_group(
|
|
[
|
|
("res_id", "in", self.ids),
|
|
("res_model", "=", self._name),
|
|
("user_id", "=", self.env.uid),
|
|
("activity_type_id.category", "=", "phonecall"),
|
|
("date_deadline", "<=", fields.Date.today()),
|
|
"|",
|
|
("phone", "!=", False),
|
|
("mobile", "!=", False),
|
|
],
|
|
["res_id"],
|
|
["__count"],
|
|
)
|
|
)
|
|
for record in self:
|
|
record.has_call_in_queue = activity_count_by_res_id.get(record.id, 0) > 0
|
|
|
|
def create_call_activity(self):
|
|
if not self:
|
|
return self.env["mail.activity"]
|
|
# Ensure that a phonecall activity type exists beforehand, otherwise
|
|
# create one. This is important because we rely on this type to retrieve
|
|
# the activities to be displayed in the Next Activities tab.
|
|
phonecall_activity_type_id = self.env["ir.model.data"]._xmlid_to_res_id(
|
|
"mail.mail_activity_data_call", raise_if_not_found=False
|
|
)
|
|
if not phonecall_activity_type_id:
|
|
phonecall_activity_type_id = (
|
|
self.env["mail.activity.type"]
|
|
.search(
|
|
[
|
|
"|",
|
|
("res_model", "=", False),
|
|
("res_model", "=", self._name),
|
|
("category", "=", "phonecall"),
|
|
],
|
|
limit=1,
|
|
)
|
|
.id
|
|
)
|
|
if not phonecall_activity_type_id:
|
|
phonecall_activity_type_id = (
|
|
self.env["mail.activity.type"]
|
|
.sudo()
|
|
.create(
|
|
{
|
|
"category": "phonecall",
|
|
"delay_count": 2,
|
|
"icon": "fa-phone",
|
|
"name": _("Call"),
|
|
"sequence": 999,
|
|
}
|
|
)
|
|
.id
|
|
)
|
|
date_deadline = fields.Date.today(self)
|
|
res_model_id = self.env["ir.model"]._get_id(self._name)
|
|
activities = self.env["mail.activity"].create(
|
|
[
|
|
{
|
|
"activity_type_id": phonecall_activity_type_id,
|
|
"date_deadline": date_deadline,
|
|
"res_id": record.id,
|
|
"res_model_id": res_model_id,
|
|
"user_id": self.env.uid,
|
|
}
|
|
for record in self
|
|
]
|
|
)
|
|
failed_activities = activities.filtered(lambda activity: not activity.mobile and not activity.phone)
|
|
if failed_activities:
|
|
failed_records = self.browse(failed_activities.mapped("res_id"))
|
|
raise UserError(
|
|
_(
|
|
"Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s",
|
|
record_names=_(", ").join(failed_records.mapped("display_name")),
|
|
)
|
|
)
|
|
return activities
|
|
|
|
@api.model
|
|
def delete_call_activity(self, res_id):
|
|
related_activities = self.env["mail.activity"].search(
|
|
[
|
|
("res_id", "=", res_id),
|
|
("res_model", "=", self._name),
|
|
("user_id", "=", self.env.uid),
|
|
("activity_type_id.category", "=", "phonecall"),
|
|
("date_deadline", "<=", fields.Date.today()),
|
|
"|",
|
|
("phone", "!=", False),
|
|
("mobile", "!=", False),
|
|
]
|
|
)
|
|
self.env["bus.bus"]._sendmany(
|
|
[
|
|
[self.env.user.partner_id, "delete_call_activity", {"id": activity.id}]
|
|
for activity in related_activities
|
|
]
|
|
)
|
|
related_activities.unlink()
|