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()):
        ...
    """
    # Заставляем пересчитать acl-поля у объектов с ACL
    # Чтобы нормально проставились все кеш-поля у ACL, в т.ч. рекурсивно по дереву вниз
    spread_models = cmf.models.CmfEntity.iter_subclasses()
    for model in spread_models:
        for obj in model.list(filter=['perm_has_acl', '=', True]):
            print(obj)
            obj.perm_has_acl.is_changed = True
            obj.perm_effective_acl_id.is_changed = True
            obj.cmf_owner_id.is_changed = True
            obj.perm_inherit.is_changed = True
            obj.perm_acl.is_changed = True
            obj.perm_inherit_acl_id.is_changed = True
            obj.perm_effective_acl_id.is_changed = True
            obj.save(emit=False, notify=False)

            # Нужно явно вызвать _acl_spread_inheritance, т.к. фейк-is_changed сбрасывается в save
            obj.cmf_owner_id.is_changed = True
            obj.perm_effective_acl_id.is_changed = True
            obj._acl_spread_inheritance()


if __name__ == "__main__":
    patch()
