from patch.include import *
from tqdm import tqdm
from sqlalchemy import or_, and_, update


@app_context(commit=True)
def fix_gantt_task_project():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202503311542_fix_gantt_task_project )
    """
    print('Запуск патча fix_gantt_task_project')
    session = models.CmfTask.dp.data_driver.Session()
    dp_gantt_task = models.CmfGanttTask.dp_model
    dp_task = models.CmfTask.dp_model

    subquery = session.query(
        dp_task.code,
        dp_task.op_gantt_task_id.label('gantt_task_id'),
        dp_task.project_id.label('correct_project_id')
    ).join(
        dp_gantt_task,
        dp_task.op_gantt_task_id == dp_gantt_task.id
    ).filter(
        or_(
            and_(
                dp_task.project_id.isnot(None),
                dp_gantt_task.project_id.isnot(None),
                dp_task.project_id != dp_gantt_task.project_id
            ),
            and_(
                dp_task.project_id.is_(None),
                dp_gantt_task.project_id.isnot(None),
            ),
            and_(
                dp_task.project_id.isnot(None),
                dp_gantt_task.project_id.is_(None),
            ),
        )
    ).subquery()

    result = session.execute(
        update(dp_gantt_task)
        .where(dp_gantt_task.id == subquery.c.gantt_task_id)
        .values(project_id=subquery.c.correct_project_id)
    )

    session.commit()

    print(f'Обновлено строк: {result.rowcount}')

if __name__ == "__main__":
    fix_gantt_task_project()
