"""Models for smart downloader.""" import dataclasses import datetime import json from typing import List from typing import Optional class Status: """Status of download request.""" NEW = 'NEW' PROCESSING = 'PROCESSING' DONE = 'DONE' ERROR = 'ERROR' class BaseDataClassMixin: """Mixin for dataclasses.""" def to_dict(self, **kwargs): """Convert self to dict.""" return dataclasses.asdict(self) def to_json(self, **json_kwargs): """Convert self to json string.""" return json.dumps(self.to_dict(), **json_kwargs) @dataclasses.dataclass class DownloadTask: """Represents single download task.""" source_url: str destination_url: str @dataclasses.dataclass class DownloadRequest(BaseDataClassMixin): """Represents one request for smart downloader.""" tasks: List[DownloadTask] tasksMessageId: str status: Status = Status.NEW n_threads: Optional[int] = None @dataclasses.dataclass class DownloadResponse(BaseDataClassMixin): """Represents response for smart downloader.""" return_code: Optional[int] = None duration: Optional[float] = None n_threads: Optional[int] = None n_tasks: Optional[int] = None processing_started_at: Optional[datetime.datetime] = None processing_finished_at: Optional[datetime.datetime] = None