classJobStatus(NamedTuple):"""The status of a job along with an optional description. Optionally can also include extra fields such as: * Detailed error information. * Timestamps for changes in status. * Queue position. """status:JobStatusEnummessage:str=""error_detail:Optional[str]=None# Timestamp for when a status was last entered.completed_time:Optional[datetime]=Nonequeued_time:Optional[datetime]=Nonesubmitted_time:Optional[datetime]=Nonerunning_time:Optional[datetime]=Nonecancelled_time:Optional[datetime]=Noneerror_time:Optional[datetime]=Nonequeue_position:Optional[int]=None@classmethoddeffrom_dict(cls,dic:Dict[str,Any])->"JobStatus":"""Construct from JSON serializable dictionary."""invalid=ValueError(f"Dictionary invalid format for JobStatus: {dic}")if"message"notindicor"status"notindic:raiseinvalidtry:status=next(sforsinJobStatusEnumifdic["status"]==s.name)exceptStopIterationaserr:raiseinvalidfromerrerror_detail=dic.get("error_detail",None)defread_optional_datetime(key:str)->datetime|None:x=dic.get(key)returndatetime.fromisoformat(x)ifxisnotNoneelseNonecompleted_time=read_optional_datetime("completed_time")queued_time=read_optional_datetime("queued_time")submitted_time=read_optional_datetime("submitted_time")running_time=read_optional_datetime("running_time")cancelled_time=read_optional_datetime("cancelled_time")error_time=read_optional_datetime("error_time")queue_position=dic.get("queue_position",None)returncls(status,dic["message"],error_detail,completed_time,queued_time,submitted_time,running_time,cancelled_time,error_time,queue_position,)defdf(self)->pd.DataFrame:"""Present in a pandas DataFrame."""returnpd.DataFrame.from_dict(self._asdict(),orient="index",).TWAITING_STATUS={JobStatusEnum.QUEUED,JobStatusEnum.SUBMITTED,JobStatusEnum.RUNNING}