You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iTi-Flask/iti/exchange/tasks.py

60 lines
1.6 KiB
Python

from __future__ import annotations
from dataclasses import dataclass
from typing import Any
from iti.storage import StorageManager
from iti.tasks import task_registry
from .base import ExchangeTaskKind
@dataclass(frozen=True)
class ExchangeTaskContext:
task_kind: ExchangeTaskKind
template_id: str
version: str
storage_key: str | None = None
payload: dict[str, Any] | None = None
@dataclass(frozen=True)
class ExchangeTaskResult:
success_count: int = 0
failed_count: int = 0
message: str | None = None
result_payload: dict[str, Any] | None = None
def register_exchange_task(
*,
name: str,
handler,
schedule: str | None = None,
description: str | None = None,
):
return task_registry.register(
name=name,
handler=handler,
schedule=schedule,
description=description,
)
def wrap_exchange_task(handler):
def runner(context: ExchangeTaskContext):
return handler(context)
return runner
def get_exchange_storage(app):
base_config = dict(getattr(app.state.config, "file_storage", {}) or {})
exchange_config = dict(getattr(app.state.config, "exchange_storage", {}) or {})
base_config.update(exchange_config)
default_storage = getattr(app.state.config, "exchange_default_storage", None)
if default_storage and "DEFAULT_STORAGE_TYPE" not in exchange_config:
base_config["DEFAULT_STORAGE_TYPE"] = default_storage
base_dir = getattr(app.state.config, "base_dir", None)
return StorageManager.get_storage(config=base_config, base_dir=base_dir)