mirror of https://github.com/interlegis/sapl.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
4.9 KiB
109 lines
4.9 KiB
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()
|
|
|