Skip to content

Commit 193e5fc

Browse files
committed
queue_job: fix retry format with tuple values
#348 added support for randomized retry intervals. Configuration of randomized retry intervals is not possible due to the formatting checks not being updated. This should fix it.
1 parent 089eb3e commit 193e5fc

3 files changed

Lines changed: 62 additions & 7 deletions

File tree

queue_job/models/queue_job_function.py

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,10 +149,12 @@ def _parse_retry_pattern(self):
149149
try:
150150
# as json can't have integers as keys and the field is stored
151151
# as json, convert back to int
152-
retry_pattern = {
153-
int(try_count): postpone_seconds
154-
for try_count, postpone_seconds in self.retry_pattern.items()
155-
}
152+
retry_pattern = {}
153+
for try_count, postpone_value in self.retry_pattern.items():
154+
if isinstance(postpone_value, int):
155+
retry_pattern[int(try_count)] = postpone_value
156+
else:
157+
retry_pattern[int(try_count)] = tuple(postpone_value)
156158
except ValueError:
157159
_logger.error(
158160
"Invalid retry pattern for job function %s,"
@@ -181,8 +183,9 @@ def job_config(self, name):
181183
def _retry_pattern_format_error_message(self):
182184
return _(
183185
"Unexpected format of Retry Pattern for {}.\n"
184-
"Example of valid format:\n"
185-
"{{1: 300, 5: 600, 10: 1200, 15: 3000}}"
186+
"Example of valid formats:\n"
187+
"{{1: 300, 5: 600, 10: 1200, 15: 3000}}\n"
188+
"{{1: (1, 10), 5: (11, 20), 10: (21, 30), 15: (100, 300)}}"
186189
).format(self.name)
187190

188191
@api.constrains("retry_pattern")
@@ -195,12 +198,28 @@ def _check_retry_pattern(self):
195198
all_values = list(retry_pattern) + list(retry_pattern.values())
196199
for value in all_values:
197200
try:
198-
int(value)
201+
self._retry_value_type_check(value)
199202
except ValueError:
200203
raise exceptions.UserError(
201204
record._retry_pattern_format_error_message()
202205
)
203206

207+
def _retry_value_type_check(self, value):
208+
if isinstance(value, (tuple, list)):
209+
if len(value) != 2:
210+
raise ValueError
211+
[self._retry_value_type_check(element) for element in value]
212+
return
213+
int(value)
214+
215+
def _retry_value_type_check(self, value):
216+
if isinstance(value, (tuple, list)):
217+
if len(value) != 2:
218+
raise ValueError
219+
[self._retry_value_type_check(element) for element in value]
220+
return
221+
int(value)
222+
204223
def _related_action_format_error_message(self):
205224
return _(
206225
"Unexpected format of Related Action for {}.\n"

test_queue_job/tests/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
from . import test_job
55
from . import test_job_auto_delay
66
from . import test_job_channels
7+
from . import test_job_function
78
from . import test_related_actions
89
from . import test_delay_mocks
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import odoo.tests.common as common
2+
from odoo import exceptions
3+
4+
5+
class TestJobFunction(common.TransactionCase):
6+
def setUp(self):
7+
super(TestJobFunction, self).setUp()
8+
self.test_function_model = self.env.ref(
9+
"queue_job.job_function_queue_job__test_job"
10+
)
11+
12+
def test_check_retry_pattern_randomized_case(self):
13+
randomized_pattern = "{1: (10, 20), 2: (20, 40)}"
14+
self.test_function_model.edit_retry_pattern = randomized_pattern
15+
self.assertEqual(
16+
self.test_function_model.edit_retry_pattern, randomized_pattern
17+
)
18+
19+
def test_check_retry_pattern_fixed_case(self):
20+
fixed_pattern = "{1: 10, 2: 20}"
21+
self.test_function_model.edit_retry_pattern = fixed_pattern
22+
self.assertEqual(self.test_function_model.edit_retry_pattern, fixed_pattern)
23+
24+
def test_check_retry_pattern_invalid_cases(self):
25+
invalid_time_value_pattern = "{1: a, 2: 20}"
26+
with self.assertRaises(exceptions.UserError):
27+
self.test_function_model.edit_retry_pattern = invalid_time_value_pattern
28+
29+
invalid_retry_count_pattern = "{a: 10, 2: 20}"
30+
with self.assertRaises(exceptions.UserError):
31+
self.test_function_model.edit_retry_pattern = invalid_retry_count_pattern
32+
33+
invalid_randomized_pattern = "{1: (1, 2, 3), 2: 20}"
34+
with self.assertRaises(exceptions.UserError):
35+
self.test_function_model.edit_retry_pattern = invalid_randomized_pattern

0 commit comments

Comments
 (0)