[FIX] calendar: add attendee_id for deletion

Steps to reproduce:
-------------------
- create an event in the calendar;
- click on "Everybody's calendars" filter;
- delete the event.

Issue:
------
The event name is crossed out (declined)
instead of being deleted,
even if we are the organizer.

Cause:
------
The value of `event.attendee_id` inside the
`_onDeleteRecord` is `undefined`.
The condition will therefore never be `true`.

Solution:
---------
Add the organizer's id to the event
so that he can delete it in the case
of "Everybody's calendars" filter.

Note:
-----
Correct decline event from calendar view.

opw-3230254

closes odoo/odoo#133298

X-original-commit: 4ef44f403f1c93b62230307f5fa909b8a83f4eb8
Signed-off-by: Arnaud Joset (arj) <arj@odoo.com>
Signed-off-by: Thomas Lefebvre (thle) <thle@odoo.com>
This commit is contained in:
Thomas Lefebvre (thle)
2023-08-28 21:29:58 +00:00
parent c2b93f7f0e
commit e5b41a63a4
4 changed files with 161 additions and 2 deletions
@@ -79,7 +79,7 @@ export class AttendeeCalendarController extends CalendarController {
this.orm.call(
"calendar.attendee",
"do_decline",
[record.attendeeId],
[record.calendarAttendeeId],
).then(this.model.load.bind(this.model));
}
}
@@ -107,6 +107,7 @@ export class AttendeeCalendarModel extends CalendarModel {
record.attendeeStatus = attendeeInfo.status;
record.isAlone = attendeeInfo.is_alone;
record.isCurrentPartner = attendeeInfo.id === currentPartnerId;
record.calendarAttendeeId = attendeeInfo.attendee_id;
}
const recordId = duplicatedRecords ? duplicatedRecordIdx-- : record.id;
// Index in the records
@@ -118,12 +119,15 @@ export class AttendeeCalendarModel extends CalendarModel {
data.records = newRecords;
} else {
for (const event of Object.values(data.records)) {
const eventData = event.rawRecord;
event.attendeeId = eventData.partner_id && eventData.partner_id[0]
const attendeeInfo = data.attendees.find(a => (
a.id === currentPartnerId &&
a.event_id === event.id
));
if (attendeeInfo) {
event.isAlone = attendeeInfo.is_alone;
event.calendarAttendeeId = attendeeInfo.attendee_id;
}
}
}
@@ -69,3 +69,85 @@
content: 'Check the event title',
},
]});
registry.category("web_tour.tours").add('test_calendar_delete_tour', {
test: true,
steps: () => [
{
content: 'Select filter (everybody)',
trigger: 'div[data-value="all"] input',
},
{
content: 'Click on the event (focus + waiting)',
trigger: 'a .fc-content:contains("Test Event")',
async run() {
$('a .fc-content:contains("Test Event")').click();
await new Promise((r) => setTimeout(r, 1000));
$('a .fc-content:contains("Test Event")').click();
}
},
{
content: 'Delete the event',
trigger: '.o_cw_popover_delete',
},
{
content: 'Validate the deletion',
trigger:'button:contains("Delete")',
async run() {
$('button:contains("Delete")').click();
await new Promise((r) => setTimeout(r, 1000));
}
},
]});
registry.category("web_tour.tours").add('test_calendar_decline_tour', {
test: true,
steps: () => [
{
content: 'Click on the event (focus + waiting)',
trigger: 'a .fc-content:contains("Test Event")',
async run() {
$('a .fc-content:contains("Test Event")').click();
await new Promise((r) => setTimeout(r, 1000));
$('a .fc-content:contains("Test Event")').click();
}
},
{
content: 'Delete the event',
trigger: '.o_cw_popover_delete',
},
{
content: 'Wait declined status',
trigger: '.o_attendee_status_declined',
},
]});
registry.category("web_tour.tours").add('test_calendar_decline_with_everybody_filter_tour', {
test: true,
steps: () => [
{
content: 'Select filter (everybody)',
trigger: 'div[data-value="all"] input',
},
{
content: 'Click on the event (focus + waiting)',
trigger: 'a .fc-content:contains("Test Event")',
async run() {
$('a .fc-content:contains("Test Event")').click();
await new Promise((r) => setTimeout(r, 1000));
$('a .fc-content:contains("Test Event")').click();
}
},
{
content: 'Delete the event',
trigger: '.o_cw_popover_delete',
},
{
content: 'Select filter (everybody)',
trigger: 'div[data-value="all"] input',
},
{
content: 'Wait declined status',
trigger: '.o_attendee_status_declined',
},
]});
+74 -1
View File
@@ -2,7 +2,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import datetime
from datetime import datetime, timedelta, time
from datetime import date, datetime, timedelta
from odoo import fields, Command
from odoo.tests import Form, HttpCase, tagged
@@ -422,3 +422,76 @@ class TestCalendarTours(HttpCase):
def test_calendar_month_view_start_hour_displayed(self):
""" Test that the time is displayed in the month view. """
self.start_tour("/web", 'calendar_appointments_hour_tour', login="demo")
def test_calendar_delete_tour(self):
"""
Check that we can delete events with the "Everybody's calendars" filter.
"""
user_admin = self.env.ref('base.user_admin')
start = datetime.combine(date.today(), datetime.min.time()).replace(hour=9)
stop = datetime.combine(date.today(), datetime.min.time()).replace(hour=12)
event = self.env['calendar.event'].with_user(user_admin).create({
'name': 'Test Event',
'description': 'Test Description',
'start': start.strftime("%Y-%m-%d %H:%M:%S"),
'stop': stop.strftime("%Y-%m-%d %H:%M:%S"),
'duration': 3,
'location': 'Odoo S.A.',
'privacy': 'public',
'show_as': 'busy',
})
action_id = self.env.ref('calendar.action_calendar_event')
url = "/web#action=" + str(action_id.id) + '&view_type=calendar'
self.start_tour(url, 'test_calendar_delete_tour', login='admin')
event = self.env['calendar.event'].search([('name', '=', 'Test Event')])
self.assertFalse(event) # Check if the event has been correctly deleted
def test_calendar_decline_tour(self):
"""
Check that we can decline events.
"""
user_admin = self.env.ref('base.user_admin')
user_demo = self.env.ref('base.user_demo')
start = datetime.combine(date.today(), datetime.min.time()).replace(hour=9)
stop = datetime.combine(date.today(), datetime.min.time()).replace(hour=12)
event = self.env['calendar.event'].with_user(user_admin).create({
'name': 'Test Event',
'description': 'Test Description',
'start': start.strftime("%Y-%m-%d %H:%M:%S"),
'stop': stop.strftime("%Y-%m-%d %H:%M:%S"),
'duration': 3,
'location': 'Odoo S.A.',
'privacy': 'public',
'show_as': 'busy',
})
event.partner_ids = [Command.link(user_demo.partner_id.id)]
action_id = self.env.ref('calendar.action_calendar_event')
url = "/web#action=" + str(action_id.id) + '&view_type=calendar'
self.start_tour(url, 'test_calendar_decline_tour', login='demo')
attendee = self.env['calendar.attendee'].search([('event_id', '=', event.id), ('partner_id', '=', user_demo.partner_id.id)])
self.assertEqual(attendee.state, 'declined') # Check if the event has been correctly declined
def test_calendar_decline_with_everybody_filter_tour(self):
"""
Check that we can decline events with the "Everybody's calendars" filter.
"""
user_admin = self.env.ref('base.user_admin')
user_demo = self.env.ref('base.user_demo')
start = datetime.combine(date.today(), datetime.min.time()).replace(hour=9)
stop = datetime.combine(date.today(), datetime.min.time()).replace(hour=12)
event = self.env['calendar.event'].with_user(user_admin).create({
'name': 'Test Event',
'description': 'Test Description',
'start': start.strftime("%Y-%m-%d %H:%M:%S"),
'stop': stop.strftime("%Y-%m-%d %H:%M:%S"),
'duration': 3,
'location': 'Odoo S.A.',
'privacy': 'public',
'show_as': 'busy',
})
event.partner_ids = [Command.link(user_demo.partner_id.id)]
action_id = self.env.ref('calendar.action_calendar_event')
url = "/web#action=" + str(action_id.id) + '&view_type=calendar'
self.start_tour(url, 'test_calendar_decline_with_everybody_filter_tour', login='demo')
attendee = self.env['calendar.attendee'].search([('event_id', '=', event.id), ('partner_id', '=', user_demo.partner_id.id)])
self.assertEqual(attendee.state, 'declined') # Check if the event has been correctly declined