from patch.include import *
from tqdm import tqdm


@app_context(commit=True)
def patch():
    """
    Для тестирования патча: ( cd /opt/crm; python3 -m patch.20220XXXXXXX_PATCHNAME )
    Здесь можно работать с моделями через models.CmfTask и т.д.
    Для прогрессбара используйте:
    for task in tqdm(models.CmfTask.list()):
        ...
    """
    _fields=['cmf_import.plugin.plugin.source_hash', 'ext_id']
    model_names = ['CmfComment', 'CmfDocument', 'CmfProject', 'CmfStatus', 
                   'CmfWorkflow', 'CmfSchemeWf', 'CmfStatusCode', 'CmfProjectRole', 'CmfKanbanBoard', 
                   'CmfList', 'CmfRelationType', 'CmfRelationOption', 'CmfTrans', 'CmfProjectPermScheme',
                   'CmfProjectPermSchemeRule', 'CmfTask']
    for model_name in model_names:
        model = vars(models)[model_name]
        cnt = model.count(filter=['cmf_import', '!=', None], fields=_fields)
        step = 1000
        i = 0
        while cnt > 0:
            for obj in tqdm(model.list(filter=['cmf_import', '!=', None], fields=_fields,
                                       slice=[i*step, i*step + step])):
                if obj.ext_id and obj.cmf_import.plugin.plugin.source_hash.value and obj.cmf_import.plugin.plugin.source_hash.value not in obj.ext_id:
                    obj.ext_id = f"{obj.cmf_import.plugin.plugin.source_hash}::{obj.ext_id}"
                    obj.save(only_data=True)
                    commit_with_event()
            cnt -= step
            i += 1


if __name__ == "__main__":
    patch()
