From cbab7b013e0bf8fbc1ad1c8e8523c8c8e03cb294 Mon Sep 17 00:00:00 2001 From: Leonardo Pavan Rocha Date: Fri, 6 Oct 2023 13:16:34 +0200 Subject: [PATCH] [IMP] hr_homeworking: prevent deleting worklocations used by employees This commit prevents deleting worklocations if they are used as default of an employee. In case the worklocation is deleted, exceptions using that worklocation are also deleted. task-3527196 closes odoo/odoo#137502 Related: odoo/upgrade#5260 Signed-off-by: Yannick Tivisse (yti) --- addons/hr/models/res_config_settings.py | 2 +- addons/hr/views/res_config_settings_views.xml | 3 +++ addons/hr_homeworking/__manifest__.py | 4 ++-- addons/hr_homeworking/models/__init__.py | 1 + addons/hr_homeworking/models/hr_employee.py | 6 +++--- .../hr_homeworking/models/hr_work_location.py | 18 ++++++++++++++++++ .../hr_homeworking/views/hr_employee_views.xml | 2 +- addons/hr_homeworking/views/res_users.xml | 2 +- .../wizard/homework_location_wizard.py | 3 +-- 9 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 addons/hr_homeworking/models/hr_work_location.py diff --git a/addons/hr/models/res_config_settings.py b/addons/hr/models/res_config_settings.py index bdc865cf3af..562e9328115 100644 --- a/addons/hr/models/res_config_settings.py +++ b/addons/hr/models/res_config_settings.py @@ -13,7 +13,7 @@ class ResConfigSettings(models.TransientModel): related='company_id.resource_calendar_id', readonly=False) module_hr_presence = fields.Boolean(string="Advanced Presence Control") module_hr_skills = fields.Boolean(string="Skills Management") - module_hr_homeworking = fields.Boolean(string="Homeworking") + module_hr_homeworking = fields.Boolean(string="Remote Work") hr_presence_control_login = fields.Boolean(string="Based on user status in system", config_parameter='hr.hr_presence_control_login') hr_presence_control_email = fields.Boolean(string="Based on number of emails sent", config_parameter='hr_presence.hr_presence_control_email') hr_presence_control_ip = fields.Boolean(string="Based on IP Address", config_parameter='hr_presence.hr_presence_control_ip') diff --git a/addons/hr/views/res_config_settings_views.xml b/addons/hr/views/res_config_settings_views.xml index c9b21d5490c..443db0317ad 100644 --- a/addons/hr/views/res_config_settings_views.xml +++ b/addons/hr/views/res_config_settings_views.xml @@ -43,6 +43,9 @@ + + + diff --git a/addons/hr_homeworking/__manifest__.py b/addons/hr_homeworking/__manifest__.py index 7856dd7f016..784dc21f788 100644 --- a/addons/hr_homeworking/__manifest__.py +++ b/addons/hr_homeworking/__manifest__.py @@ -2,9 +2,9 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. { - 'name': 'Homeworking', + 'name': 'Remote Work', 'version': '1.0', - 'category': 'Human Resources/Homeworking', + 'category': 'Human Resources/Remote Work', 'depends': ['hr', 'calendar'], 'data': [ 'security/security.xml', diff --git a/addons/hr_homeworking/models/__init__.py b/addons/hr_homeworking/models/__init__.py index f4dc23efd03..0230ca54e6d 100644 --- a/addons/hr_homeworking/models/__init__.py +++ b/addons/hr_homeworking/models/__init__.py @@ -4,3 +4,4 @@ from . import hr_employee from . import res_partner from . import res_users from . import hr_homeworking +from . import hr_work_location diff --git a/addons/hr_homeworking/models/hr_employee.py b/addons/hr_homeworking/models/hr_employee.py index 65111460824..95f208e4f7c 100644 --- a/addons/hr_homeworking/models/hr_employee.py +++ b/addons/hr_homeworking/models/hr_employee.py @@ -13,7 +13,7 @@ class HrEmployeeBase(models.AbstractModel): @api.model def _default_location_id(self): - return self.env.ref('hr.home_work_office') + return self.env.ref('hr.home_work_office', raise_if_not_found=False) monday_location_id = fields.Many2one('hr.work.location', string='Monday', default=lambda self: self._default_location_id()) tuesday_location_id = fields.Many2one('hr.work.location', string='Tuesday', default=lambda self: self._default_location_id()) @@ -81,9 +81,9 @@ class HrEmployeeBase(models.AbstractModel): def _get_worklocation(self, start_date, end_date): work_locations_by_employee = defaultdict(dict) for employee in self: - work_locations_by_employee[employee.id]["user_id"] = employee["user_id"].id + work_locations_by_employee[employee.id]["user_id"] = employee.user_id.id work_locations_by_employee[employee.id]["employee_id"] = employee.id - work_locations_by_employee[employee.id]["partner_id"] = employee["user_partner_id"].id + work_locations_by_employee[employee.id]["partner_id"] = employee.user_partner_id.id work_locations_by_employee[employee.id]["employee_name"] = employee.name for day in DAYS: diff --git a/addons/hr_homeworking/models/hr_work_location.py b/addons/hr_homeworking/models/hr_work_location.py new file mode 100644 index 00000000000..49e6f104207 --- /dev/null +++ b/addons/hr_homeworking/models/hr_work_location.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, api, models +from odoo.exceptions import UserError +from odoo.addons.hr_homeworking.models.hr_homeworking import DAYS + +class WorkLocation(models.Model): + _inherit = "hr.work.location" + + @api.ondelete(at_uninstall=False) + def _unlink_except_used_by_employee(self): + domains = [(day, 'in', self.ids) for day in DAYS] + employee_uses_location = self.env['hr.employee'].search_count(domains, limit=1) + if employee_uses_location: + raise UserError(_("You cannot delete locations that are being used by your employees")) + exceptions_using_location = self.env['hr.employee.location'].search(('work_location_id', 'in', self.ids)) + exceptions_using_location.unlink() diff --git a/addons/hr_homeworking/views/hr_employee_views.xml b/addons/hr_homeworking/views/hr_employee_views.xml index b14bf6e924d..a950689bd0b 100644 --- a/addons/hr_homeworking/views/hr_employee_views.xml +++ b/addons/hr_homeworking/views/hr_employee_views.xml @@ -20,7 +20,7 @@ 1 - + Specify your default work location for each day of the week. This schedule will repeat itself each week. diff --git a/addons/hr_homeworking/views/res_users.xml b/addons/hr_homeworking/views/res_users.xml index 2c5c8ca70a2..ea7e9b0adfb 100644 --- a/addons/hr_homeworking/views/res_users.xml +++ b/addons/hr_homeworking/views/res_users.xml @@ -7,7 +7,7 @@ - + Specify your default work location for each day of the week. This schedule will repeat itself each week. diff --git a/addons/hr_homeworking/wizard/homework_location_wizard.py b/addons/hr_homeworking/wizard/homework_location_wizard.py index c62924e9a03..b710094a7b9 100644 --- a/addons/hr_homeworking/wizard/homework_location_wizard.py +++ b/addons/hr_homeworking/wizard/homework_location_wizard.py @@ -2,7 +2,6 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import fields, models, api -from odoo.addons.resource.models.utils import string_to_datetime class HomeworkLocationWizard(models.TransientModel): @@ -32,7 +31,7 @@ class HomeworkLocationWizard(models.TransientModel): ('date', '=', self.date), ('employee_id', '=', employee_id.id) ]) - date_week_name = string_to_datetime(self.date).date().strftime("%A").lower() # convert Tuesday to tuesday + date_week_name = self.day_week_string.lower() # convert Tuesday to tuesday default_location_for_current_date = f"{date_week_name}_location_id" if self.weekly: # delete any exceptions on the current date