Skip to content
Snippets Groups Projects
Commit 3ad88202 authored by Kevin Baptiste's avatar Kevin Baptiste
Browse files

[IMP] hr_holidays: reintroduce out of office (back2basics)


TaskID: 2057430

closes odoo/odoo#35952

Signed-off-by: default avatarYannick Tivisse (yti) <yti@odoo.com>
parent 7fa5e80f
No related branches found
No related tags found
No related merge requests found
......@@ -22,7 +22,6 @@
<field name="signature" position="replace" />
<xpath expr="//group[@name='preference_contact']" position="before">
<group>
<field name="out_of_office_message"/>
<field name="signature" />
</group>
</xpath>
......
......@@ -7,6 +7,7 @@ from . import hr_department
from . import hr_leave
from . import hr_leave_allocation
from . import hr_leave_type
from . import mail_channel
from . import mail_message_subtype
from . import res_partner
from . import res_users
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
class Channel(models.Model):
_inherit = 'mail.channel'
def partner_info(self, all_partners, direct_partners):
partner_infos = super(Channel, self).partner_info(all_partners, direct_partners)
# 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:
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
......@@ -7,3 +7,4 @@ from . import test_hr_leave_type
from . import test_accrual_allocations
from . import test_change_department
from . import test_leave_requests
from . import test_out_of_office
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime
from dateutil.relativedelta import relativedelta
from odoo.tests.common import tagged, users, warmup, Form
from odoo.addons.hr_holidays.tests.common import TestHrHolidaysBase
@tagged('out_of_office')
class TestOutOfOffice(TestHrHolidaysBase):
def setUp(self):
super().setUp()
self.leave_type = self.env['hr.leave.type'].create({
'name': 'Legal Leaves',
'time_type': 'leave',
'allocation_type': 'no',
'validity_start': False,
})
def test_leave_ooo(self):
self.assertNotEqual(self.employee_hruser.user_id.im_status, 'leave_offline', 'user should not be on leave')
self.assertNotEqual(self.employee_hruser.user_id.partner_id.im_status, 'leave_offline', 'user should not be on leave')
leave_date_end = (datetime.today() + relativedelta(days=3))
leave = self.env['hr.leave'].create({
'name': 'Christmas',
'employee_id': self.employee_hruser.id,
'holiday_status_id': self.leave_type.id,
'date_from': (datetime.today() - relativedelta(days=1)),
'date_to': leave_date_end,
'number_of_days': 4,
})
leave.action_approve()
self.assertEqual(self.employee_hruser.user_id.im_status, 'leave_offline', 'user should be out (leave_offline)')
self.assertEqual(self.employee_hruser.user_id.partner_id.im_status, 'leave_offline', 'user should be out (leave_offline)')
partner = self.employee_hruser.user_id.partner_id
partner2 = self.user_employee.partner_id
channel = self.env['mail.channel'].with_context({
'mail_create_nolog': True,
'mail_create_nosubscribe': True,
'mail_channel_noautofollow': True,
}).create({
'channel_partner_ids': [(4, partner.id), (4, partner2.id)],
'public': 'private',
'channel_type': 'chat',
'email_send': False,
'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)
@tagged('out_of_office')
class TestOutOfOfficePerformance(TestHrHolidaysBase):
def setUp(self):
super(TestOutOfOfficePerformance, self).setUp()
self.leave_type = self.env['hr.leave.type'].create({
'name': 'Legal Leaves',
'time_type': 'leave',
'allocation_type': 'no',
'validity_start': False,
})
self.leave_date_end = (datetime.today() + relativedelta(days=3))
self.leave = self.env['hr.leave'].create({
'name': 'Christmas',
'employee_id': self.employee_hruser_id,
'holiday_status_id': self.leave_type.id,
'date_from': (datetime.today() - relativedelta(days=1)),
'date_to': (datetime.today() + relativedelta(days=3)),
'number_of_days': 4,
})
self.hr_user = self.employee_hruser.user_id
self.hr_partner = self.employee_hruser.user_id.partner_id
self.employer_partner = self.user_employee.partner_id
@users('__system__', 'demo')
@warmup
def test_leave_im_status_performance_partner_offline(self):
with self.assertQueryCount(__system__=2, demo=2):
self.assertEqual(self.employer_partner.im_status, 'offline')
@users('__system__', 'demo')
@warmup
def test_leave_im_status_performance_user_leave_offline(self):
with self.assertQueryCount(__system__=2, demo=2):
self.assertEqual(self.hr_user.im_status, 'leave_offline')
@users('__system__', 'demo')
@warmup
def test_leave_im_status_performance_partner_leave_offline(self):
with self.assertQueryCount(__system__=2, demo=2):
self.assertEqual(self.hr_partner.im_status, 'leave_offline')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment