from patch.include import *
from tqdm import tqdm


@app_context(commit=True)
def fix_sprints():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202310091518_fix_sprints )
    Здесь можно работать с моделями через models.CmfTask и т.д.
    Для прогрессбара используйте:
    for task in tqdm(models.CmfTask.list()):
        ...
    """
    print('Запуск патча fix_sprints')
    step = 1000
    _filter = [['cache_status_type', '==', 'IN_PROGRESS'], ['workflow', '!=', None],
               ['logic_prefix', '==', 'list.agile_sprint']]
    cnt = models.CmfList.count(filter=_filter)
    i = 0
    while i*step<cnt:
        for sprint in tqdm(models.CmfList.list(filter=_filter, slice=[step*i, step*i + step], fields=['members.op_gantt_task.*', 'members.*'])):
            if not models.CmfListHistoryOTR.count(task_list_id=sprint.id):
                print(f'Стартуем {sprint}')
                sprint.do_start()
            for task in tqdm(sprint.members):
                if models.CmfListHistoryOTR.count(task_list_id=sprint.id, task_id=task.id):
                    continue
                print(f'Отсутсвует история по задаче {task} в спринте {sprint}')
                estimate_duration = task.op_gantt_task.sched_duration.value or 0
                spent_duration = task.op_gantt_task.actual_work.value or 0
                remaining_duration = estimate_duration - spent_duration
                if remaining_duration < 0:
                    remaining_duration = 0
                sprint.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)
                sprint.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)
                commit_all_ds()
                    
            commit_all_ds()
        i += 1
        

if __name__ == "__main__":
    fix_sprints()
