[FIX] hr_holidays : keep leave out of approver's calendar

Steps :
Install modules hr_holidays and google_calendar;
Log into Odoo with two different users, one manager and one employee (subordinated): f.e. Admin e Demo;
Set Google Client ID and Google Secret with a OAuth2.0;
Check if in Odoo's Calendar the Synched with Google tag compares on the right (with manager);
From employee user, go to Time Off -> My Time Off -> My Time Off Requests and Create with a date;
From manager user, go to Time Off -> Managers -> Time Off and accept the time off created;
Go to manager's Google Calendar.

Current behavior:
Google event is created and visible for manager, employee has an event since is an attendee of the first.

Expected behavior:
Google event is created and visible for employee, manager is not involved.

Fix:
Group the leaves with user and create events with this user.
We could not modify easily the behavior of the calendar sync modules.
The following approach was tested: odoo/odoo#86385
But it has some side effects on recurring events, oultier events
(events not following the recurrence) and could bring performance issues.
The solution of this fix was chosen because it is less intrusive.

opw-2761158

closes odoo/odoo#88607

X-original-commit: ce96dd4f7488ce66d3fda5fd09a4566424c52bd2
Signed-off-by: Arnaud Joset <arj@odoo.com>
Signed-off-by: Onockx Audric (auon) <auon@odoo.com>
This commit is contained in:
Audric Onockx (auon)
2022-04-15 09:26:41 +02:00
parent 35b74b1b42
commit d42e7e1991
+19 -14
View File
@@ -1119,21 +1119,26 @@ class HolidaysRequest(models.Model):
holidays = self.filtered(lambda request: request.holiday_type == 'employee' and request.employee_id)
holidays._create_resource_leave()
meeting_holidays = holidays.filtered(lambda l: l.holiday_status_id.create_calendar_meeting)
meetings = self.env['calendar.event']
if meeting_holidays:
meeting_values = meeting_holidays._prepare_holidays_meeting_values()
meetings = self.env['calendar.event'].with_context(
no_mail_to_attendees=True,
calendar_no_videocall=True,
active_model=self._name
).create(meeting_values)
for holiday, meeting in zip(meeting_holidays, meetings):
holiday.meeting_id = meeting
meeting_values_for_user_id = meeting_holidays._prepare_holidays_meeting_values()
Meeting = self.env['calendar.event']
for user_id, meeting_values in meeting_values_for_user_id.items():
meetings += Meeting.with_user(user_id or self.env.uid).with_context(
no_mail_to_attendees=True,
calendar_no_videocall=True,
active_model=self._name
).create(meeting_values)
Holiday = self.env['hr.leave']
for meeting in meetings:
Holiday.browse(meeting.res_id).meeting_id = meeting
def _prepare_holidays_meeting_values(self):
result = []
result = defaultdict(list)
company_calendar = self.env.company.resource_calendar_id
for holiday in self:
calendar = holiday.employee_id.resource_calendar_id or company_calendar
user = holiday.user_id
if holiday.leave_type_request_unit == 'hour':
meeting_name = _("%s on Time Off : %.2f hour(s)") % (holiday.employee_id.name or holiday.category_id.name, holiday.number_of_hours_display)
else:
@@ -1142,20 +1147,20 @@ class HolidaysRequest(models.Model):
'name': meeting_name,
'duration': holiday.number_of_days * (calendar.hours_per_day or HOURS_PER_DAY),
'description': holiday.notes,
'user_id': holiday.user_id.id,
'user_id': user.id,
'start': holiday.date_from,
'stop': holiday.date_to,
'allday': False,
'privacy': 'confidential',
'event_tz': holiday.user_id.tz,
'event_tz': user.tz,
'activity_ids': [(5, 0, 0)],
'res_id': holiday.id,
}
# Add the partner_id (if exist) as an attendee
if holiday.user_id and holiday.user_id.partner_id:
if user and user.partner_id:
meeting_values['partner_ids'] = [
(4, holiday.user_id.partner_id.id)]
result.append(meeting_values)
(4, user.partner_id.id)]
result[user.id].append(meeting_values)
return result
def _prepare_employees_holiday_values(self, employees):