session.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from __future__ import annotations
  2. import uuid
  3. from datetime import datetime
  4. from typing import Optional, Dict, List
  5. import os
  6. import uuid
  7. from datetime import datetime
  8. import matplotlib
  9. from .core import STORE_DIR
  10. from .schemas import SessionStatus
  11. matplotlib.use("Agg")
  12. class Session:
  13. def __init__(self, file_raw: str, file_json: str, file_order: Optional[str], sequence_name: str, digit: str,
  14. phase_shift: bool):
  15. self.session_id = str(uuid.uuid4())
  16. self.file_raw = file_raw
  17. self.file_json = file_json
  18. self.file_order = file_order
  19. self.sequence_name = sequence_name
  20. self.digit = digit
  21. self.phase_shift = phase_shift
  22. self.status = "queued"
  23. self.progress = 0.0
  24. self.message = "queued"
  25. self.created_at = datetime.utcnow().isoformat()
  26. self.updated_at = self.created_at
  27. self.work_dir = os.path.join(STORE_DIR, self.session_id)
  28. os.makedirs(self.work_dir, exist_ok=True)
  29. self.result_files: List[str] = []
  30. self.error_traceback: Optional[str] = None
  31. def to_status(self) -> SessionStatus:
  32. return SessionStatus(
  33. session_id=self.session_id, status=self.status, progress=round(self.progress, 3),
  34. message=self.message, created_at=self.created_at, updated_at=self.updated_at,
  35. result_files=[os.path.basename(p) for p in self.result_files], error_traceback=self.error_traceback
  36. )
  37. def set(self, *, status: Optional[str] = None, progress: Optional[float] = None, message: Optional[str] = None):
  38. if status is not None: self.status = status
  39. if progress is not None: self.progress = max(0.0, min(1.0, progress))
  40. if message is not None: self.message = message
  41. self.updated_at = datetime.utcnow().isoformat()
  42. SESSIONS: Dict[str, Session] = {}