diff options
| -rw-r--r-- | addons/hr_holidays/models/hr_employee.py | 31 | ||||
| -rw-r--r-- | addons/hr_holidays/models/mail_channel.py | 17 | ||||
| -rw-r--r-- | addons/hr_holidays/models/res_users.py | 4 | ||||
| -rw-r--r-- | addons/hr_holidays/tests/test_out_of_office.py | 30 | ||||
| -rw-r--r-- | addons/hr_holidays/views/hr_views.xml | 6 |
5 files changed, 19 insertions, 69 deletions
diff --git a/addons/hr_holidays/models/hr_employee.py b/addons/hr_holidays/models/hr_employee.py index cd8662895e5..1e7ed2d5a89 100644 --- a/addons/hr_holidays/models/hr_employee.py +++ b/addons/hr_holidays/models/hr_employee.py @@ -2,8 +2,6 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import datetime -from collections import defaultdict -from datetime import timedelta from odoo import api, fields, models from odoo.tools.float_utils import float_round @@ -32,7 +30,6 @@ class HrEmployeeBase(models.AbstractModel): current_leave_id = fields.Many2one('hr.leave.type', compute='_compute_leave_status', string="Current Time Off Type") leave_date_from = fields.Date('From Date', compute='_compute_leave_status') leave_date_to = fields.Date('To Date', compute='_compute_leave_status') - leave_consolidated_date_to = fields.Date('Leave Consolidated To Date', compute='_compute_leave_consolidated_date_to') leaves_count = fields.Float('Number of Time Off', compute='_compute_remaining_leaves') allocation_count = fields.Float('Total number of days allocated.', compute='_compute_allocation_count') allocation_used_count = fields.Float('Total number of days off used', compute='_compute_total_allocation_used') @@ -100,34 +97,6 @@ class HrEmployeeBase(models.AbstractModel): employees = self.filtered(lambda employee: employee.hr_presence_state != 'present' and employee.is_absent) employees.update({'hr_presence_state': 'absent'}) - def _compute_leave_consolidated_date_to(self): - holidays = self.env['hr.leave'].sudo().search([ - ('employee_id', 'in', self.ids), - ('date_to', '>=', fields.Datetime.now()), - ('state', 'not in', ('cancel', 'refuse')) - ], order="date_from") - - leave_data = defaultdict(list) - for holiday in holidays: - leave_data[holiday.employee_id].append({'date_to': holiday.date_to.date(), 'date_from': holiday.date_from.date()}) - - for employee, leave_data in leave_data.items(): - first_leave = leave_data[0] - date_to = first_leave['date_to'] - working_days = employee.mapped('resource_calendar_id.attendance_ids.dayofweek') - days = 1 - for next_leave in leave_data: - while str((first_leave['date_to'] + timedelta(days=days)).weekday()) not in working_days: - days += 1 - if next_leave['date_from'] == first_leave['date_to'] + timedelta(days=days): - days = 1 - date_to = next_leave['date_to'] - first_leave = next_leave - employee.leave_consolidated_date_to = date_to - - for employee in self - holidays.employee_id: - employee.leave_consolidated_date_to = False - def _compute_leave_status(self): # Used SUPERUSER_ID to forcefully get status of other user's leave, to bypass record rule holidays = self.env['hr.leave'].sudo().search([ diff --git a/addons/hr_holidays/models/mail_channel.py b/addons/hr_holidays/models/mail_channel.py index eb9503283e9..c5dd68986d7 100644 --- a/addons/hr_holidays/models/mail_channel.py +++ b/addons/hr_holidays/models/mail_channel.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import models +from odoo import api, fields, models class Channel(models.Model): @@ -12,7 +12,16 @@ class Channel(models.Model): # only search for leave out_of_office_message if im_status is on leave partners_on_leave = [partner_id for partner_id in direct_partners.ids if 'leave' in partner_infos[partner_id]['im_status']] if partners_on_leave: - for user in self.env['res.users'].sudo().search([('partner_id', 'in', partners_on_leave)]): - partner_infos[user.partner_id.id]['out_of_office_date_end'] = user.leave_consolidated_date_to - + now = fields.Datetime.now() + self.env.cr.execute('''SELECT res_users.partner_id as partner_id, hr_leave.date_to as date_to + FROM res_users + JOIN hr_leave ON hr_leave.user_id = res_users.id + AND hr_leave.state not in ('cancel', 'refuse') + AND res_users.active = 't' + AND hr_leave.date_from <= %s + AND hr_leave.date_to >= %s + AND res_users.partner_id in %s''', (now, now, tuple(partners_on_leave))) + out_of_office_infos = dict(((res['partner_id'], res) for res in self.env.cr.dictfetchall())) + for partner_id, out_of_office_info in out_of_office_infos.items(): + partner_infos[partner_id]['out_of_office_date_end'] = out_of_office_info['date_to'] return partner_infos diff --git a/addons/hr_holidays/models/res_users.py b/addons/hr_holidays/models/res_users.py index 0e128f70823..c78f415f923 100644 --- a/addons/hr_holidays/models/res_users.py +++ b/addons/hr_holidays/models/res_users.py @@ -11,7 +11,7 @@ class User(models.Model): show_leaves = fields.Boolean(related='employee_id.show_leaves') allocation_used_count = fields.Float(related='employee_id.allocation_used_count') allocation_count = fields.Float(related='employee_id.allocation_count') - leave_consolidated_date_to = fields.Date(related='employee_id.leave_consolidated_date_to') + leave_date_to = fields.Date(related='employee_id.leave_date_to') is_absent = fields.Boolean(related='employee_id.is_absent') allocation_used_display = fields.Char(related='employee_id.allocation_used_display') allocation_display = fields.Char(related='employee_id.allocation_display') @@ -27,7 +27,7 @@ class User(models.Model): 'show_leaves', 'allocation_used_count', 'allocation_count', - 'leave_consolidated_date_to', + 'leave_date_to', 'is_absent', 'allocation_used_display', 'allocation_display', diff --git a/addons/hr_holidays/tests/test_out_of_office.py b/addons/hr_holidays/tests/test_out_of_office.py index 9526a5c4b13..a035f5afbe2 100644 --- a/addons/hr_holidays/tests/test_out_of_office.py +++ b/addons/hr_holidays/tests/test_out_of_office.py @@ -52,35 +52,7 @@ class TestOutOfOffice(TestHrHolidaysCommon): 'name': 'test' }) infos = channel.with_user(self.user_employee).channel_info() - self.assertEqual(infos[0]['direct_partner'][0]['out_of_office_date_end'], leave_date_end.date()) - - def test_consolidated_leave_date_to(self): - # leave from Thursday to Friday - leave_date_end = datetime.today() - relativedelta(days=datetime.today().weekday() - 4) - leave = self.env['hr.leave'].create({ - 'name': 'Holiday 1', - 'employee_id': self.employee_hruser.id, - 'holiday_status_id': self.leave_type.id, - 'date_from': (leave_date_end - relativedelta(days=1)), - 'date_to': leave_date_end, - 'number_of_days': 2, - }) - leave.action_approve() - self.assertEqual(self.employee_hruser.leave_consolidated_date_to, leave_date_end.date(), "consolidated leave date should be end date of leave1") - - # consecutive leave after weekend, start from Monday to Tuesday - leave2_date_end = leave_date_end + relativedelta(days=4) - leave2 = self.env['hr.leave'].create({ - 'name': 'Holiday 2', - 'employee_id': self.employee_hruser.id, - 'holiday_status_id': self.leave_type.id, - 'date_from': (leave2_date_end - relativedelta(days=1)), - 'date_to': leave2_date_end, - 'number_of_days': 2, - }) - leave2.action_approve() - self.assertEqual(self.employee_hruser.leave_consolidated_date_to, leave2_date_end.date(), "consolidated leave date should be end date of leave2") - + self.assertEqual(infos[0]['direct_partner'][0]['out_of_office_date_end'], leave_date_end) @tagged('out_of_office') class TestOutOfOfficePerformance(TestHrHolidaysCommon, TransactionCaseWithUserDemo): diff --git a/addons/hr_holidays/views/hr_views.xml b/addons/hr_holidays/views/hr_views.xml index 55cc4bd2df5..10e47291c4f 100644 --- a/addons/hr_holidays/views/hr_views.xml +++ b/addons/hr_holidays/views/hr_views.xml @@ -154,7 +154,7 @@ <div role="img" class="fa fa-fw fa-plane o_button_icon text-danger" aria-label="Off Till" title="Off Till"/> <div class="o_field_widget o_stat_info"> <span class="o_stat_value"> - <field name="leave_consolidated_date_to"/> + <field name="leave_date_to"/> </span> <span class="o_stat_text"> Off Till @@ -211,7 +211,7 @@ <div role="img" class="fa fa-fw fa-plane o_button_icon text-warning" aria-label="Off Till" title="Off Till"/> <div class="o_field_widget o_stat_info"> <span class="o_stat_value"> - <field name="leave_consolidated_date_to"/> + <field name="leave_date_to"/> </span> <span class="o_stat_text"> Off Till @@ -251,7 +251,7 @@ <div role="img" class="fa fa-fw fa-plane o_button_icon text-danger" aria-label="Off Till" title="Off Till"/> <div class="o_field_widget o_stat_info"> <span class="o_stat_value"> - <field name="leave_consolidated_date_to"/> + <field name="leave_date_to"/> </span> <span class="o_stat_text"> Off Till |
