From f99c2520a907132ded0ffd2e0c0b1b8b78bab2d0 Mon Sep 17 00:00:00 2001 From: Nicolas Martinelli Date: Tue, 28 Jan 2020 12:15:26 +0000 Subject: [PATCH] [FIX] hr_holidays: modify validated leave - Create and validate a leave - Go to Time Off > Everyone - In the Gantt view, move the leave Nothing prevents the modification of the leave while is it validated. opw-2179839 closes odoo/odoo#44214 X-original-commit: 05257fc75211ea4b34b35c94eeb42ee5b55bfd5b Signed-off-by: Nicolas Martinelli (nim) --- addons/hr_holidays/i18n/hr_holidays.pot | 6 ++++ addons/hr_holidays/models/hr_leave.py | 6 ++++ .../hr_holidays/tests/test_access_rights.py | 28 +++++++++++-------- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/addons/hr_holidays/i18n/hr_holidays.pot b/addons/hr_holidays/i18n/hr_holidays.pot index 34f8a8d7be2..55dbf4d7dce 100644 --- a/addons/hr_holidays/i18n/hr_holidays.pot +++ b/addons/hr_holidays/i18n/hr_holidays.pot @@ -2442,6 +2442,12 @@ msgstr "" msgid "This indicates if it is still possible to use this type of leave" msgstr "" +#. module: hr_holidays +#: code:addons/hr_holidays/models/hr_leave.py:0 +#, python-format +msgid "This modification is not allowed in the current state." +msgstr "" + #. module: hr_holidays #: model:ir.model.fields,help:hr_holidays.field_hr_leave_type__responsible_id msgid "" diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py index 180bf0e2c79..38b1d2a7636 100644 --- a/addons/hr_holidays/models/hr_leave.py +++ b/addons/hr_holidays/models/hr_leave.py @@ -550,6 +550,12 @@ class HolidaysRequest(models.Model): raise ValidationError(_('The number of remaining time off is not sufficient for this time off type.\n' 'Please also check the time off waiting for validation.')) + @api.constrains('date_from', 'date_to', 'employee_id') + def _check_date_state(self): + for holiday in self: + if holiday.state in ['cancel', 'refuse', 'validate1', 'validate']: + raise ValidationError(_("This modification is not allowed in the current state.")) + def _get_number_of_days(self, date_from, date_to, employee_id): """ Returns a float equals to the timedelta between two dates given as string.""" if employee_id: diff --git a/addons/hr_holidays/tests/test_access_rights.py b/addons/hr_holidays/tests/test_access_rights.py index 8781548ad27..0f77cf57caf 100644 --- a/addons/hr_holidays/tests/test_access_rights.py +++ b/addons/hr_holidays/tests/test_access_rights.py @@ -6,7 +6,7 @@ from dateutil.relativedelta import relativedelta from odoo import tests from odoo.addons.hr_holidays.tests.common import TestHrHolidaysCommon -from odoo.exceptions import AccessError, UserError +from odoo.exceptions import AccessError, UserError, ValidationError from odoo.tools import mute_logger @@ -184,9 +184,9 @@ class TestAcessRightsStates(TestHrHolidaysAccessRightsCommon): 'name': 'Random Leave', 'employee_id': self.employee_emp.id, 'holiday_status_id': status.id, - 'state': 'refuse', } leave = self.request_leave(1, datetime.today() + relativedelta(days=5 + i), 1, values) + leave.action_refuse() with self.assertRaises(UserError): leave.with_user(self.user_employee.id).action_draft() @@ -275,9 +275,9 @@ class TestAcessRightsStates(TestHrHolidaysAccessRightsCommon): 'name': 'Random Leave', 'employee_id': self.employee_hruser.id, 'holiday_status_id': status.id, - 'state': 'refuse', } leave = self.request_leave(1, datetime.today() + relativedelta(days=5 + i), 1, values) + leave.action_refuse() with self.assertRaises(UserError): leave.with_user(self.user_hruser.id).action_draft() @@ -358,9 +358,9 @@ class TestAcessRightsStates(TestHrHolidaysAccessRightsCommon): 'name': 'Random Leave', 'employee_id': self.employee_hruser.id, 'holiday_status_id': status.id, - 'state': 'refuse', } leave = self.request_leave(1, datetime.today() + relativedelta(days=5 + i), 1, values) + leave.action_refuse() leave.with_user(self.user_hrmanager.id).action_draft() def test_holiday_manager_draft_current_leave(self): @@ -408,7 +408,7 @@ class TestAccessRightsCreate(TestHrHolidaysAccessRightsCommon): 'holiday_status_id': self.leave_type.id, 'state': 'validate', } - with self.assertRaises(AccessError): + with self.assertRaises(ValidationError): self.request_leave(self.user_employee_id, datetime.today() + relativedelta(days=5), 1, values) @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail') @@ -447,17 +447,19 @@ class TestAccessRightsCreate(TestHrHolidaysAccessRightsCommon): @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail') def test_holidays_user_create_validate(self): - """ A holidays user can create a leave in validate state but not for himself """ + """ A holidays user cannot create a leave in validate state """ values = { 'name': 'Hol10', 'employee_id': self.employee_emp_id, 'holiday_status_id': self.leave_type.id, 'state': 'validate', } - self.request_leave(self.user_hruser_id, datetime.today() + relativedelta(days=5), 1, values) - values.update(employee_id=self.employee_hruser_id) - with self.assertRaises(AccessError): + with self.assertRaises(ValidationError): self.request_leave(self.user_hruser_id, datetime.today() + relativedelta(days=5), 1, values) + values.update(employee_id=self.employee_hruser_id) + with self.assertRaises(ValidationError): + self.request_leave(self.user_hruser_id, datetime.today() + relativedelta(days=5), 1, values) + @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail') def test_holidays_user_create_batch(self): @@ -495,16 +497,18 @@ class TestAccessRightsCreate(TestHrHolidaysAccessRightsCommon): @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail') def test_holidays_manager_create_validate(self): - """ A holidays manager can? create a leave in validate state even for himself """ + """ A holidays manager cannot create a leave in validate state """ values = { 'name': 'Hol10', 'employee_id': self.employee_emp_id, 'holiday_status_id': self.leave_type.id, 'state': 'validate', } - self.request_leave(self.user_hrmanager_id, datetime.today() + relativedelta(days=5), 1, values) + with self.assertRaises(ValidationError): + self.request_leave(self.user_hrmanager_id, datetime.today() + relativedelta(days=5), 1, values) values.update(employee_id=self.employee_hruser_id) - self.request_leave(self.user_hrmanager_id, datetime.today() + relativedelta(days=5), 1, values) + with self.assertRaises(ValidationError): + self.request_leave(self.user_hrmanager_id, datetime.today() + relativedelta(days=5), 1, values) @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail') def test_holidays_manager_create_batch(self):