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


@app_context(commit=True)
def fix_gantt_task_parent_task():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202505151544_fix_gantt_task_parent_task )
    Здесь можно работать с моделями через models.CmfTask и т.д.
    Для прогрессбара используйте:
    for task in tqdm(models.CmfTask.list()):
        ...
    """
    print('Запуск патча fix_gantt_task_parent_task')

    GanttTask = models.CmfGanttTask.dp_model
    Task = models.CmfTask.dp_model

    session = models.CmfGanttTask.dp.data_driver.Session()

    cond = or_(
        and_(GanttTask.parent_task_id.isnot(None),
             Task.parent_task_id.isnot(None),
             GanttTask.parent_task_id != Task.parent_task_id),
        and_(GanttTask.parent_task_id.is_(None),
             Task.parent_task_id.isnot(None)),
        and_(GanttTask.parent_task_id.isnot(None),
             Task.parent_task_id.is_(None)),
    )

    mismatched = (
        session.query(GanttTask, Task.parent_task_id.label('correct_parent'))
            .join(Task, GanttTask.task_id == Task.id)
            .filter(cond)
            .all()
    )

    for gt, correct_parent in mismatched:
        gt.parent_task_id = correct_parent

    cmf_commit()

if __name__ == "__main__":
    fix_gantt_task_parent_task()
