[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:
Xavier ALT
2023-04-25 14:07:35 +02:00
parent 95b6b91fca
commit badc8fb90d
2 changed files with 4 additions and 5 deletions
+3 -4
View File
@@ -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)
])