from patch.include import *
from tqdm import tqdm


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

    with cmfutil.disable_acl(), cmfutil.disable_notify():
        filter = [
                    'OR',
                    [['has_related_tasks', '=', True], ['in_tasks', 'NOT EXISTS', []], ['out_tasks', 'NOT EXISTS', []]],
                    [['has_related_tasks', '=', False], ['OR', ['in_tasks', 'EXISTS', []], ['out_tasks', 'EXISTS', []]]]
                ]

        fields = ['has_related_tasks']

        cycle_count = 0

        while (tasks := models.CmfTask.list(fields=fields, filter=filter, include_archived=True, slice=[0, 1000])):
            for task in tqdm(tasks):
                task.has_related_tasks = not task.has_related_tasks
                task.save(only_data=True, emit=False, notify=False)

            commit_all_ds()
            cycle_count += 1

            if cycle_count > 10000:
                print('Останов после изменения 10М задач')
                break

if __name__ == "__main__":
    has_related_tasks()
