From badc8fb90d54ad81eb29701db25a74b8bd2aa365 Mon Sep 17 00:00:00 2001 From: Xavier ALT Date: Tue, 18 Apr 2023 13:17:16 +0000 Subject: [PATCH] [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 "", 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) --- addons/hr_timesheet/models/hr_timesheet.py | 7 +++---- addons/hr_timesheet/tests/test_performance.py | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/addons/hr_timesheet/models/hr_timesheet.py b/addons/hr_timesheet/models/hr_timesheet.py index 4b65bd89ae4..c9afedf781b 100644 --- a/addons/hr_timesheet/models/hr_timesheet.py +++ b/addons/hr_timesheet/models/hr_timesheet.py @@ -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 diff --git a/addons/hr_timesheet/tests/test_performance.py b/addons/hr_timesheet/tests/test_performance.py index 30b27968806..bd128cf6551 100644 --- a/addons/hr_timesheet/tests/test_performance.py +++ b/addons/hr_timesheet/tests/test_performance.py @@ -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) ])