pa_api.xmlapi.types.operations.job
1import enum 2import logging 3from dataclasses import dataclass 4from datetime import datetime, time 5from typing import Optional 6 7from pa_api.utils import ( 8 first, 9) 10from pa_api.xmlapi.types.utils import ( 11 mksx, 12 parse_datetime, 13 parse_time, 14 pd, 15) 16 17 18def parse_tdeq(d): 19 if "null" in d: 20 return None 21 try: 22 return parse_time(d) 23 except Exception as e: 24 logging.debug(e) 25 return parse_datetime(d) 26 27 28def parse_progress(progress): 29 try: 30 return float(progress) 31 except Exception as e: 32 logging.debug(f"{e} => Fallback to datetime parsing") 33 34 # When finished, progress becomes the date of the end 35 if parse_datetime(progress): 36 return 100.0 37 return None 38 39 40class JobResult(enum.Enum): 41 OK = "OK" 42 FAIL = "FAIL" 43 44 45@dataclass 46class Job: 47 # TODO: Use pydantic 48 tenq: datetime 49 tdeq: time 50 id: str 51 user: str 52 type: str 53 status: str 54 queued: bool 55 stoppable: bool 56 result: str 57 tfin: datetime 58 description: str 59 position_in_queue: int 60 progress: float 61 details: str 62 warnings: str 63 64 @staticmethod 65 def from_xml(xml) -> Optional["Job"]: 66 # TODO: Use correct pydantic functionalities 67 if isinstance(xml, (list, tuple)): 68 xml = first(xml) 69 if xml is None: 70 return None 71 p = mksx(xml) 72 return Job( 73 p("./tenq/text()", parser=pd), 74 p("./tdeq/text()", parser=parse_tdeq), 75 p("./id/text()"), 76 p("./user/text()"), 77 p("./type/text()"), 78 p("./status/text()"), 79 p("./queued/text()") != "NO", 80 p("./stoppable/text()") != "NO", 81 p("./result/text()"), 82 p("./tfin/text()", parser=pd), 83 p("./description/text()"), 84 p("./positionInQ/text()", parser=int), 85 p("./progress/text()", parser=parse_progress), 86 "\n".join(xml.xpath("./details/line/text()")), 87 p("./warnings/text()"), 88 )
def
parse_tdeq(d):
def
parse_progress(progress):
class
JobResult(enum.Enum):
An enumeration.
OK =
<JobResult.OK: 'OK'>
FAIL =
<JobResult.FAIL: 'FAIL'>
Inherited Members
- enum.Enum
- name
- value
@dataclass
class
Job:
46@dataclass 47class Job: 48 # TODO: Use pydantic 49 tenq: datetime 50 tdeq: time 51 id: str 52 user: str 53 type: str 54 status: str 55 queued: bool 56 stoppable: bool 57 result: str 58 tfin: datetime 59 description: str 60 position_in_queue: int 61 progress: float 62 details: str 63 warnings: str 64 65 @staticmethod 66 def from_xml(xml) -> Optional["Job"]: 67 # TODO: Use correct pydantic functionalities 68 if isinstance(xml, (list, tuple)): 69 xml = first(xml) 70 if xml is None: 71 return None 72 p = mksx(xml) 73 return Job( 74 p("./tenq/text()", parser=pd), 75 p("./tdeq/text()", parser=parse_tdeq), 76 p("./id/text()"), 77 p("./user/text()"), 78 p("./type/text()"), 79 p("./status/text()"), 80 p("./queued/text()") != "NO", 81 p("./stoppable/text()") != "NO", 82 p("./result/text()"), 83 p("./tfin/text()", parser=pd), 84 p("./description/text()"), 85 p("./positionInQ/text()", parser=int), 86 p("./progress/text()", parser=parse_progress), 87 "\n".join(xml.xpath("./details/line/text()")), 88 p("./warnings/text()"), 89 )
Job( tenq: datetime.datetime, tdeq: datetime.time, id: str, user: str, type: str, status: str, queued: bool, stoppable: bool, result: str, tfin: datetime.datetime, description: str, position_in_queue: int, progress: float, details: str, warnings: str)
65 @staticmethod 66 def from_xml(xml) -> Optional["Job"]: 67 # TODO: Use correct pydantic functionalities 68 if isinstance(xml, (list, tuple)): 69 xml = first(xml) 70 if xml is None: 71 return None 72 p = mksx(xml) 73 return Job( 74 p("./tenq/text()", parser=pd), 75 p("./tdeq/text()", parser=parse_tdeq), 76 p("./id/text()"), 77 p("./user/text()"), 78 p("./type/text()"), 79 p("./status/text()"), 80 p("./queued/text()") != "NO", 81 p("./stoppable/text()") != "NO", 82 p("./result/text()"), 83 p("./tfin/text()", parser=pd), 84 p("./description/text()"), 85 p("./positionInQ/text()", parser=int), 86 p("./progress/text()", parser=parse_progress), 87 "\n".join(xml.xpath("./details/line/text()")), 88 p("./warnings/text()"), 89 )