summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Kühn <aku@odoo.com>2019-11-29 13:52:10 +0000
committerAlexandre Kühn <aku@odoo.com>2019-11-29 14:16:00 +0000
commit4876dd7906a7a96c7e782638a1cb04ee44923e7d (patch)
treef1b77e514b3140dd98476ff2233ecaeedb04b373
parent72386a4832db2568aad2843db7ecee2abae30d04 (diff)
[REV] hr_holidays: consecutive leave date on out of office message
This reverts commit 802817c92586f87ef6dd431011d8a9615eb4df8c. The new test was crashing when current weekday is Friday. This is easy to fix, but some other considerations are missing in the original commit, like taking into account timezones. We will add a proper fix later, and revert now in the meantime. closes odoo/odoo#41123 Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
-rw-r--r--addons/hr_holidays/models/hr_employee.py31
-rw-r--r--addons/hr_holidays/models/mail_channel.py17
-rw-r--r--addons/hr_holidays/models/res_users.py4
-rw-r--r--addons/hr_holidays/tests/test_out_of_office.py30
-rw-r--r--addons/hr_holidays/views/hr_views.xml6
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