[FIX] resource: copy default company and calendar

Prior to this fix, when a ResourceMixin was copied
and a `company_id` set in its default values,
it was not taken into account, because
ResourceMixin.copy_data first copied self.resource_id
without default values, then set the company of it
into the default values for its own copy.
Same went with `resource_calendar_id`,
just copying the calendar of its resource.

With this fix, if present, we first set these two values
in the Resource default values (`company_id` and `calendar_id`)
and only then copy them in the ResourceMixin default values
(as `company_id` and `resource_calendar_id`).

closes odoo/odoo#93823

Related: odoo/enterprise#28490
Signed-off-by: Laurent Stukkens (ltu) <ltu@odoo.com>
This commit is contained in:
Audric Onockx (auon)
2022-09-16 19:16:45 +02:00
parent 51a4b978f2
commit 62a7c0cee1
2 changed files with 14 additions and 8 deletions
+6 -7
View File
@@ -5,7 +5,7 @@ from collections import defaultdict
from lxml import etree
import re
from odoo import api, Command, fields, models, _
from odoo import api, Command, fields, models, _, _lt
from odoo.exceptions import UserError, AccessError, ValidationError
from odoo.osv import expression
@@ -143,10 +143,9 @@ class AccountAnalyticLine(models.Model):
user_ids.append(user_id)
# 2/ Search all employees related to user_ids and employee_ids, in the selected companies
Employee = self.env['hr.employee']
employees = Employee.sudo().search([
employees = self.env['hr.employee'].sudo().search([
'&', '|', ('user_id', 'in', user_ids), ('id', 'in', employee_ids), ('company_id', 'in', self.env.companies.ids)
]) or Employee
])
# ┌───── in search results = active/in companies ────────> was found with... ─── employee_id ───> (A) There is nothing to do, we will use this employee_id
# 3/ Each employee └──── user_id ──────> (B)** We'll need to select the right employee for this user
@@ -163,7 +162,7 @@ class AccountAnalyticLine(models.Model):
employee_id_per_company_per_user[employee.user_id.id][employee.company_id.id] = employee.id
# 4/ Put valid employee_id in each vals
get_error_msg = lambda: _('Timesheets must be created with an active employee in the selected companies.')
error_msg = _lt('Timesheets must be created with an active employee in the selected companies.')
for vals in vals_list:
if not vals.get('project_id'):
continue
@@ -173,7 +172,7 @@ class AccountAnalyticLine(models.Model):
vals['user_id'] = valid_employee_per_id[employee_in_id].sudo().user_id.id # (A) OK
continue
else:
raise ValidationError(get_error_msg()) # (C) KO
raise ValidationError(error_msg) # (C) KO
else:
user_id = vals.get('user_id', default_user_id) # (B)...
@@ -189,7 +188,7 @@ class AccountAnalyticLine(models.Model):
vals['employee_id'] = employee_out_id
vals['user_id'] = user_id
else: # ...and raise an error if they fail
raise ValidationError(get_error_msg())
raise ValidationError(error_msg)
# 5/ Finally, create the timesheets
lines = super(AccountAnalyticLine, self).create(vals_list)
+8 -1
View File
@@ -69,7 +69,14 @@ class ResourceMixin(models.AbstractModel):
def copy_data(self, default=None):
if default is None:
default = {}
resource = self.resource_id.copy()
resource_default = {}
if 'company_id' in default:
resource_default['company_id'] = default['company_id']
if 'resource_calendar_id' in default:
resource_default['calendar_id'] = default['resource_calendar_id']
resource = self.resource_id.copy(resource_default)
default['resource_id'] = resource.id
default['company_id'] = resource.company_id.id
default['resource_calendar_id'] = resource.calendar_id.id