From 2928c93c3e339d6a76009859d0b85146f063e090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moraes?= Date: Thu, 24 Sep 2026 15:55:10 -0300 Subject: [PATCH] =?UTF-8?q?Remove=20presen=C3=A7as=20duplicadas=20com=20Ru?= =?UTF-8?q?nSQL=20na=20migra=C3=A7=C3=A3o=200070?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Substitui o RunPython por um DELETE ... USING por tabela, conforme sugestão da revisão: mantém a presença de menor id de cada par (sessão, parlamentar), agora também em sessao_presencaordemdia. A preferência por data_sessao preenchida foi abandonada, já que o campo não é lido nem escrito em nenhum ponto do código. --- .../0070_presenca_unica_por_sessao.py | 49 +++++++------------ 1 file changed, 17 insertions(+), 32 deletions(-) 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')},