mirror of https://github.com/OCA/social.git
118 lines
4.5 KiB
Python
118 lines
4.5 KiB
Python
# Copyright 2018 Eficent Business and IT Consulting Services, S.L.
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
from odoo import api, models, fields, _
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class MailActivity(models.Model):
|
|
_inherit = "mail.activity"
|
|
|
|
def _get_default_team_id(self, user_id=None):
|
|
if not user_id:
|
|
user_id = self.env.uid
|
|
res_model = self.env.context.get('default_res_model')
|
|
model = self.env['ir.model'].search(
|
|
[('model', '=', res_model)], limit=1)
|
|
domain = [('member_ids', 'in', [user_id])]
|
|
if res_model:
|
|
domain.extend(['|', ('res_model_ids', '=', False),
|
|
('res_model_ids', 'in', model.ids)])
|
|
return self.env['mail.activity.team'].search(domain, limit=1)
|
|
|
|
user_id = fields.Many2one(required=False)
|
|
|
|
team_id = fields.Many2one(
|
|
comodel_name='mail.activity.team',
|
|
default=lambda s: s._get_default_team_id(),
|
|
)
|
|
|
|
@api.onchange('user_id')
|
|
def _onchange_user_id(self):
|
|
res = {'domain': {'team_id': []}}
|
|
if not self.user_id:
|
|
return res
|
|
res['domain']['team_id'] = [
|
|
'|',
|
|
('res_model_ids', '=', False),
|
|
('res_model_ids', 'in', self.res_model_id.ids)]
|
|
if self.team_id and self.user_id in self.team_id.member_ids:
|
|
return res
|
|
self.team_id = self.with_context(
|
|
default_res_model=self.res_model_id.id). \
|
|
_get_default_team_id(user_id=self.user_id.id)
|
|
return res
|
|
|
|
@api.onchange('team_id')
|
|
def _onchange_team_id(self):
|
|
res = {'domain': {'user_id': []}}
|
|
if not self.team_id:
|
|
return res
|
|
res['domain']['user_id'] = [('id', 'in', self.team_id.member_ids.ids)]
|
|
if self.user_id not in self.team_id.member_ids:
|
|
if self.team_id.user_id:
|
|
self.user_id = self.team_id.user_id
|
|
elif len(self.team_id.member_ids) == 1:
|
|
self.user_id = self.team_id.member_ids
|
|
else:
|
|
self.user_id = self.env['res.users']
|
|
return res
|
|
|
|
@api.multi
|
|
@api.constrains('team_id', 'user_id')
|
|
def _check_team_and_user(self):
|
|
for activity in self:
|
|
if activity.team_id and activity.user_id and \
|
|
activity.user_id not in self.team_id.member_ids:
|
|
raise ValidationError(
|
|
_(
|
|
"The assigned user %s is not member of the team %s."
|
|
% (activity.user_id.display_name, activity.team_id.name)
|
|
)
|
|
)
|
|
|
|
@api.multi
|
|
def action_create_calendar_event(self):
|
|
res = super().action_create_calendar_event()
|
|
res['context']['default_team_id'] = self.team_id.id or False
|
|
return res
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
activity_user = super().create(vals)
|
|
if activity_user.team_id and not activity_user.user_id and \
|
|
activity_user.date_deadline <= fields.Date.today():
|
|
for partner_id in activity_user.team_id.mapped("member_ids.partner_id.id"):
|
|
self.env['bus.bus'].sendone(
|
|
(self._cr.dbname, 'res.partner', partner_id),
|
|
{'type': 'activity_updated', 'activity_created': True}
|
|
)
|
|
return activity_user
|
|
|
|
@api.multi
|
|
def write(self, values):
|
|
self._check_access('write')
|
|
if values.get('team_id'):
|
|
pre_responsibles = {
|
|
activity: activity.team_id.mapped("member_ids.partner_id")
|
|
for activity in self
|
|
}
|
|
res = super(MailActivity, self.sudo()).write(values)
|
|
|
|
if values.get('team_id'):
|
|
today = fields.Date.today()
|
|
for activity in self:
|
|
if activity.date_deadline <= today:
|
|
for partner in activity.team_id.member_ids.mapped("partner_id"):
|
|
self.env['bus.bus'].sendone(
|
|
(self._cr.dbname, 'res.partner', partner.id),
|
|
{'type': 'activity_updated', 'activity_created': True}
|
|
)
|
|
for activity in pre_responsibles:
|
|
if activity.date_deadline <= today:
|
|
for partner in pre_responsibles[activity]:
|
|
self.env['bus.bus'].sendone(
|
|
(self._cr.dbname, 'res.partner', partner.id),
|
|
{'type': 'activity_updated', 'activity_deleted': True}
|
|
)
|
|
return res
|