diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py
index ff945f33fdf..bb30a34e52f 100644
--- a/addons/hr_holidays/models/hr_leave.py
+++ b/addons/hr_holidays/models/hr_leave.py
@@ -10,7 +10,7 @@ from collections import namedtuple, defaultdict
from datetime import datetime, timedelta, time
from pytz import timezone, UTC
-from odoo import api, fields, models, tools, SUPERUSER_ID
+from odoo import api, Command, fields, models, tools, SUPERUSER_ID
from odoo.addons.base.models.res_partner import _tz_get
from odoo.addons.resource.models.resource import float_to_time, HOURS_PER_DAY
from odoo.exceptions import AccessError, UserError, ValidationError
@@ -26,6 +26,12 @@ _logger = logging.getLogger(__name__)
# See _compute_date_from_to
DummyAttendance = namedtuple('DummyAttendance', 'hour_from, hour_to, dayofweek, day_period, week_type')
+def get_employee_from_context(values, context, user_employee_id):
+ employee_ids_list = [value[2] for value in values.get('employee_ids', []) if len(value) == 3 and value[0] == Command.SET]
+ employee_ids = employee_ids_list[-1] if employee_ids_list else []
+ employee_id_value = employee_ids[0] if employee_ids else False
+ return employee_id_value or context.get('default_employee_id', context.get('employee_id', user_employee_id))
+
class HolidaysRequest(models.Model):
""" Leave Requests Access specifications
@@ -779,8 +785,9 @@ class HolidaysRequest(models.Model):
# Try to force the leave_type name_get when creating new records
# This is called right after pressing create and returns the name_get for
# most fields in the view.
- if 'employee_id' in field_onchange:
- self = self.with_context(employee_id=int(field_onchange['employee_id']))
+ if field_onchange.get('employee_id') and 'employee_id' not in self._context and values:
+ employee_id = get_employee_from_context(values, self._context, self.env.user.employee_id.id)
+ self = self.with_context(employee_id=employee_id)
return super().onchange(values, field_name, field_onchange)
def name_get(self):
diff --git a/addons/hr_holidays/models/hr_leave_allocation.py b/addons/hr_holidays/models/hr_leave_allocation.py
index fa80f799a33..6deabba2346 100644
--- a/addons/hr_holidays/models/hr_leave_allocation.py
+++ b/addons/hr_holidays/models/hr_leave_allocation.py
@@ -11,14 +11,15 @@ from dateutil.relativedelta import relativedelta
from odoo import api, fields, models
from odoo.addons.resource.models.resource import HOURS_PER_DAY
+from odoo.addons.hr_holidays.models.hr_leave import get_employee_from_context
from odoo.exceptions import AccessError, UserError, ValidationError
from odoo.tools.translate import _
from odoo.tools.float_utils import float_round
from odoo.tools.date_utils import get_timedelta
from odoo.osv import expression
-_logger = logging.getLogger(__name__)
+_logger = logging.getLogger(__name__)
class HolidaysAllocation(models.Model):
""" Allocation Requests Access specifications: similar to leave requests """
@@ -274,7 +275,8 @@ class HolidaysAllocation(models.Model):
allocation.employee_ids = False
allocation.mode_company_id = False
else:
- allocation.employee_ids = self.env.context.get('default_employee_id') or self.env.user.employee_id
+ employee_ids = self.env.context.get('default_employee_id', self.env.user.employee_id)
+ allocation.employee_ids = [employee_ids] if isinstance(employee_ids, int) else employee_ids
@api.depends('holiday_type', 'employee_id')
def _compute_department_id(self):
@@ -464,8 +466,9 @@ class HolidaysAllocation(models.Model):
# Try to force the leave_type name_get when creating new records
# This is called right after pressing create and returns the name_get for
# most fields in the view.
- if 'employee_id' in field_onchange:
- self = self.with_context(employee_id=int(field_onchange['employee_id']))
+ if field_onchange.get('employee_id') and 'employee_id' not in self._context and values:
+ employee_id = get_employee_from_context(values, self._context, self.env.user.employee_id.id)
+ self = self.with_context(employee_id=employee_id)
return super().onchange(values, field_name, field_onchange)
def name_get(self):
diff --git a/addons/hr_holidays/static/src/js/form/allocation_leave_form.js b/addons/hr_holidays/static/src/js/form/allocation_leave_form.js
new file mode 100644
index 00000000000..6e6db99ef09
--- /dev/null
+++ b/addons/hr_holidays/static/src/js/form/allocation_leave_form.js
@@ -0,0 +1,41 @@
+/** @odoo-module **/
+
+import viewRegistry from 'web.view_registry';
+
+import FormController from "web.FormController";
+import FormView from "web.FormView";
+
+export const AllocationLeaveFormController = FormController.extend({
+ /**
+ * @override
+ */
+ async _applyChanges(dataPointID, changes, event) {
+ const result = await this._super.apply(this, arguments);
+ const formData = event.target.record.data;
+ if (formData.holiday_status_id) {
+ let nameSearchContext = {'holiday_status_name_get': false};
+ const employee_id = formData.employee_id;
+ if (employee_id) {
+ nameSearchContext = {'holiday_status_name_get': true, 'employee_id': employee_id.data.id};
+ }
+ const nameSearch = await this._rpc({
+ model: 'hr.leave.type',
+ method: 'name_get',
+ args: [formData.holiday_status_id.data.id],
+ context: nameSearchContext,
+ limit: 1
+ });
+ this.$el.find("div[name='holiday_status_id']").find('input')[0].value = nameSearch[0][1];
+ }
+ return result;
+ }
+
+});
+
+export const AllocationLeaveFormView = FormView.extend({
+ config: Object.assign({}, FormView.prototype.config, {
+ Controller: AllocationLeaveFormController,
+ }),
+});
+
+viewRegistry.add('allocation_leave_form', AllocationLeaveFormView);
diff --git a/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_employee_controller.js b/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_employee_controller.js
index 663d47959c3..1641d9c6b37 100644
--- a/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_employee_controller.js
+++ b/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_employee_controller.js
@@ -26,7 +26,7 @@ export const TimeOffCalendarEmployeeController = TimeOffCalendarController.exten
_getAllocationContext() {
const context = this._super(...arguments);
- context.default_employee_ids = this.context.employee_id;
+ context.default_employee_id = this.context.employee_id[0];
return context;
},
diff --git a/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_renderer.js b/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_renderer.js
index 31bfd3adddf..dd43a656f9a 100644
--- a/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_renderer.js
+++ b/addons/hr_holidays/static/src/js/time_off_calendar/time_off_calendar_renderer.js
@@ -40,7 +40,7 @@ export const TimeOffCalendarRenderer = TimeOffPopoverRenderer.extend({
return await this._rpc({
model: 'hr.leave.type',
method: 'get_days_all_request',
- context: session.user_context,
+ context: this.state.context,
});
},
diff --git a/addons/hr_holidays/views/hr_leave_allocation_views.xml b/addons/hr_holidays/views/hr_leave_allocation_views.xml
index ddcd5ed5ea1..fd500f6453c 100644
--- a/addons/hr_holidays/views/hr_leave_allocation_views.xml
+++ b/addons/hr_holidays/views/hr_leave_allocation_views.xml
@@ -64,7 +64,7 @@
hr.leave.allocation
32
-