[FIX] hr_timesheet: fix KeyError a timesheet on task wo/ analytic set
To reproduce on runbot:
- go a to an existing task
- clear the "Analytic account" field
- add a timesheet line
- save
It then crash with the following error:
```
RPC_ERROR
Odoo Server Error
Traceback (most recent call last):
File "/data/build/odoo/odoo/http.py", line 1698, in _serve_db
return service_model.retrying(self._serve_ir_http, self.env)
File "/data/build/odoo/odoo/service/model.py", line 134, in retrying
result = func()
File "/data/build/odoo/odoo/http.py", line 1725, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/data/build/odoo/odoo/http.py", line 1922, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/data/build/odoo/addons/website/models/ir_http.py", line 234, in _dispatch
response = super()._dispatch(endpoint)
File "/data/build/odoo/odoo/addons/base/models/ir_http.py", line 154, in _dispatch
result = endpoint(**request.params)
File "/data/build/odoo/odoo/http.py", line 715, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/data/build/odoo/addons/web/controllers/dataset.py", line 28, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/data/build/odoo/addons/web/controllers/dataset.py", line 24, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/data/build/odoo/odoo/api.py", line 461, in call_kw
result = _call_kw_multi(method, model, args, kwargs)
File "/data/build/odoo/odoo/api.py", line 448, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "/data/build/enterprise/industry_fsm_stock/models/project_task.py", line 101, in write
result = super().write(vals)
File "/data/build/enterprise/helpdesk_fsm/models/project_task.py", line 45, in write
res = super().write(vals)
File "/data/build/odoo/addons/project_sms/models/project_task.py", line 25, in write
res = super().write(vals)
File "/data/build/enterprise/project_enterprise/models/project_task.py", line 288, in write
res = super().write(vals)
File "/data/build/odoo/addons/hr_timesheet/models/project.py", line 385, in write
res = super(Task, self).write(values)
File "/data/build/odoo/addons/project/models/project.py", line 2050, in write
result = super().write(vals)
File "/data/build/odoo/addons/mail/models/mail_activity_mixin.py", line 241, in write
return super(MailActivityMixin, self).write(vals)
File "/data/build/odoo/addons/rating/models/rating_mixin.py", line 101, in write
result = super(RatingMixin, self).write(values)
File "/data/build/odoo/addons/mail/models/mail_thread.py", line 311, in write
result = super(MailThread, self).write(values)
File "/data/build/odoo/odoo/models.py", line 3813, in write
field.write(self, value)
File "/data/build/odoo/odoo/fields.py", line 4168, in write
self.write_batch([(records, value)])
File "/data/build/odoo/odoo/fields.py", line 4189, in write_batch
self.write_real(records_commands_list, create)
File "/data/build/odoo/odoo/fields.py", line 4369, in write_real
flush()
File "/data/build/odoo/odoo/fields.py", line 4325, in flush
comodel.create(to_create)
File "<decorator-gen-368>", line 2, in create
File "/data/build/odoo/odoo/api.py", line 410, in _model_create_multi
return create(self, arg)
File "/data/build/odoo/addons/hr_timesheet/models/hr_timesheet.py", line 142, in create
vals_list = self._timesheet_preprocess(vals_list)
File "/data/build/enterprise/helpdesk_timesheet/models/analytic.py", line 61, in _timesheet_preprocess
return super(AccountAnalyticLine, self)._timesheet_preprocess(vals_list)
File "/data/build/odoo/addons/hr_timesheet/models/hr_timesheet.py", line 331, in _timesheet_preprocess
account = account_per_id[account_id]
KeyError: False
The above server error caused the following client error:
null
```
closes odoo/odoo#119597
X-original-commit: b86fa6a72cc5eaeb0245cf2092eefde09226aa12
Signed-off-by: Xavier Bol (xbo) <xbo@odoo.com>
This commit is contained in:
@@ -315,7 +315,7 @@ class AccountAnalyticLine(models.Model):
|
||||
task_per_id[task.id] = task
|
||||
if not task.project_id:
|
||||
raise ValidationError(_('Timesheets cannot be created on a private task.'))
|
||||
account_ids = account_ids.union(tasks.analytic_account_id.ids)
|
||||
account_ids = account_ids.union(tasks.analytic_account_id.ids, tasks.project_id.analytic_account_id.ids)
|
||||
|
||||
project_per_id = {}
|
||||
if project_ids:
|
||||
@@ -337,11 +337,10 @@ class AccountAnalyticLine(models.Model):
|
||||
if not vals.get('project_id'):
|
||||
vals['project_id'] = data.project_id.id
|
||||
if not vals.get('account_id'):
|
||||
account_id = data.analytic_account_id.id
|
||||
account = account_per_id[account_id]
|
||||
account = data._get_task_analytic_account_id() if vals.get('task_id') else data.analytic_account_id
|
||||
if not account or not account.active:
|
||||
raise ValidationError(_('Timesheets must be created on a project or a task with an active analytic account.'))
|
||||
vals['account_id'] = account_id
|
||||
vals['account_id'] = account.id
|
||||
vals['company_id'] = account.company_id.id or data.company_id.id
|
||||
if not vals.get('partner_id'):
|
||||
vals['partner_id'] = data.partner_id.id
|
||||
|
||||
@@ -14,7 +14,7 @@ class TestPerformanceTimesheet(TestCommonTimesheet):
|
||||
self.env.invalidate_all()
|
||||
projects.clear_caches()
|
||||
tasks.clear_caches()
|
||||
with self.assertQueryCount(5):
|
||||
with self.assertQueryCount(7):
|
||||
self.env['account.analytic.line']._timesheet_preprocess([
|
||||
{'task_id': task.id} for task in tasks for _i in range(10)
|
||||
])
|
||||
|
||||
Reference in New Issue
Block a user