from django.db.models import Count from sapl.base.models import Autor from sapl.comissoes.models import Participacao from sapl.materia.models import Relatoria, UnidadeTramitacao, Autoria, Proposicao from sapl.norma.models import AutoriaNorma from sapl.parlamentares.models import ( Parlamentar, ComposicaoMesa, Dependente, Filiacao, Mandato, Frente, Votante, ) from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo from sapl.sessao.models import ( IntegranteMesa, JustificativaAusencia, OradorExpediente, PresencaOrdemDia, RetiradaPauta, SessaoPlenariaPresenca, VotoParlamentar, OradorOrdemDia, ) models = [ ComposicaoMesa, Dependente, Filiacao, IntegranteMesa, JustificativaAusencia, Mandato, OradorOrdemDia, OradorExpediente, Participacao, PresencaOrdemDia, Relatoria, RetiradaPauta, SessaoPlenariaPresenca, UnidadeTramitacao, VotoParlamentar, Votante, ] # Tratar FRENTE pois ela é 1-to-many (campo parlamentares) com Parlamentar models_autor = [ AutoriaNorma, Autoria, Frente, Proposicao, Protocolo, DocumentoAdministrativo, ] ## Verificar se TipoAutor é sempre 1 para parlamentar e ContentType é sempre 26 para parlamentar. TIPO_PARLAMENTAR = 1 CONTENT_TYPE_PARLAMENTAR = 26 def recupera_parlamentares(): return [ [ parlamentar for parlamentar in Parlamentar.objects.filter( nome_parlamentar=nome_parlamentar ).order_by("id") ] for nome_parlamentar in Parlamentar.objects.values_list( "nome_parlamentar", flat=True ) .annotate(qntd=Count("nome_parlamentar")) .filter(qntd__gt=1) ] def deduplica_parlamentares(parlamentares): for parlamentar in parlamentares: parlamentar_principal = parlamentar[0] print("Corrigindo parlamentar {}".format(parlamentar_principal)) for clone in parlamentar[1:]: if parlamentar_principal.biografia and clone.biografia: parlamentar_principal.biografia += ( f"\n\n------------------------\n\n{clone.biografia}" ) parlamentar_principal.save() elif clone.biografia: parlamentar_principal.biografia = clone.biografia autor_principal = Autor.objects.filter( tipo_id=TIPO_PARLAMENTAR, content_type_id=CONTENT_TYPE_PARLAMENTAR, object_id=parlamentar_principal.id, ) for a in Autor.objects.filter( tipo_id=TIPO_PARLAMENTAR, content_type_id=CONTENT_TYPE_PARLAMENTAR, object_id=clone.id, ): if not autor_principal: print("Ajustando autor de %s" % parlamentar) a.object_id = parlamentar_principal.id try: a.save() except Exception as e: print( f"Erro ao mover referencia de autor do model {ma} para {autor_principal[0]}" ) print(e) else: print("Movendo referencias de autor") for ma in models_autor: for ra in ma.objects.filter(autor=a): ra.autor = autor_principal[0] try: ra.save() except Exception as e: print( f"Erro ao mover referencia de autor do model {ma} para {autor_principal[0]}" ) print(e) a.delete() # Muda apontamento de models que referenciam parlamentar for model in models: print(f"Mudando apontamento de model {model}...") for obj in model.objects.filter(parlamentar_id=clone.id): obj.parlamentar = parlamentar_principal try: obj.save() except Exception as e: print( f"Erro ao alterar parlamentar do model {model} para a instancia {obj}" ) print(e) clone.delete() def estatisticas(parlamentares): stats = [] for ps in parlamentares: for p in ps: d = { "id": p.id, "nome": p.nome_parlamentar, "stats": { m.__name__: m.objects.filter(parlamentar=p).count() for m in models }, } for m in models_autor: d["stats"].update( { m.__name__: m.objects.filter( autor__object_id=p.id, autor__content_type=CONTENT_TYPE_PARLAMENTAR, autor__tipo_id=TIPO_PARLAMENTAR, ).count() } ) stats.append(d) for s in stats: print("---------------------------------------------------") print(s["id"], s["nome"]) print(s["stats"]) def main(): parlamentares = recupera_parlamentares() estatisticas(parlamentares) deduplica_parlamentares(parlamentares) estatisticas(parlamentares) if __name__ == "__main__": main()