From a38b3c1bcab1de6f43e856eb71160a570ab29145 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 14 May 2019 16:25:43 -0300 Subject: [PATCH] Rotinas para deduplicar e remover comissoes --- deduplica_comissao.py | 193 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 deduplica_comissao.py diff --git a/deduplica_comissao.py b/deduplica_comissao.py new file mode 100644 index 000000000..38a6adcfd --- /dev/null +++ b/deduplica_comissao.py @@ -0,0 +1,193 @@ +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ObjectDoesNotExist +from django.db import IntegrityError, transaction +from django.db.models import Count + +from sapl.base.models import TipoAutor, Autor +from sapl.comissoes.models import Composicao, Comissao, Reuniao +from sapl.materia.models import DespachoInicial, Autoria, Proposicao, Relatoria, UnidadeTramitacao, Tramitacao, \ + MateriaLegislativa +from sapl.norma.models import AutoriaNorma +from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo, TramitacaoAdministrativo + +models_comissoes = [Composicao, DespachoInicial, Relatoria, Reuniao, Relatoria] + +models_autor = [Autoria, AutoriaNorma, Proposicao, Protocolo, DocumentoAdministrativo] + + +def move_comissao(from_id, to_id): + # TODO: verificar se content type é o mesmo para todos os BD + content_type = ContentType.objects.get(id=37) + tipo = TipoAutor.objects.get(id=2) + + _from_comissao = Comissao.objects.get(id=from_id) + _to_comissao = Comissao.objects.get(id=to_id) + + ## TRATA TRAMITACAO + try: + _to_unidade_tramitacao = UnidadeTramitacao.objects.get(comissao=_to_comissao) + except ObjectDoesNotExist: + _to_unidade_tramitacao = UnidadeTramitacao.objects.create(comissao=_to_comissao) + + models_tramitacao = [Tramitacao, TramitacaoAdministrativo] + + for m in models_tramitacao: + for t1 in m.objects.filter(unidade_tramitacao_local__comissao=_from_comissao): + t1.unidade_tramitacao_local = _to_unidade_tramitacao + t1.save() + + for t1 in m.objects.filter(unidade_tramitacao_destino__comissao=_from_comissao): + t1.unidade_tramitacao_destino = _to_unidade_tramitacao + t1.save() + + UnidadeTramitacao.objects.filter(comissao=_from_comissao).delete() + + for m in models_comissoes: + print('atualizando model {}'.format(m)) + objects = m.objects.filter(comissao=_from_comissao) + for o in objects: + try: + o.comissao = _to_comissao + o.save() + except IntegrityError as e: + print(e) + o.delete() + + + + autor_from = Autor.objects.filter(content_type=content_type, + tipo=tipo, + object_id=_from_comissao.id).values_list('id') + if not autor_from: + return + + try: + autor_to = Autor.objects.get(content_type=content_type, + tipo=tipo, + object_id=_to_comissao.id) + except ObjectDoesNotExist: + print('criando autor para {}-{}'.format(_to_comissao.id, _to_comissao.nome)) + autor_to = Autor.objects.create(nome=_to_comissao.nome, + tipo=tipo, + content_type=content_type, + object_id=_to_comissao.id) + + to_delete = [] + + for m in models_autor: + print('atualizando autoria para {}'.format(m)) + objects = m.objects.filter(autor_id__in=autor_from) + for o in objects: + try: + original_autor = o.autor + o.autor = autor_to + o.save() + except IntegrityError as e: + o.autor = original_autor + o.save() + to_delete.append(o) + + for d in to_delete: + d.delete() + + # REMOVE AUTORES DUPLICADOS + Autor.objects.filter(id__in=autor_from).delete() + + +def estatisticas(): + # TODO: verificar se content type é o mesmo para todos os BD + content_type = ContentType.objects.get(id=37) + tipo = TipoAutor.objects.get(id=2) + + for c in Comissao.objects.all().order_by('nome'): + print('-------------------------------------------------------------------') + print(c) + + for m in models_comissoes + [UnidadeTramitacao]: + model_name = m.__name__ + total = m.objects.filter(comissao=c).count() + print(model_name, total) + + try: + autor = Autor.objects.get(content_type=content_type, tipo=tipo, object_id=c.id) + for a in models_autor: + model_name = a.__name__ + total = a.objects.filter(autor=autor).count() + print(model_name, total) + except Exception as e: + print(e) + pass + print('-------------------------------------------------------------------') + + +def delete_comissao(id): + # TODO: verificar se content type é o mesmo para todos os BD + content_type = ContentType.objects.get(id=37) + tipo = TipoAutor.objects.get(id=2) + comissao = Comissao.objects.get(id=id) + + for m in models_comissoes: + m.objects.filter(comissao=comissao).delete() + + try: + autor = Autor.objects.get(content_type=content_type, tipo=tipo, object_id=comissao.id) + for a in models_autor: + a.objects.filter(autor=autor).delete() + autor.delete() + except Exception as e: + print(e) + + try: + unidate_tramitacao = UnidadeTramitacao.objects.get(comissao=comissao) + models_tramitacao = [Tramitacao, TramitacaoAdministrativo] + for m in models_tramitacao: + m.objects.filter(unidade_tramitacao_local=unidate_tramitacao).delete() + m.objects.filter(unidade_tramitacao_destino=unidate_tramitacao).delete() + unidate_tramitacao.delete() + except Exception as e: + print(e) + + comissao.delete() + + +def deduplicate_comissao(): + # TODO: verificar se content type é o mesmo para todos os BD + content_type = ContentType.objects.get(id=37) + tipo = TipoAutor.objects.get(id=2) + comissoes_repetidas = [(c['nome'], c['total']) for c in + Comissao.objects.values('nome').annotate(total=Count('nome')).filter(total__gt=1)] + print(comissoes_repetidas) + for cr in comissoes_repetidas: + comissoes = list(Comissao.objects.filter(nome=cr[0]).order_by('id').values_list('id', flat=True)) + + print(cr) + print(comissoes) + + ## TODO: PODEM EXISTIR CASOS DA COMISSAO DE DESTINO NAO TER AUTOR, TERIA QUE CRIAR + ## TODO: POR ENQUANTO OPTEI POR PEGAR A ULTIMA COMISSAO COM AUTOR CRIADO + while True: + c = comissoes.pop() + try: + Autor.objects.get(content_type=content_type, tipo=tipo, object_id=c) + comissoes = [c] + comissoes + break + except ObjectDoesNotExist: + comissoes.append(c) + + print(comissoes) + + principal = comissoes[0] + repetidas = comissoes[1:] + + for r in repetidas: + move_comissao(r, principal) + print('apagando comissao {}'.format(r)) + Comissao.objects.get(id=r).delete() + +estatisticas() +deduplicate_comissao() +estatisticas() + + + +