[FIX] calendar: invitation for deleted event (recurring)

From calendar create a recursive event and add some guests. Delete one
event of the chain.

Invitations (Mail) will be created for the deleted event, and should not
be the case because the event has been deleted.

This happens because the recursive event is really just a record in the
database representing all the generated events. When the user want to
delete an event in the chain, a new event, copy of the "parent" event
has to be registered and subsequently disabled.
In the process of creating the event the mail is sent as
side effect. Note that the code to prevent this was partially there
because a context flag "dont_notify" is sent by the unlink in
Calendar.Meeting but was ignored from the mail subsystem.

opw-2039576

closes odoo/odoo#36270

Signed-off-by: Nans Lefebvre (len) <len@odoo.com>
This commit is contained in:
Andrea Grazioso (agr-odoo)
2019-09-02 09:45:51 +00:00
parent 4181063031
commit b8c7eddb34
2 changed files with 62 additions and 2 deletions
+4 -2
View File
@@ -1065,11 +1065,13 @@ class Meeting(models.Model):
meeting_attendees |= attendee
meeting_partners |= partner
if meeting_attendees:
if meeting_attendees and not self._context.get('detaching'):
to_notify = meeting_attendees.filtered(lambda a: a.email != current_user.email)
to_notify._send_mail_to_attendees('calendar.calendar_template_meeting_invitation')
if meeting_attendees:
meeting.write({'attendee_ids': [(4, meeting_attendee.id) for meeting_attendee in meeting_attendees]})
if meeting_partners:
meeting.message_subscribe(partner_ids=meeting_partners.ids)
@@ -1417,7 +1419,7 @@ class Meeting(models.Model):
# do not copy the id
if data.get('id'):
del data['id']
return meeting_origin.copy(default=data)
return meeting_origin.with_context(detaching=True).copy(default=data)
@api.multi
def action_detach_recurring_event(self):
+58
View File
@@ -7,6 +7,7 @@ from datetime import datetime, timedelta, time
from odoo import fields
from odoo.tests.common import TransactionCase
import pytz
import re
class TestCalendar(TransactionCase):
@@ -384,3 +385,60 @@ class TestCalendar(TransactionCase):
})
self.assertEqual(str(activity_id.date_deadline), '2018-10-16')
def test_event_creation_mail(self):
"""
Check that mail are sent to the attendees on event creation
Check that mail are sent to the added attendees on event edit
Check that mail are NOT sent to the attendees when detaching a recurring event
"""
def _test_one_mail_per_attendee(self, m, partners):
# check that every attendee receive a (single) mail for the event
for partner in partners:
mail = self.env['mail.mail'].search([
('recipient_ids', 'in', partner.id),
('subject', 'like', m.name),
])
self.assertEqual(len(mail), 1)
partners = [
self.env['res.partner'].create({'name':'testuser0','email': u'bob@example.com'}),
self.env['res.partner'].create({'name':'testuser1','email': u'alice@example.com'}),
]
partner_ids = [(6, False, [p.id for p in partners]),]
now = fields.Datetime.now()
m = self.CalendarEvent.create({
'name': "mailTest1",
'allday': False,
'rrule': u'FREQ=DAILY;INTERVAL=1;COUNT=5',
'duration': 0.5,
'partner_ids': partner_ids,
'start': fields.Datetime.to_string(now + timedelta(days=10)),
'stop': fields.Datetime.to_string(now + timedelta(days=15)),
})
# every partner should have 1 mail sent
_test_one_mail_per_attendee(self, m, partners)
# adding more partners to the event
partners.extend([
self.env['res.partner'].create({'name':'testuser2','email': u'marc@example.com'}),
self.env['res.partner'].create({'name':'testuser3','email': u'carl@example.com'}),
self.env['res.partner'].create({'name':'testuser4','email': u'alain@example.com'}),
])
partner_ids = [(6, False, [p.id for p in partners]),]
m.write({'partner_ids': partner_ids})
# more email should be sent
_test_one_mail_per_attendee(self, m, partners)
# calculate virtualid to detach one event
virtid = str(m.id) + '-' + ''.join(re.split('[\D]', fields.Datetime.to_string(now + timedelta(days=12))))
# detaching a virtual event in the chain
self.env['calendar.event'].browse(virtid).detach_recurring_event(values={'active':False})
# since the detach actually create an event in the backend
# we check that no mail notifications are sent to the attendees
_test_one_mail_per_attendee(self, m, partners)