from tqdm import tqdm
tqdm.monitor_interval = 0

from patch.include import *


@app_context(commit=True)
def fix_lists():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202512051348_fix_lists )
    Здесь можно работать с моделями через models.CmfTask и т.д.
    Для прогрессбара используйте:
    for task in tqdm(models.CmfTask.list()):
        ...
    """
    print('Запуск патча fix_lists')
    step = 1000
    _filter = [['cache_status_type', '==', 'IN_PROGRESS'], ['workflow', '!=', None],
               ['logic_prefix', '==', 'list.base']]
    cnt = models.CmfList.count(filter=_filter)
    i = 0
    while i*step<cnt:
        for _list in tqdm(
            models.CmfList.list(
                filter=_filter,
                slice=[step*i, step*i + step],
                fields=['members.op_gantt_task.*', 'members.*']
            )
        ):
            for task in tqdm(_list.members):
                if models.CmfListHistoryOTR.count(task_list_id=_list.id, task_id=task.id):
                    continue
                print(f'Отсутсвует история по задаче {task} в списке {_list}')
                estimate_duration = task.op_gantt_task.sched_duration.value or 0
                spent_duration = task.op_gantt_task.actual_work.value or 0
                remaining_duration = max(estimate_duration - spent_duration, 0)
                _list.history_otr_add(task.id.value, 'append',
                                      estimate_sp=task.agile_story_points.value,
                                      estimate_duration=task.op_gantt_task.sched_duration.value,
                                      estimate_work=task.op_gantt_task.sched_work.value,
                                      estimate_count=1,
                                      status_type=task.cache_status_type)
                _list.history_rte_add(task.id.value, timetracker_history_id=None,
                                      task_operate='append', task_list_operate='scope-changed',
                                      estimate_duration=remaining_duration,
                                      remaining_duration=remaining_duration,
                                      spent_duration=spent_duration)
                cmf_commit()

            cmf_commit()
        i += 1


if __name__ == "__main__":
    fix_lists()
