@@ -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,20 @@ 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+
204215 def _related_action_format_error_message (self ):
205216 return _ (
206217 "Unexpected format of Related Action for {}.\n "
0 commit comments