From efac5707d159d2af9c45ae3116aac5195ef0b066 Mon Sep 17 00:00:00 2001 From: Kartik Chavda Date: Thu, 22 Jun 2023 04:57:42 +0000 Subject: [PATCH] [REM] calendar: remove `attendee_status` field Purpose of this commit to remove `attendee_status` field which was only usefull in one place where it can be easily replacable and also this field contains some heavy computation and added in calendar view which might be cause some perfomance issues. So, in this commit remove `attendee_status` field and its related code and replace it be alternative which gives desire output as before. task-3390334 Part-of: odoo/odoo#126768 --- addons/calendar/models/calendar_event.py | 45 ++----------------- addons/calendar/models/res_users.py | 9 ++-- .../attendee_calendar_common_popover.js | 12 ++++- .../helpers/mock_server/models/res_users.js | 6 +-- addons/calendar/views/calendar_views.xml | 2 - .../views/google_calendar_views.xml | 2 +- .../views/microsoft_calendar_views.xml | 2 +- 7 files changed, 26 insertions(+), 52 deletions(-) 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 - +