@@ -145,8 +145,7 @@ def list_jobs(self, filters: JobListFilters | None = None) -> tuple[list[JobDeta
145145 if not any (tag in job_tags for tag in filters .tags ):
146146 continue
147147
148- job_detail = self ._map_rq_job_to_schema (job , queue .name )
149- job_detail .status = job_status
148+ job_detail = self ._map_rq_job_to_schema (job , queue .name , include_result = False , status = job_status )
150149
151150 if filters .created_after and job_detail .created_at < filters .created_after :
152151 continue
@@ -375,8 +374,15 @@ def _determine_job_queue(self, rq_job: Job) -> str:
375374
376375 return "default"
377376
378- def _map_rq_job_to_schema (self , rq_job : Job , queue_name : str ) -> JobDetails :
379- """Map RQ job object to JobDetails schema."""
377+ def _map_rq_job_to_schema (self , rq_job : Job , queue_name : str , include_result : bool = True , status : JobStatus | None = None ) -> JobDetails :
378+ """Map RQ job object to JobDetails schema.
379+
380+ Args:
381+ rq_job: The RQ job object
382+ queue_name: The queue name
383+ include_result: Whether to include the job result (expensive, defaults True)
384+ status: Pre-determined status to avoid Redis call (optional)
385+ """
380386 try :
381387 # Map RQ status to our schema status
382388 status_mapping = {
@@ -390,8 +396,10 @@ def _map_rq_job_to_schema(self, rq_job: Job, queue_name: str) -> JobDetails:
390396 'canceled' : JobStatus .CANCELED ,
391397 }
392398
393- # Determine job status
394- status = status_mapping .get (rq_job .get_status ().lower (), JobStatus .QUEUED )
399+ if status is not None :
400+ job_status = status
401+ else :
402+ job_status = status_mapping .get (rq_job .get_status ().lower (), JobStatus .QUEUED )
395403
396404 # Get job metadata
397405 meta_data = {}
@@ -405,22 +413,32 @@ def _map_rq_job_to_schema(self, rq_job: Job, queue_name: str) -> JobDetails:
405413 try :
406414 func_name = rq_job .func_name or "unknown"
407415 except Exception :
408- func_name = "unknown (deserialization error)"
416+ func_name = "unknown"
417+
418+ try :
419+ args = rq_job .args or []
420+ except Exception :
421+ args = []
422+
423+ try :
424+ kwargs = rq_job .kwargs or {}
425+ except Exception :
426+ kwargs = {}
409427
410428 return JobDetails (
411429 id = rq_job .id ,
412430 created_at = ensure_timezone_aware (rq_job .created_at ) or get_timezone_aware_now (),
413431 func_name = func_name ,
414- args = list ( rq_job . args ) if rq_job . args else [] ,
415- kwargs = dict ( rq_job . kwargs ) if rq_job . kwargs else {} ,
416- status = status ,
432+ args = args ,
433+ kwargs = kwargs ,
434+ status = job_status ,
417435 queue = queue_name ,
418436 worker_name = rq_job .worker_name ,
419437 started_at = ensure_timezone_aware (rq_job .started_at ),
420438 ended_at = ensure_timezone_aware (rq_job .ended_at ),
421439 duration_seconds = duration_seconds ,
422440 last_heartbeat = ensure_timezone_aware (getattr (rq_job , 'last_heartbeat' , None )),
423- result = rq_job .result ,
441+ result = rq_job .result if include_result else None ,
424442 exc_info = rq_job .exc_info ,
425443 traceback = getattr (rq_job , 'exc_info' , None ),
426444 meta_full = meta_data ,
@@ -437,7 +455,7 @@ def _map_rq_job_to_schema(self, rq_job: Job, queue_name: str) -> JobDetails:
437455 )
438456
439457 except Exception as e :
440- logger .error (f"Error mapping job { rq_job .id } : { e } " )
458+ logger .error (f"Error mapping job { rq_job .id } : { e } " , exc_info = True )
441459 # Safely get job ID without triggering deserialization
442460 job_id = getattr (rq_job , 'id' , 'unknown' )
443461 return JobDetails (
0 commit comments