1313from werkzeug .exceptions import BadRequest , Forbidden
1414
1515from odoo import SUPERUSER_ID , api , http
16- from odoo .modules .registry import Registry
1716from odoo .service .model import PG_CONCURRENCY_ERRORS_TO_RETRY
17+ from odoo .tools import config
1818
1919from ..delay import chain , group
2020from ..exception import FailedJobError , RetryableJobError
@@ -38,8 +38,10 @@ def _prevent_commit(cr):
3838 def forbidden_commit (* args , ** kwargs ):
3939 raise RuntimeError (
4040 "Commit is forbidden in queue jobs. "
41- "If the current job is a cron running as queue job, "
42- "modify it to run as a normal cron."
41+ 'You may want to enable the "Allow Commit" option on the Job '
42+ "Function. Alternatively, if the current job is a cron running as "
43+ "queue job, you can modify it to run as a normal cron. More details on: "
44+ "https://github.com/OCA/queue/wiki/Upgrade-warning:-commits-inside-jobs"
4345 )
4446
4547 original_commit = cr .commit
@@ -103,11 +105,16 @@ def _try_perform_job(cls, env, job):
103105 job .set_done ()
104106 job .store ()
105107 env .flush_all ()
106- env .cr .commit ()
108+ if not config ["test_enable" ]:
109+ env .cr .commit ()
107110 _logger .debug ("%s done" , job )
108111
109112 @classmethod
110113 def _enqueue_dependent_jobs (cls , env , job ):
114+ if not job .should_check_dependents ():
115+ return
116+
117+ _logger .debug ("%s enqueue depends started" , job )
111118 tries = 0
112119 while True :
113120 try :
@@ -136,13 +143,13 @@ def _enqueue_dependent_jobs(cls, env, job):
136143 time .sleep (wait_time )
137144 else :
138145 break
146+ _logger .debug ("%s enqueue depends done" , job )
139147
140148 @classmethod
141149 def _runjob (cls , env : api .Environment , job : Job ) -> None :
142150 def retry_postpone (job , message , seconds = None ):
143151 job .env .clear ()
144- with Registry (job .env .cr .dbname ).cursor () as new_cr :
145- job .env = api .Environment (new_cr , SUPERUSER_ID , {})
152+ with job .in_temporary_env ():
146153 job .postpone (result = message , seconds = seconds )
147154 job .set_pending (reset_retry = False )
148155 job .store ()
@@ -167,24 +174,22 @@ def retry_postpone(job, message, seconds=None):
167174 # traceback in the logs we should have the traceback when all
168175 # retries are exhausted
169176 env .cr .rollback ()
177+ return
170178
171179 except (FailedJobError , Exception ) as orig_exception :
172180 buff = StringIO ()
173181 traceback .print_exc (file = buff )
174182 traceback_txt = buff .getvalue ()
175183 _logger .error (traceback_txt )
176184 job .env .clear ()
177- with Registry (job .env .cr .dbname ).cursor () as new_cr :
178- job .env = job .env (cr = new_cr )
185+ with job .in_temporary_env ():
179186 vals = cls ._get_failure_values (job , traceback_txt , orig_exception )
180187 job .set_failed (** vals )
181188 job .store ()
182189 buff .close ()
183190 raise
184191
185- _logger .debug ("%s enqueue depends started" , job )
186192 cls ._enqueue_dependent_jobs (env , job )
187- _logger .debug ("%s enqueue depends done" , job )
188193
189194 @classmethod
190195 def _get_failure_values (cls , job , traceback_txt , orig_exception ):
@@ -229,6 +234,7 @@ def create_test_job(
229234 failure_rate = 0 ,
230235 job_duration = 0 ,
231236 commit_within_job = False ,
237+ failure_retry_seconds = 0 ,
232238 ):
233239 if not http .request .env .user .has_group ("base.group_erp_manager" ):
234240 raise Forbidden (http .request .env ._ ("Access Denied" ))
@@ -266,6 +272,12 @@ def create_test_job(
266272 except ValueError :
267273 max_retries = None
268274
275+ if failure_retry_seconds is not None :
276+ try :
277+ failure_retry_seconds = int (failure_retry_seconds )
278+ except ValueError :
279+ failure_retry_seconds = 0
280+
269281 if size == 1 :
270282 return self ._create_single_test_job (
271283 priority = priority ,
@@ -275,6 +287,7 @@ def create_test_job(
275287 failure_rate = failure_rate ,
276288 job_duration = job_duration ,
277289 commit_within_job = commit_within_job ,
290+ failure_retry_seconds = failure_retry_seconds ,
278291 )
279292
280293 if size > 1 :
@@ -287,6 +300,7 @@ def create_test_job(
287300 failure_rate = failure_rate ,
288301 job_duration = job_duration ,
289302 commit_within_job = commit_within_job ,
303+ failure_retry_seconds = failure_retry_seconds ,
290304 )
291305 return ""
292306
@@ -300,6 +314,7 @@ def _create_single_test_job(
300314 failure_rate = 0 ,
301315 job_duration = 0 ,
302316 commit_within_job = False ,
317+ failure_retry_seconds = 0 ,
303318 ):
304319 delayed = (
305320 http .request .env ["queue.job" ]
@@ -313,6 +328,7 @@ def _create_single_test_job(
313328 failure_rate = failure_rate ,
314329 job_duration = job_duration ,
315330 commit_within_job = commit_within_job ,
331+ failure_retry_seconds = failure_retry_seconds ,
316332 )
317333 )
318334 return f"job uuid: { delayed .db_record ().uuid } "
@@ -329,6 +345,7 @@ def _create_graph_test_jobs(
329345 failure_rate = 0 ,
330346 job_duration = 0 ,
331347 commit_within_job = False ,
348+ failure_retry_seconds = 0 ,
332349 ):
333350 model = http .request .env ["queue.job" ]
334351 current_count = 0
@@ -355,6 +372,7 @@ def _create_graph_test_jobs(
355372 failure_rate = failure_rate ,
356373 job_duration = job_duration ,
357374 commit_within_job = commit_within_job ,
375+ failure_retry_seconds = failure_retry_seconds ,
358376 )
359377 )
360378
0 commit comments