@@ -28,6 +28,9 @@ class QueueJobFunction(models.Model):
28
28
"related_action_enable "
29
29
"related_action_func_name "
30
30
"related_action_kwargs "
31
+ "error_handler_enable "
32
+ "error_handler_func_name "
33
+ "error_handler_kwargs "
31
34
"job_function_id " ,
32
35
)
33
36
@@ -79,6 +82,33 @@ def _default_channel(self):
79
82
"enable, func_name, kwargs.\n "
80
83
"See the module description for details." ,
81
84
)
85
+ error_handler = JobSerialized (base_type = dict )
86
+ edit_error_handler = fields .Text (
87
+ string = "Error Handler" ,
88
+ compute = "_compute_edit_error_handler" ,
89
+ inverse = "_inverse_edit_error_handler" ,
90
+ help = "The handler is executed when the job fails. "
91
+ "Configured as a dictionary with optional keys: "
92
+ "enable, func_name, kwargs.\n "
93
+ "See the module description for details." ,
94
+ )
95
+
96
+ @api .depends ("error_handler" )
97
+ def _compute_edit_error_handler (self ):
98
+ for record in self :
99
+ record .edit_error_handler = str (record .error_handler )
100
+
101
+ def _inverse_edit_error_handler (self ):
102
+ try :
103
+ edited = (self .edit_error_handler or "" ).strip ()
104
+ if edited :
105
+ self .error_handler = ast .literal_eval (edited )
106
+ else :
107
+ self .error_handler = {}
108
+ except (ValueError , TypeError , SyntaxError ) as ex :
109
+ raise exceptions .UserError (
110
+ self ._error_handler_format_error_message ()
111
+ ) from ex
82
112
83
113
@api .depends ("model_id.model" , "method" )
84
114
def _compute_name (self ):
@@ -149,6 +179,9 @@ def job_default_config(self):
149
179
related_action_func_name = None ,
150
180
related_action_kwargs = {},
151
181
job_function_id = None ,
182
+ error_handler_enable = True ,
183
+ error_handler_func_name = None ,
184
+ error_handler_kwargs = {},
152
185
)
153
186
154
187
def _parse_retry_pattern (self ):
@@ -182,6 +215,9 @@ def job_config(self, name):
182
215
related_action_func_name = config .related_action .get ("func_name" ),
183
216
related_action_kwargs = config .related_action .get ("kwargs" , {}),
184
217
job_function_id = config .id ,
218
+ error_handler_enable = config .error_handler .get ("enable" , True ),
219
+ error_handler_func_name = config .error_handler .get ("func_name" ),
220
+ error_handler_kwargs = config .error_handler .get ("kwargs" , {}),
185
221
)
186
222
187
223
def _retry_pattern_format_error_message (self ):
@@ -215,6 +251,14 @@ def _related_action_format_error_message(self):
215
251
' "kwargs" {{"limit": 10}}}}'
216
252
).format (self .name )
217
253
254
+ def _error_handler_format_error_message (self ):
255
+ return _ (
256
+ "Unexpected format of Error Handler for {}.\n "
257
+ "Example of valid format:\n "
258
+ '{{"enable": True, "func_name": "_call_webhook",'
259
+ ' "kwargs" {"webhook_url": "XXX","payload": {"text":"Hello World!"}}}}'
260
+ ).format (self .name )
261
+
218
262
@api .constrains ("related_action" )
219
263
def _check_related_action (self ):
220
264
valid_keys = ("enable" , "func_name" , "kwargs" )
0 commit comments