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


@app_context(commit=True)
def fix_gantt_task_project_sync():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202604160847_fix_gantt_task_project_sync )

    Синхронизация CmfGanttTask.project с CmfTask.project.
    Исправляет расхождения, когда gantt-задача имеет другой project или project=None.
    """
    print('Запуск патча fix_gantt_task_project_sync')
    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.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_sync()
