From 3ee6b735fe6d69968c53a1a0a210ccc255c89850 Mon Sep 17 00:00:00 2001 From: Yannick Tivisse Date: Wed, 21 Dec 2022 16:32:10 +0100 Subject: [PATCH] [FIX] hr_work_entry_contract: Improve work entries generation perf --- addons/hr_work_entry_contract/models/hr_contract.py | 9 ++++++--- .../hr_work_entry_contract/tests/test_global_time_off.py | 2 +- addons/hr_work_entry_holidays/tests/test_performance.py | 6 +++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/addons/hr_work_entry_contract/models/hr_contract.py b/addons/hr_work_entry_contract/models/hr_contract.py index bcbe9701d51..fb0b75e5d4f 100644 --- a/addons/hr_work_entry_contract/models/hr_contract.py +++ b/addons/hr_work_entry_contract/models/hr_contract.py @@ -11,6 +11,7 @@ from dateutil.relativedelta import relativedelta from odoo import api, fields, models, _ from odoo.addons.resource.models.utils import string_to_datetime, Intervals from odoo.osv import expression +from odoo.tools import ormcache from odoo.exceptions import UserError @@ -32,8 +33,10 @@ class HrContract(models.Model): ''' ) - def _get_default_work_entry_type(self): - return self.env.ref('hr_work_entry.work_entry_type_attendance', raise_if_not_found=False) + @ormcache('self.structure_type_id') + def _get_default_work_entry_type_id(self): + attendance = self.env.ref('hr_work_entry.work_entry_type_attendance', raise_if_not_found=False) + return attendance.id if attendance else False def _get_leave_work_entry_type_dates(self, leave, date_from, date_to, employee): return self._get_leave_work_entry_type(leave) @@ -110,7 +113,7 @@ class HrContract(models.Model): self.ensure_one() if 'work_entry_type_id' in interval[2] and interval[2].work_entry_type_id[:1]: return interval[2].work_entry_type_id[:1] - return self._get_default_work_entry_type() + return self.env['hr.work.entry.type'].browse(self._get_default_work_entry_type_id()) def _get_valid_leave_intervals(self, attendances, interval): self.ensure_one() diff --git a/addons/hr_work_entry_contract/tests/test_global_time_off.py b/addons/hr_work_entry_contract/tests/test_global_time_off.py index c4b7f925b14..bd388a0c04f 100644 --- a/addons/hr_work_entry_contract/tests/test_global_time_off.py +++ b/addons/hr_work_entry_contract/tests/test_global_time_off.py @@ -29,7 +29,7 @@ class TestGlobalTimeOff(TestWorkEntryBase): contract.date_generated_from = start contract.date_generated_to = start work_entries = contract._generate_work_entries(start, end) - self.assertEqual(work_entries.work_entry_type_id, contract._get_default_work_entry_type()) + self.assertEqual(work_entries.work_entry_type_id.id, contract._get_default_work_entry_type_id()) work_entries.unlink() contract.date_generated_from = start contract.date_generated_to = start diff --git a/addons/hr_work_entry_holidays/tests/test_performance.py b/addons/hr_work_entry_holidays/tests/test_performance.py index 2b1844012ae..461a907e964 100644 --- a/addons/hr_work_entry_holidays/tests/test_performance.py +++ b/addons/hr_work_entry_holidays/tests/test_performance.py @@ -6,7 +6,7 @@ from odoo.addons.hr_work_entry_holidays.tests.common import TestWorkEntryHoliday from odoo.tests.common import users, warmup, tagged -@tagged('work_entry_perf') +@tagged('work_entry_holidays_perf') class TestWorkEntryHolidaysPerformance(TestWorkEntryHolidaysBase): @classmethod @@ -32,7 +32,7 @@ class TestWorkEntryHolidaysPerformance(TestWorkEntryHolidaysBase): self.richard_emp.generate_work_entries(date(2018, 1, 1), date(2018, 1, 2)) leave = self.create_leave(datetime(2018, 1, 1, 7, 0), datetime(2018, 1, 1, 18, 0)) - with self.assertQueryCount(__system__=91, admin=93): + with self.assertQueryCount(__system__=91, admin=95): leave.action_validate() leave.action_refuse() @@ -112,7 +112,7 @@ class TestWorkEntryHolidaysPerformancesBigData(TestWorkEntryHolidaysBase): def test_work_entries_generation_perf(self): # Test Case 7: Try to generate work entries for # a hundred employees over a month - with self.assertQueryCount(__system__=500, admin=2807): + with self.assertQueryCount(__system__=406, admin=406): work_entries = self.contracts._generate_work_entries(date(2020, 7, 1), date(2020, 8, 31)) # Original work entries to generate when we don't adapt date_generated_from and