from __future__ import annotations from dataclasses import asdict, dataclass, field from datetime import datetime, timezone from enum import Enum from typing import Any, Dict, List, Optional def utc_now() -> str: return datetime.now(timezone.utc).astimezone().isoformat(timespec="seconds") class WorkerStatus(str, Enum): ONLINE = "online" OFFLINE = "offline" BUSY = "busy" class JobStatus(str, Enum): PENDING = "pending" RUNNING = "running" COMPLETED = "completed" FAILED = "failed" CANCELLED = "cancelled" @dataclass class Worker: id: str hostname: str = "" max_concurrent: int = 1 status: str = WorkerStatus.ONLINE.value last_heartbeat: str = field(default_factory=utc_now) current_job_id: Optional[str] = None def to_dict(self) -> dict: return asdict(self) @dataclass class Job: id: str worker_id: str status: str = JobStatus.PENDING.value title: str = "" excel_key: str = "" downloads_prefix: str = "" original_filename: str = "" cancel_requested: bool = False result: Dict[str, Any] = field(default_factory=dict) error: Optional[str] = None created_at: str = field(default_factory=utc_now) started_at: Optional[str] = None finished_at: Optional[str] = None job_id: Optional[str] = None task_id: Optional[str] = None def to_dict(self) -> dict: return asdict(self) @dataclass class JobEventRecord: id: int job_id: str event_type: str message: str timestamp: str radicado: Optional[str] = None nit: Optional[str] = None index: Optional[int] = None total: Optional[int] = None metadata: Dict[str, Any] = field(default_factory=dict) def to_dict(self) -> dict: return asdict(self)