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 @@ -
@@ -355,7 +354,6 @@ quick_add="%(calendar.view_calendar_event_form_quick_create)d" color="partner_ids"> - diff --git a/addons/google_calendar/views/google_calendar_views.xml b/addons/google_calendar/views/google_calendar_views.xml index 1d22a10e548..6bf3be21e9d 100644 --- a/addons/google_calendar/views/google_calendar_views.xml +++ b/addons/google_calendar/views/google_calendar_views.xml @@ -5,7 +5,7 @@ calendar.event - + diff --git a/addons/microsoft_calendar/views/microsoft_calendar_views.xml b/addons/microsoft_calendar/views/microsoft_calendar_views.xml index dd0db461d64..099a96ed37b 100644 --- a/addons/microsoft_calendar/views/microsoft_calendar_views.xml +++ b/addons/microsoft_calendar/views/microsoft_calendar_views.xml @@ -5,7 +5,7 @@ calendar.event - +