from patch.include import *
from tqdm import tqdm
from cmf.base_error import CmfAbortError


@app_context(commit=False)
def resource_planning():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.calc_project_resource_planning )
    """
    print('Запуск патча resource_planning')

    project_code = input('Введите код проекта: ')
    project = models.CmfProject.get(code=project_code)

    _filter = [['op_gantt_task.sched_start_date', '!=', None],
               ['parent', '==', project],
               ['OR', ['responsible', '!=', None],
                      ['executors', 'EXISTS', '']]]
    _fields = ['name', 'executors', 'responsible', 'executors.calendar', 'responsible.calendar',
               'op_gantt_task', 'op_gantt_task.sched_start_date']

    count = models.CmfTask.count(filter=_filter)
    print(f'Время выполнения патча не менее: {int((count * 0.25) / 60)} минут.')
    print('Рекомендуется запускать в нерабочее время, так как во время выполнения задачи могут быть заблокированы.')
    reply = input('Начать выполнение патча (y/n): ')
    if reply not in ['y', 'Y', 'yes', 'Yes']:
        return

    errors = []

    i = 0
    while True:
        task_list = models.CmfTask.list(slice=[i, i + 500], order_by=['cmf_created_at'],
                                        filter=_filter, fields=_fields)
        if not task_list:
            break

        for task in task_list:
            try:
                models.CmfTaskResAssign.sync_task_resources(task)
            except CmfAbortError as e:
                errors.append((task.code, task.name, str(e)))
        cmf_commit()
        i += 500

    for task_code, task_name, error_text in errors:
        print()
        print('Возникла ошибка при назначении ресурсов на задачу: ')
        print('Код задачи:      ', task_code)
        print('Название задачи: ', task_name)
        print()
        print(error_text)
        print()

if __name__ == "__main__":
    resource_planning()
