87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
from sqlalchemy import create_engine
|
||
from sqlalchemy.orm import sessionmaker, Session
|
||
from contextlib import contextmanager
|
||
from rag.settings import settings
|
||
|
||
|
||
# Создаем синхронный engine для Celery (так как Celery работает в отдельных процессах)
|
||
sync_engine = create_engine(
|
||
settings.database_url.replace("asyncpg", "psycopg2"), # Убираем asyncpg для синхронного подключения
|
||
echo=False,
|
||
future=True
|
||
)
|
||
|
||
# Создаем синхронный session maker
|
||
SyncSessionLocal = sessionmaker(
|
||
bind=sync_engine,
|
||
autocommit=False,
|
||
autoflush=False
|
||
)
|
||
|
||
|
||
@contextmanager
|
||
def get_sync_session() -> Session:
|
||
"""Получить синхронную сессию для использования в Celery tasks"""
|
||
session = SyncSessionLocal()
|
||
try:
|
||
yield session
|
||
session.commit()
|
||
except Exception:
|
||
session.rollback()
|
||
raise
|
||
finally:
|
||
session.close()
|
||
|
||
|
||
class SyncResumeRepository:
|
||
"""Синхронный repository для работы с Resume в Celery tasks"""
|
||
|
||
def __init__(self, session: Session):
|
||
self.session = session
|
||
|
||
def get_by_id(self, resume_id: int):
|
||
"""Получить резюме по ID"""
|
||
from app.models.resume import Resume
|
||
return self.session.query(Resume).filter(Resume.id == resume_id).first()
|
||
|
||
def update_status(self, resume_id: int, status: str, parsed_data: dict = None, error_message: str = None):
|
||
"""Обновить статус резюме"""
|
||
from app.models.resume import Resume, ResumeStatus
|
||
from datetime import datetime
|
||
|
||
resume = self.session.query(Resume).filter(Resume.id == resume_id).first()
|
||
|
||
if resume:
|
||
# Обновляем статус
|
||
if status == 'parsing':
|
||
resume.status = ResumeStatus.PARSING
|
||
elif status == 'parsed':
|
||
resume.status = ResumeStatus.PARSED
|
||
if parsed_data:
|
||
resume.parsed_data = parsed_data
|
||
# НЕ перезаписываем контактные данные из формы - они уже правильные
|
||
elif status == 'failed':
|
||
resume.status = ResumeStatus.PARSE_FAILED
|
||
if error_message:
|
||
resume.parse_error = error_message
|
||
|
||
resume.updated_at = datetime.utcnow()
|
||
self.session.add(resume)
|
||
return resume
|
||
|
||
return None
|
||
|
||
def update_interview_plan(self, resume_id: int, interview_plan: dict):
|
||
"""Обновить план интервью"""
|
||
from app.models.resume import Resume
|
||
from datetime import datetime
|
||
|
||
resume = self.session.query(Resume).filter(Resume.id == resume_id).first()
|
||
|
||
if resume:
|
||
resume.interview_plan = interview_plan
|
||
resume.updated_at = datetime.utcnow()
|
||
self.session.add(resume)
|
||
return resume
|
||
|
||
return None |