From a38b3c1bcab1de6f43e856eb71160a570ab29145 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 14 May 2019 16:25:43 -0300 Subject: [PATCH 1/8] 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() + + + + From b6d4908f71877afb7669868701b7cc4d026a0c75 Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 20 May 2019 14:06:33 -0300 Subject: [PATCH 2/8] Update deduplica_comissao.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: João Rodrigues --- deduplica_comissao.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deduplica_comissao.py b/deduplica_comissao.py index 38a6adcfd..a4f3e53a7 100644 --- a/deduplica_comissao.py +++ b/deduplica_comissao.py @@ -10,7 +10,7 @@ from sapl.materia.models import DespachoInicial, Autoria, Proposicao, Relatoria, from sapl.norma.models import AutoriaNorma from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo, TramitacaoAdministrativo -models_comissoes = [Composicao, DespachoInicial, Relatoria, Reuniao, Relatoria] +models_comissoes = [Composicao, DespachoInicial, Relatoria, Reuniao] models_autor = [Autoria, AutoriaNorma, Proposicao, Protocolo, DocumentoAdministrativo] From b0ff29fa2e1da70586ef0036723fc35876e88c4f Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 20 May 2019 14:06:43 -0300 Subject: [PATCH 3/8] Update deduplica_comissao.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: João Rodrigues --- deduplica_comissao.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deduplica_comissao.py b/deduplica_comissao.py index a4f3e53a7..9e2ea96d7 100644 --- a/deduplica_comissao.py +++ b/deduplica_comissao.py @@ -166,7 +166,7 @@ def deduplicate_comissao(): ## 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() + c = comissoes.pop(0) try: Autor.objects.get(content_type=content_type, tipo=tipo, object_id=c) comissoes = [c] + comissoes From 5cb33fe63a7ed0af4ea3fc31776b3ce1f4388767 Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 20 May 2019 14:06:57 -0300 Subject: [PATCH 4/8] Update deduplica_comissao.py Co-Authored-By: Cesar Augusto de Carvalho --- deduplica_comissao.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deduplica_comissao.py b/deduplica_comissao.py index 9e2ea96d7..5355248ba 100644 --- a/deduplica_comissao.py +++ b/deduplica_comissao.py @@ -25,7 +25,7 @@ def move_comissao(from_id, to_id): ## TRATA TRAMITACAO try: - _to_unidade_tramitacao = UnidadeTramitacao.objects.get(comissao=_to_comissao) + _to_unidade_tramitacao = UnidadeTramitacao.objects.get_or_create(comissao=_to_comissao) except ObjectDoesNotExist: _to_unidade_tramitacao = UnidadeTramitacao.objects.create(comissao=_to_comissao) From ee46b66e10d66c23fb7136eb74e86b341f68761b Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 20 May 2019 14:07:04 -0300 Subject: [PATCH 5/8] Update deduplica_comissao.py Co-Authored-By: Cesar Augusto de Carvalho --- deduplica_comissao.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deduplica_comissao.py b/deduplica_comissao.py index 5355248ba..525e82ea3 100644 --- a/deduplica_comissao.py +++ b/deduplica_comissao.py @@ -50,7 +50,7 @@ def move_comissao(from_id, to_id): o.comissao = _to_comissao o.save() except IntegrityError as e: - print(e) + print(str(e)) o.delete() From ff316b5d8ce8669fc27e70674d8068688ea2059a Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 20 May 2019 14:07:10 -0300 Subject: [PATCH 6/8] Update deduplica_comissao.py Co-Authored-By: Cesar Augusto de Carvalho --- deduplica_comissao.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deduplica_comissao.py b/deduplica_comissao.py index 525e82ea3..ba152f02e 100644 --- a/deduplica_comissao.py +++ b/deduplica_comissao.py @@ -135,7 +135,7 @@ def delete_comissao(id): a.objects.filter(autor=autor).delete() autor.delete() except Exception as e: - print(e) + print(str(e)) try: unidate_tramitacao = UnidadeTramitacao.objects.get(comissao=comissao) From 013f0296d52b5456aac041bc1a5f0d7cd72f36f1 Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 20 May 2019 14:07:49 -0300 Subject: [PATCH 7/8] Update deduplica_comissao.py Co-Authored-By: Cesar Augusto de Carvalho --- deduplica_comissao.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deduplica_comissao.py b/deduplica_comissao.py index ba152f02e..8c6dd7dde 100644 --- a/deduplica_comissao.py +++ b/deduplica_comissao.py @@ -115,7 +115,7 @@ def estatisticas(): total = a.objects.filter(autor=autor).count() print(model_name, total) except Exception as e: - print(e) + print(str(e)) pass print('-------------------------------------------------------------------') From 4fb0b99ad53b57b527d04072fd572375f628e384 Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 20 May 2019 14:07:55 -0300 Subject: [PATCH 8/8] Update deduplica_comissao.py Co-Authored-By: Cesar Augusto de Carvalho --- deduplica_comissao.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deduplica_comissao.py b/deduplica_comissao.py index 8c6dd7dde..769af0e15 100644 --- a/deduplica_comissao.py +++ b/deduplica_comissao.py @@ -145,7 +145,7 @@ def delete_comissao(id): m.objects.filter(unidade_tramitacao_destino=unidate_tramitacao).delete() unidate_tramitacao.delete() except Exception as e: - print(e) + print(str(e)) comissao.delete()