@@ -103,11 +103,13 @@ def scrape_urls(self, urls):
103103 def apply_async (self , * args , ** kwargs ):
104104 headers = kwargs .setdefault ("headers" , {})
105105 headers ["taskbadger_track" ] = True
106- tb_kwargs = kwargs .pop (TB_KWARGS_ARG , {})
107- for name in list (kwargs ):
108- if name .startswith (KWARG_PREFIX ):
109- val = kwargs .pop (name )
110- tb_kwargs [name .removeprefix (KWARG_PREFIX )] = val
106+ tb_kwargs = self ._get_tb_kwargs (kwargs )
107+ if kwargs .get ("kwargs" ):
108+ # extract taskbadger options from task kwargs when supplied as keyword argument
109+ tb_kwargs .update (self ._get_tb_kwargs (kwargs ["kwargs" ]))
110+ elif len (args ) > 1 and isinstance (args [1 ], dict ):
111+ # extract taskbadger options from task kwargs when supplied as positional argument
112+ tb_kwargs .update (self ._get_tb_kwargs (args [1 ]))
111113 headers [TB_KWARGS_ARG ] = tb_kwargs
112114 result = super ().apply_async (* args , ** kwargs )
113115
@@ -119,6 +121,14 @@ def apply_async(self, *args, **kwargs):
119121
120122 return result
121123
124+ def _get_tb_kwargs (self , kwargs ):
125+ tb_kwargs = kwargs .pop (TB_KWARGS_ARG , {})
126+ for name in list (kwargs ):
127+ if name .startswith (KWARG_PREFIX ):
128+ val = kwargs .pop (name )
129+ tb_kwargs [name .removeprefix (KWARG_PREFIX )] = val
130+ return tb_kwargs
131+
122132 @property
123133 def taskbadger_task_id (self ):
124134 return _get_taskbadger_task_id (self .request )
@@ -146,6 +156,7 @@ def task_publish_handler(sender=None, headers=None, body=None, **kwargs):
146156 celery_system = Badger .current .settings .get_system_by_id ("celery" )
147157 auto_track = celery_system and celery_system .track_task (sender )
148158 manual_track = headers .get ("taskbadger_track" )
159+ header_kwargs = headers .pop (TB_KWARGS_ARG , {})
149160 if not manual_track and not auto_track :
150161 return
151162
@@ -158,7 +169,7 @@ def task_publish_handler(sender=None, headers=None, body=None, **kwargs):
158169 kwargs [attr .removeprefix (KWARG_PREFIX )] = getattr (ctask , attr )
159170
160171 # get kwargs from the task headers (set via apply_async)
161- kwargs .update (headers . get ( TB_KWARGS_ARG , {}) )
172+ kwargs .update (header_kwargs )
162173 kwargs ["status" ] = StatusEnum .PENDING
163174 name = kwargs .pop ("name" , headers ["task" ])
164175
0 commit comments