diff --git a/sapl/sessao/migrations/0070_presenca_unica_por_sessao.py b/sapl/sessao/migrations/0070_presenca_unica_por_sessao.py index 3f6f384b2..ff71601b1 100644 --- a/sapl/sessao/migrations/0070_presenca_unica_por_sessao.py +++ b/sapl/sessao/migrations/0070_presenca_unica_por_sessao.py @@ -1,38 +1,18 @@ # Generated by Django 2.2.28 on 2026-08-05 16:00 from django.db import migrations -from django.db.models import Count -def remove_presencas_duplicadas(apps, schema_editor): - """Mantém uma única presença por (sessão, parlamentar). - - Presença é um sim/não, então as linhas repetidas não carregam informação - adicional: preserva-se a de menor id e descartam-se as demais. Em - SessaoPlenariaPresenca dá-se preferência a uma linha com data_sessao - preenchida, caso exista, para não perder o único campo que as diferencia. - """ - for model_name, tem_data_sessao in (('SessaoPlenariaPresenca', True), - ('PresencaOrdemDia', False)): - model = apps.get_model('sessao', model_name) - # list() para materializar antes de apagar dentro do laço - duplicados = list(model.objects.values_list( - 'sessao_plenaria_id', 'parlamentar_id').annotate( - total=Count('id')).filter(total__gt=1)) - - for sessao_id, parlamentar_id, _total in duplicados: - linhas = list(model.objects.filter( - sessao_plenaria_id=sessao_id, - parlamentar_id=parlamentar_id).order_by('id')) - manter = linhas[0] - if tem_data_sessao: - com_data = [x for x in linhas if x.data_sessao is not None] - if com_data: - manter = com_data[0] - model.objects.filter( - sessao_plenaria_id=sessao_id, - parlamentar_id=parlamentar_id).exclude( - id=manter.id).delete() +# Mantém uma única presença por (sessão, parlamentar). Presença é um sim/não, +# então as linhas repetidas não carregam informação adicional: preserva-se a +# de menor id e descartam-se as demais. +REMOVE_DUPLICADAS_SQL = """ + DELETE FROM {tabela} a + USING {tabela} b + WHERE a.sessao_plenaria_id = b.sessao_plenaria_id + AND a.parlamentar_id = b.parlamentar_id + AND a.id > b.id; +""" class Migration(migrations.Migration): @@ -42,8 +22,13 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(remove_presencas_duplicadas, - migrations.RunPython.noop), + migrations.RunSQL( + REMOVE_DUPLICADAS_SQL.format( + tabela='sessao_sessaoplenariapresenca'), + migrations.RunSQL.noop), + migrations.RunSQL( + REMOVE_DUPLICADAS_SQL.format(tabela='sessao_presencaordemdia'), + migrations.RunSQL.noop), migrations.AlterUniqueTogether( name='sessaoplenariapresenca', unique_together={('sessao_plenaria', 'parlamentar')},