Browse Source

Remove presenças duplicadas com RunSQL na migração 0070

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.
pull/3850/head
João Moraes 2 weeks ago
parent
commit
2928c93c3e
  1. 47
      sapl/sessao/migrations/0070_presenca_unica_por_sessao.py

47
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 # Generated by Django 2.2.28 on 2026-08-05 16:00
from django.db import migrations 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,
"""Mantém uma única presença por (sessão, parlamentar). # então as linhas repetidas não carregam informação adicional: preserva-se a
# de menor id e descartam-se as demais.
Presença é um sim/não, então as linhas repetidas não carregam informação REMOVE_DUPLICADAS_SQL = """
adicional: preserva-se a de menor id e descartam-se as demais. Em DELETE FROM {tabela} a
SessaoPlenariaPresenca dá-se preferência a uma linha com data_sessao USING {tabela} b
preenchida, caso exista, para não perder o único campo que as diferencia. WHERE a.sessao_plenaria_id = b.sessao_plenaria_id
AND a.parlamentar_id = b.parlamentar_id
AND a.id > b.id;
""" """
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()
class Migration(migrations.Migration): class Migration(migrations.Migration):
@ -42,8 +22,13 @@ class Migration(migrations.Migration):
] ]
operations = [ operations = [
migrations.RunPython(remove_presencas_duplicadas, migrations.RunSQL(
migrations.RunPython.noop), REMOVE_DUPLICADAS_SQL.format(
tabela='sessao_sessaoplenariapresenca'),
migrations.RunSQL.noop),
migrations.RunSQL(
REMOVE_DUPLICADAS_SQL.format(tabela='sessao_presencaordemdia'),
migrations.RunSQL.noop),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='sessaoplenariapresenca', name='sessaoplenariapresenca',
unique_together={('sessao_plenaria', 'parlamentar')}, unique_together={('sessao_plenaria', 'parlamentar')},

Loading…
Cancel
Save