social/mail_activity_team/models/mail_activity_mixin.py

99 lines
3.7 KiB
Python

# Copyright 2021 Tecnativa - David Vidal
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
class MailActivityMixin(models.AbstractModel):
_inherit = "mail.activity.mixin"
activity_team_user_ids = fields.Many2many(
comodel_name="res.users",
string="test field",
compute="_compute_activity_team_user_ids",
search="_search_activity_team_user_ids",
)
@api.depends("activity_ids")
def _compute_activity_team_user_ids(self):
for rec in self:
rec.activity_team_user_ids = rec.activity_ids.mapped("team_id.member_ids")
def _search_my_activity_date_deadline(self, operator, operand):
if not self._context.get("team_activities", False):
return super()._search_my_activity_date_deadline(operator, operand)
query = """
SELECT res_users_id
FROM mail_activity_team_users_rel
WHERE mail_activity_team_id IN (
SELECT mail_activity_team_id
FROM mail_activity_team_users_rel
WHERE res_users_id = %(user_id)s)
"""
user = self.env.uid
self.env.cr.execute(
query,
{
"user_id": user,
},
)
users = [row[0] for row in self.env.cr.fetchall()]
activity_ids = self.env["mail.activity"]._search(
[
("date_deadline", operator, operand),
("res_model", "=", self._name),
("user_id", "in", users),
]
)
return [("activity_ids", "in", activity_ids)]
@api.model
def _search_activity_team_user_ids(self, operator, operand):
return [("activity_ids.team_id.member_ids", operator, operand)]
def activity_schedule(
self, act_type_xmlid="", date_deadline=None, summary="", note="", **act_values
):
"""With automatic activities, the user onchange won't act so we must
ensure the right group is set and no exceptions are raised due to
user-team missmatch. We can hook onto `act_values` dict as it's passed
to the create activity method.
"""
if self.env.context.get("force_activity_team"):
act_values["team_id"] = self.env.context["force_activity_team"].id
if "team_id" not in act_values:
if act_type_xmlid:
activity_type = self.sudo().env.ref(act_type_xmlid)
else:
activity_type = (
self.env["mail.activity.type"]
.sudo()
.browse(act_values["activity_type_id"])
)
if activity_type.default_team_id:
act_values.update({"team_id": activity_type.default_team_id.id})
if (
not act_values.get("user_id")
and activity_type.default_team_id.member_ids
):
act_values.update(
{"user_id": activity_type.default_team_id.member_ids[:1].id}
)
else:
user_id = act_values.get("user_id")
if user_id:
team = (
self.env["mail.activity"]
.with_context(
default_res_model=self._name,
)
._get_default_team_id(user_id=user_id)
)
act_values.update({"team_id": team.id})
return super().activity_schedule(
act_type_xmlid=act_type_xmlid,
date_deadline=date_deadline,
summary=summary,
note=note,
**act_values
)