/
gr.ev.vl
/
TestGen
Обзор
Документация
Войти
/
gr.ev.vl
/
TestGen
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master2
backend/src/testgen/tasks/export.py
87 строк
3 KB
gr.ev.vl
Initial commit
06 июн 2026, 02:41
06 июн 2026, 02:41
02fb1fb
Код
Авторство
О чём код?
""" Фоновые задачи экспорта. """ import asyncio import logging from uuid import UUID from ..core.enums import ExportFormat from ..infrastructure.database.session import async_session_factory from ..infrastructure.storage.file_storage import FileStorage from ..services.export import ExportService from .celery_app import celery_app logger = logging.getLogger(__name__) def _run_async(coro): """Запускает асинхронную корутину в синхронном контексте Celery.""" loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) try: return loop.run_until_complete(coro) finally: loop.close() @celery_app.task( bind=True, queue="export", max_retries=2, default_retry_delay=30, ) def export_questions_task( self, question_ids: list[str], format: str, include_explanations: bool, include_taxonomy: bool, user_id: str | None, ) -> dict: """ Задача: экспорт вопросов в файл. Args: question_ids: Список ID вопросов format: Формат экспорта include_explanations: Включить пояснения include_taxonomy: Включить таксономию user_id: ID пользователя Returns: Информация о созданном файле """ async def _run(): session = async_session_factory() try: file_storage = FileStorage() export_service = ExportService(session, file_storage) job = await export_service.export( question_ids=[UUID(qid) for qid in question_ids], format=ExportFormat(format), include_explanations=include_explanations, include_taxonomy=include_taxonomy, user_id=UUID(user_id) if user_id else None, ) return { "export_id": str(job.id), "file_name": job.file_name, "file_path": job.file_path, "question_count": job.question_count, "file_size_bytes": job.file_size_bytes, } finally: await session.close() try: result = _run_async(_run()) logger.info( f"Export completed: {result['file_name']} ({result['question_count']} questions)" ) return result except Exception as exc: logger.error(f"Export failed: {exc}") raise self.retry(exc=exc)