[FIX] hr_work_entry_contract: Batch calendar leave search

X-original-commit: b8166297fed24d4a7e13ebc37e670b670c2a2575
This commit is contained in:
Yannick Tivisse
2022-03-30 17:04:49 +02:00
parent 1ffc2eadc5
commit 588be815e2
@@ -1,6 +1,9 @@
# -*- coding:utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import itertools
import pytz
from collections import defaultdict
from datetime import datetime, date
from dateutil.relativedelta import relativedelta
@@ -10,7 +13,6 @@ from odoo.addons.resource.models.resource import datetime_to_string, string_to_d
from odoo.osv import expression
from odoo.exceptions import UserError
import pytz
class HrContract(models.Model):
_inherit = 'hr.contract'
@@ -60,6 +62,9 @@ class HrContract(models.Model):
employees_by_calendar = defaultdict(lambda: self.env['hr.employee'])
for contract in self:
employees_by_calendar[contract.resource_calendar_id] |= contract.employee_id
all_resources = self.employee_id.resource_id
attendances_by_calendar = {
calendar: calendar._attendance_intervals_batch(
start_dt,
@@ -68,6 +73,20 @@ class HrContract(models.Model):
tz=pytz.timezone(calendar.tz)
) for calendar, employees in employees_by_calendar.items()}
resource_calendar_leaves = self.env['resource.calendar.leaves'].search([
('time_type', '=', 'leave'),
# ('calendar_id', '=', self.id), --> Get all the time offs
('resource_id', 'in', [False] + all_resources.ids),
('date_from', '<=', datetime_to_string(end_dt)),
('date_to', '>=', datetime_to_string(start_dt)),
('company_id', '=', self.env.company.id),
])
# {resource: resource_calendar_leaves}
leaves_by_resource = defaultdict(lambda: self.env['resource.calendar.leaves'])
for leave in resource_calendar_leaves:
leaves_by_resource[leave.resource_id.id] |= leave
tz_dates = {}
for contract in self:
employee = contract.employee_id
calendar = contract.resource_calendar_id
@@ -81,21 +100,9 @@ class HrContract(models.Model):
# YTI TODO: This mimics the behavior of _leave_intervals_batch, while waiting to be cleaned
# in master.
resources_list = [self.env['resource.resource'], resource]
resource_ids = [False, resource.id]
leave_domain = [
('time_type', '=', 'leave'),
# ('calendar_id', '=', self.id), --> Get all the time offs
('resource_id', 'in', resource_ids),
('date_from', '<=', datetime_to_string(end_dt)),
('date_to', '>=', datetime_to_string(start_dt)),
('company_id', '=', self.env.company.id),
]
result = defaultdict(lambda: [])
tz_dates = {}
for leave in self.env['resource.calendar.leaves'].search(leave_domain):
for leave in itertools.chain(leaves_by_resource[False], leaves_by_resource[resource.id]):
for resource in resources_list:
if leave.resource_id.id not in [False, resource.id]:
continue
tz = tz if tz else pytz.timezone((resource or contract).tz)
if (tz, start_dt) in tz_dates:
start = tz_dates[(tz, start_dt)]