diff --git a/addons/calendar/models/calendar_event.py b/addons/calendar/models/calendar_event.py
index bdec6689e98..74b426ca256 100644
--- a/addons/calendar/models/calendar_event.py
+++ b/addons/calendar/models/calendar_event.py
@@ -3,7 +3,6 @@
import logging
import math
-from collections import defaultdict
from datetime import timedelta
from itertools import repeat
from werkzeug.urls import url_parse
@@ -66,6 +65,10 @@ class Meeting(models.Model):
DISCUSS_ROUTE = 'calendar/join_videocall'
+ @api.model
+ def get_state_selections(self):
+ return Attendee.STATE_SELECTION
+
@api.model
def default_get(self, fields):
# super default_model='crm.lead' for easier use in addons
@@ -160,8 +163,6 @@ class Meeting(models.Model):
# attendees
attendee_ids = fields.One2many(
'calendar.attendee', 'event_id', 'Participant')
- attendee_status = fields.Selection(
- Attendee.STATE_SELECTION, string='Attendee Status', compute='_compute_attendee')
partner_ids = fields.Many2many(
'res.partner', 'calendar_event_res_partner_rel',
string='Attendees', default=_default_partners)
@@ -349,12 +350,6 @@ class Meeting(models.Model):
'stop': enddate.replace(tzinfo=None)
})
- def _compute_attendee(self):
- mapped_attendees = self._find_attendee_batch()
- for meeting in self:
- attendee = mapped_attendees[meeting.id]
- meeting.attendee_status = attendee.state if attendee else 'needsAction'
-
@api.constrains('start', 'stop', 'start_date', 'stop_date')
def _check_closing_date(self):
for meeting in self:
@@ -1119,38 +1114,6 @@ class Meeting(models.Model):
# TOOLS
# ------------------------------------------------------------
- def _find_attendee_batch(self):
- """ Return the first attendee where the user connected has been invited
- or the attendee selected in the filter that is the owner
- from all the meeting_ids in parameters.
- """
- result = defaultdict(lambda: self.env['calendar.attendee'])
- self_attendees = self.attendee_ids.filtered(lambda a: a.partner_id == self.env.user.partner_id)
- for attendee in self_attendees:
- result[attendee.event_id.id] = attendee
- remaining_events = self - self_attendees.event_id
-
- events_checked_partners = self.env['calendar.filters'].search([
- ('user_id', '=', self.env.user.id),
- ('partner_id', 'in', remaining_events.attendee_ids.partner_id.ids),
- ('partner_checked', '=', True)
- ]).partner_id
- filter_events = self.env['calendar.event']
- for event in remaining_events:
- event_partners = event.attendee_ids.partner_id
- event_checked_partners = events_checked_partners & event_partners
- if event.partner_id in event_checked_partners and event.partner_id in event_partners:
- filter_events |= event
- result[event.id] = event.attendee_ids.filtered(lambda attendee: attendee.partner_id == event.partner_id)[:1]
- remaining_events -= filter_events
-
- for event in remaining_events:
- event_checked_partners = events_checked_partners & event_partners
- attendee = event.attendee_ids.filtered(
- lambda a: a.partner_id in event_checked_partners and a.state != "needsAction")
- result[event.id] = attendee[:1]
- return result
-
# YTI TODO MASTER: Remove deprecated method
def _find_attendee(self):
""" Return the first attendee where the user connected has been invited
diff --git a/addons/calendar/models/res_users.py b/addons/calendar/models/res_users.py
index fb4fc39ccff..e4467d2bd34 100644
--- a/addons/calendar/models/res_users.py
+++ b/addons/calendar/models/res_users.py
@@ -11,6 +11,10 @@ class Users(models.Model):
_inherit = 'res.users'
def _systray_get_calendar_event_domain(self):
+ current_user_non_declined_attendee_ids = self.env['calendar.attendee']._search([
+ ('partner_id', '=', self.env.user.partner_id.id),
+ ('state', '!=', 'declined'),
+ ])
tz = self.env.user.tz
start_dt = datetime.datetime.utcnow()
if tz:
@@ -30,7 +34,7 @@ class Users(models.Model):
'&',
['allday', '=', True],
['start_date', '=', fields.Date.to_string(start_date)],
- ('attendee_ids.partner_id', '=', self.env.user.partner_id.id)]
+ ('attendee_ids', 'in', current_user_non_declined_attendee_ids)]
@api.model
def systray_get_activities(self):
@@ -38,9 +42,8 @@ class Users(models.Model):
meetings_lines = self.env['calendar.event'].search_read(
self._systray_get_calendar_event_domain(),
- ['id', 'start', 'name', 'allday', 'attendee_status'],
+ ['id', 'start', 'name', 'allday'],
order='start')
- meetings_lines = [line for line in meetings_lines if line['attendee_status'] != 'declined']
if meetings_lines:
meeting_label = _("Today's Meetings")
meetings_systray = {
diff --git a/addons/calendar/static/src/views/attendee_calendar/common/attendee_calendar_common_popover.js b/addons/calendar/static/src/views/attendee_calendar/common/attendee_calendar_common_popover.js
index b9c7817a4d9..272493bb9b8 100644
--- a/addons/calendar/static/src/views/attendee_calendar/common/attendee_calendar_common_popover.js
+++ b/addons/calendar/static/src/views/attendee_calendar/common/attendee_calendar_common_popover.js
@@ -1,5 +1,6 @@
/** @odoo-module **/
+import { onWillStart } from "@odoo/owl";
import { CalendarCommonPopover } from "@web/views/calendar/calendar_common/calendar_common_popover";
import { useService } from "@web/core/utils/hooks";
import { useAskRecurrenceUpdatePolicy } from "@calendar/views/ask_recurrence_update_policy_hook";
@@ -12,8 +13,17 @@ export class AttendeeCalendarCommonPopover extends CalendarCommonPopover {
this.user = useService("user");
this.orm = useService("orm");
this.askRecurrenceUpdatePolicy = useAskRecurrenceUpdatePolicy();
+
+ onWillStart(this.onWillStart);
+ }
+
+ async onWillStart() {
// Show status dropdown if user is in attendees list
if (this.isCurrentUserAttendee) {
+ const stateSelections = await this.env.services.orm.call(
+ this.props.model.resModel,
+ "get_state_selections",
+ );
this.statusColors = {
accepted: "text-success",
declined: "text-danger",
@@ -21,7 +31,7 @@ export class AttendeeCalendarCommonPopover extends CalendarCommonPopover {
needsAction: "text-dark",
};
this.statusInfo = {};
- for (const selection of this.props.model.fields.attendee_status.selection) {
+ for (const selection of stateSelections) {
this.statusInfo[selection[0]] = {
text: selection[1],
color: this.statusColors[selection[0]],
diff --git a/addons/calendar/static/tests/helpers/mock_server/models/res_users.js b/addons/calendar/static/tests/helpers/mock_server/models/res_users.js
index 0ec1bb7126e..163f72ff321 100644
--- a/addons/calendar/static/tests/helpers/mock_server/models/res_users.js
+++ b/addons/calendar/static/tests/helpers/mock_server/models/res_users.js
@@ -19,7 +19,7 @@ patch(MockServer.prototype, {
startDate.setUTCHours(0, 0, 0, 0);
const endDate = new Date();
endDate.setUTCHours(23, 59, 59, 999);
- const currentPartnerAttendeeIds = this.pyEnv['calendar.attendee'].search([['partner_id', '=', this.pyEnv.currentPartnerId]]);
+ const currentPartnerAttendeeIds = this.pyEnv['calendar.attendee'].search([['partner_id', '=', this.pyEnv.currentPartnerId], ['state', '!=', 'declined']]);
return [
'&',
'|',
@@ -45,10 +45,10 @@ patch(MockServer.prototype, {
const meetingsLines = this.pyEnv['calendar.event'].searchRead(
this._mockResUsers_SystrayGetCalendarEventDomain(),
{
- fields: ['id', 'start', 'name', 'allday', 'attendee_status'],
+ fields: ['id', 'start', 'name', 'allday'],
order: 'start',
}
- ).filter(meetingLine => meetingLine['attendee_status'] !== 'declined');
+ )
if (meetingsLines.length) {
activities.unshift({
id: 'calendar.event', // for simplicity
diff --git a/addons/calendar/views/calendar_views.xml b/addons/calendar/views/calendar_views.xml
index 61ef4b5bfb0..390cae0d4ee 100644
--- a/addons/calendar/views/calendar_views.xml
+++ b/addons/calendar/views/calendar_views.xml
@@ -112,7 +112,6 @@