Skip to content

Commit 09091dd

Browse files
author
sofiagvaladze
committed
[FIX] hr_contract: proceed cron action even when ValidationError occurs
The method update_state is called from cron. When the contracts are updated couple things are checked. There are constraints set that can throw ValidationError. As a result, none of the contract states are updated. In this PR we do the following: In case the ValidationError occurs when we run the cron, we update contracts that can be updated, and silently pass the invalid contracts. task - 3069480 bloupbloup closes odoo#114550 X-original-commit: bce0d7d Signed-off-by: Kevin Baptiste <kba@odoo.com> Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
1 parent 5fc49f8 commit 09091dd

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

addons/hr_contract/data/hr_contract_data.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
<field name="model_id" ref="model_hr_contract"/>
5151
<field name="type">ir.actions.server</field>
5252
<field name="state">code</field>
53-
<field name="code">model.update_state()</field>
53+
<field name="code">model.with_context(from_cron=True).update_state()</field>
5454
<field name="interval_number">1</field>
5555
<field name="interval_type">days</field>
5656
<field name="numbercall">-1</field>

addons/hr_contract/models/hr_contract.py

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# -*- coding: utf-8 -*-
22
# Part of Odoo. See LICENSE file for full copyright and licensing details.
33

4+
import threading
5+
46
from datetime import date
57
from dateutil.relativedelta import relativedelta
68

@@ -9,6 +11,10 @@
911

1012
from odoo.osv import expression
1113

14+
import logging
15+
_logger = logging.getLogger(__name__)
16+
17+
1218
class Contract(models.Model):
1319
_name = 'hr.contract'
1420
_description = 'Contract'
@@ -148,6 +154,7 @@ def _check_dates(self):
148154

149155
@api.model
150156
def update_state(self):
157+
from_cron = 'from_cron' in self.env.context
151158
contracts = self.search([
152159
('state', '=', 'open'), ('kanban_state', '!=', 'blocked'),
153160
'|',
@@ -165,20 +172,23 @@ def update_state(self):
165172
_("The contract of %s is about to expire.", contract.employee_id.name),
166173
user_id=contract.hr_responsible_id.id or self.env.uid)
167174

168-
contracts.write({'kanban_state': 'blocked'})
175+
if contracts:
176+
contracts._safe_write_for_cron({'kanban_state': 'blocked'}, from_cron)
169177

170-
self.search([
178+
contracts_to_close = self.search([
171179
('state', '=', 'open'),
172180
'|',
173181
('date_end', '<=', fields.Date.to_string(date.today() + relativedelta(days=1))),
174182
('visa_expire', '<=', fields.Date.to_string(date.today() + relativedelta(days=1))),
175-
]).write({
176-
'state': 'close'
177-
})
183+
])
178184

179-
self.search([('state', '=', 'draft'), ('kanban_state', '=', 'done'), ('date_start', '<=', fields.Date.to_string(date.today())),]).write({
180-
'state': 'open'
181-
})
185+
if contracts_to_close:
186+
contracts_to_close._safe_write_for_cron({'state': 'close'}, from_cron)
187+
188+
contracts_to_open = self.search([('state', '=', 'draft'), ('kanban_state', '=', 'done'), ('date_start', '<=', fields.Date.to_string(date.today())),])
189+
190+
if contracts_to_open:
191+
contracts_to_open._safe_write_for_cron({'state': 'open'}, from_cron)
182192

183193
contract_ids = self.search([('date_end', '=', False), ('state', '=', 'close'), ('employee_id', '!=', False)])
184194
# Ensure all closed contract followed by a new contract have a end date.
@@ -190,17 +200,32 @@ def update_state(self):
190200
('date_start', '>', contract.date_start)
191201
], order="date_start asc", limit=1)
192202
if next_contract:
193-
contract.date_end = next_contract.date_start - relativedelta(days=1)
203+
contract._safe_write_for_cron({'date_end': next_contract.date_start - relativedelta(days=1)}, from_cron)
194204
continue
195205
next_contract = self.search([
196206
('employee_id', '=', contract.employee_id.id),
197207
('date_start', '>', contract.date_start)
198208
], order="date_start asc", limit=1)
199209
if next_contract:
200-
contract.date_end = next_contract.date_start - relativedelta(days=1)
210+
contract._safe_write_for_cron({'date_end': next_contract.date_start - relativedelta(days=1)}, from_cron)
201211

202212
return True
203213

214+
def _safe_write_for_cron(self, vals, from_cron=False):
215+
if from_cron:
216+
auto_commit = not getattr(threading.current_thread(), 'testing', False)
217+
for contract in self:
218+
try:
219+
with self.env.cr.savepoint():
220+
contract.write(vals)
221+
except ValidationError as e:
222+
_logger.warning(e)
223+
else:
224+
if auto_commit:
225+
self.env.cr.commit()
226+
else:
227+
self.write(vals)
228+
204229
def _assign_open_contract(self):
205230
for contract in self:
206231
contract.employee_id.sudo().write({'contract_id': contract.id})

0 commit comments

Comments
 (0)