from patch.include import *
from collections import defaultdict


@app_context(commit=True)
def del_self_referencing_relations():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202501291350_del_self_referencing_relations )
    Удаляет связи, ссылающиеся сами на себя и дубли связей
    """
    print('Запуск патча del_self_referencing_relations')


    relations_set = set()
    duplicate_ids = set()
    self_referencing_rel_ids = set()

    rels = models.CmfRelationOption.slist(fields=['in_link_id', 'out_link_id', 'relation_type_id'])
    for rel in rels:
        if rel.in_link_id == rel.out_link_id:
            self_referencing_rel_ids.add(rel.id)
        elif (rel.in_link_id, rel.out_link_id, rel.relation_type_id) in relations_set:
            duplicate_ids.add(rel.id)
        else:
            relations_set.add((rel.in_link_id, rel.out_link_id, rel.relation_type_id))

    delete_ids = self_referencing_rel_ids | duplicate_ids
    _filter = ['id', 'IN', delete_ids]
    models.CmfRelationOption.bulk_delete(filter=_filter)


if __name__ == "__main__":
    del_self_referencing_relations()
