From ce621d8e486f1c01e6eb133a55ea69e4acb30548 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Wed, 11 Jul 2018 15:16:09 -0300 Subject: [PATCH 1/5] =?UTF-8?q?Corrige=20set=20generic=20fk=20na=20migra?= =?UTF-8?q?=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 4c953d5f5..45b3c9338 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -141,10 +141,6 @@ models_novos_para_antigos = { for model in field_renames} models_novos_para_antigos[Composicao] = models_novos_para_antigos[Participacao] -content_types = {model: ContentType.objects.get( - app_label=model._meta.app_label, model=model._meta.model_name) - for model in field_renames} - campos_novos_para_antigos = { model._meta.get_field(nome_novo): nome_antigo for model, renames in field_renames.items() @@ -1156,7 +1152,9 @@ def adjust_tipoafastamento(new, old): def set_generic_fk(new, campo_virtual, old): - new.content_type = content_types[campo_virtual.related_model] + model = campo_virtual.related_model + new.content_type = ContentType.objects.get( + app_label=model._meta.app_label, model=model._meta.model_name) new.object_id = get_fk_related(campo_virtual, old) From 05c6660e748523f991e16e805708ec535f4b6beb Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Wed, 11 Jul 2018 15:30:43 -0300 Subject: [PATCH 2/5] Migra perfil operador painel (do sapl 3.0) --- sapl/legacy/migracao_usuarios.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/legacy/migracao_usuarios.py b/sapl/legacy/migracao_usuarios.py index 51b3348c8..d767343a3 100644 --- a/sapl/legacy/migracao_usuarios.py +++ b/sapl/legacy/migracao_usuarios.py @@ -16,6 +16,7 @@ PERFIL_LEGADO_PARA_NOVO = {legado: Group.objects.get(name=novo) ('Operador Protocolo', 'Operador de Protocolo Administrativo'), ('Operador Sessao Plenaria', 'Operador de Sessão Plenária'), ('Parlamentar', 'Votante'), + ('Operador Painel', 'Operador de Painel Eletrônico'), ] } From 43f86e3d796f96b5d39d023d19037d364a144d4c Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 13 Jul 2018 15:03:45 -0300 Subject: [PATCH 3/5] Torna apagar legado opcional --- .../management/commands/migracao_25_31.py | 11 +++++++- sapl/legacy/migracao.py | 4 +-- sapl/legacy/migracao_dados.py | 25 ++++++++++--------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/sapl/legacy/management/commands/migracao_25_31.py b/sapl/legacy/management/commands/migracao_25_31.py index e3864ad0f..ba9a80224 100644 --- a/sapl/legacy/management/commands/migracao_25_31.py +++ b/sapl/legacy/management/commands/migracao_25_31.py @@ -7,5 +7,14 @@ class Command(BaseCommand): help = 'Migração de dados do SAPL 2.5 para o SAPL 3.1' + def add_arguments(self, parser): + parser.add_argument( + '-a', + action='store_true', + default=False, + dest='apagar_do_legado', + help='Apagar entradas migradas do legado', + ) + def handle(self, *args, **options): - migrar(interativo=False) + migrar(apagar_do_legado=options['apagar_do_legado']) diff --git a/sapl/legacy/migracao.py b/sapl/legacy/migracao.py index dd54a103e..c4c183b84 100644 --- a/sapl/legacy/migracao.py +++ b/sapl/legacy/migracao.py @@ -18,7 +18,7 @@ def adornar_msg(msg): return '\n{1}\n{0}\n{1}'.format(msg, '#' * len(msg)) -def migrar(interativo=False): +def migrar(apagar_do_legado=False): if TAG_MARCO in REPO.tags: info('A migração já está feita.') return @@ -26,7 +26,7 @@ def migrar(interativo=False): 'Antes de migrar ' 'é necessário fazer a exportação de documentos do zope') management.call_command('migrate') - migrar_dados() + migrar_dados(apagar_do_legado) migrar_usuarios(REPO.working_dir) migrar_documentos(REPO) gravar_marco() diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 45b3c9338..75007d821 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -804,7 +804,7 @@ def roda_comando_shell(cmd): assert res == 0, 'O comando falhou: {}'.format(cmd) -def migrar_dados(): +def migrar_dados(apagar_do_legado=False): try: ocorrencias.clear() ocorrencias.default_factory = list @@ -836,7 +836,7 @@ def migrar_dados(): fill_vinculo_norma_juridica() fill_dados_basicos() info('Começando migração: ...') - migrar_todos_os_models() + migrar_todos_os_models(apagar_do_legado) except Exception as e: ocorrencias['traceback'] = str(traceback.format_exc()) raise e @@ -886,12 +886,12 @@ def get_models_a_migrar(): return models -def migrar_todos_os_models(): +def migrar_todos_os_models(apagar_do_legado): for model in get_models_a_migrar(): - migrar_model(model) + migrar_model(model, apagar_do_legado) -def migrar_model(model): +def migrar_model(model, apagar_do_legado): print('Migrando %s...' % model.__name__) model_legado, tabela_legado, campos_pk_legado = \ @@ -945,12 +945,13 @@ def migrar_model(model): novos.append(new) # guarda para salvar # acumula deleção do registro no legado - sql_delete_legado += 'delete from {} where {};\n'.format( - tabela_legado, - ' and '.join( - '{} = "{}"'.format(campo, - getattr(old, campo)) - for campo in campos_pk_legado)) + if apagar_do_legado: + sql_delete_legado += 'delete from {} where {};\n'.format( + tabela_legado, + ' and '.join( + '{} = "{}"'.format(campo, + getattr(old, campo)) + for campo in campos_pk_legado)) # salva novos registros with reversion.create_revision(): @@ -969,7 +970,7 @@ def migrar_model(model): reinicia_sequence(model, ultima_pk_legado + 1) # apaga registros migrados do legado - if sql_delete_legado: + if apagar_do_legado and sql_delete_legado: exec_legado(sql_delete_legado) From 1cba4b42d8c09209b6406a4f40621b40c8308d3e Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 14 Aug 2018 14:13:38 -0300 Subject: [PATCH 4/5] =?UTF-8?q?Corrige=20propaga=C3=A7=C3=A3o=20de=20exclu?= =?UTF-8?q?s=C3=B5es=20de=20registros=20de=20vota=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 75007d821..24bc9948d 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -8,7 +8,6 @@ from datetime import date from functools import lru_cache, partial from itertools import groupby from operator import xor -from subprocess import PIPE, call import git import pkg_resources @@ -31,12 +30,10 @@ from unipath import Path from sapl.base.models import AppConfig as AppConf from sapl.base.models import Autor, TipoAutor, cria_models_tipo_autor from sapl.comissoes.models import Comissao, Composicao, Participacao, Reuniao -from sapl.legacy import scripts from sapl.legacy.models import NormaJuridica as OldNormaJuridica from sapl.legacy.models import TipoNumeracaoProtocolo -from sapl.legacy_migration_settings import (DATABASES, DIR_DADOS_MIGRACAO, - DIR_REPO, NOME_BANCO_LEGADO, - PROJECT_DIR) +from sapl.legacy_migration_settings import (DIR_DADOS_MIGRACAO, DIR_REPO, + NOME_BANCO_LEGADO) from sapl.materia.models import (AcompanhamentoMateria, MateriaLegislativa, Proposicao, StatusTramitacao, TipoDocumento, TipoMateriaLegislativa, TipoProposicao, @@ -222,10 +219,6 @@ class ForeignKeyFaltando(ObjectDoesNotExist): 'Uma FK aponta para um registro inexistente' def __init__(self, field, valor, old): - if (field.related_model.__name__ == 'Comissao' - and old.__class__.__name__ == 'ReuniaoComissao' - and valor == 1): - __import__('pdb').set_trace() self.field = field self.valor = valor self.old = old @@ -542,7 +535,6 @@ PROPAGACOES_DE_EXCLUSAO = [ ('sessao_plenaria', 'ordem_dia', 'cod_sessao_plen'), ('sessao_plenaria', 'expediente_materia', 'cod_sessao_plen'), ('sessao_plenaria', 'expediente_sessao_plenaria', 'cod_sessao_plen'), - ('registro_votacao', 'registro_votacao_parlamentar', 'cod_votacao'), # as consultas no código do sapl 2.5 # votacao_ordem_dia_obter_zsql e votacao_expediente_materia_obter_zsql # indicam que os registros de votação de matérias excluídas não são @@ -558,30 +550,38 @@ PROPAGACOES_DE_EXCLUSAO = [ ('materia_legislativa', 'anexada', 'cod_materia_anexada'), ('materia_legislativa', 'documento_acessorio', 'cod_materia'), ('materia_legislativa', 'numeracao', 'cod_materia'), + ('materia_legislativa', 'expediente_materia', 'cod_materia'), # norma ('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referente'), ('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referida'), + ('norma_juridica', 'legislacao_citada', 'cod_norma'), # documento administrativo ('documento_administrativo', 'tramitacao_administrativo', 'cod_documento'), ] +PROPAGACOES_DE_EXCLUSAO_REGISTROS_VOTACAO = [ + ('registro_votacao', 'registro_votacao_parlamentar', 'cod_votacao'), +] + -def propaga_exclusoes(): - for tabela_pai, tabela_filha, fk in PROPAGACOES_DE_EXCLUSAO: +def propaga_exclusoes(propagacoes): + for tabela_pai, tabela_filha, fk in propagacoes: [pk_pai] = get_pk_legado(tabela_pai) - exec_legado(''' + sql = ''' update {} set ind_excluido = 1 where {} not in ( select {} from {} where ind_excluido != 1) - '''.format(tabela_filha, fk, pk_pai, tabela_pai)) + '''.format(tabela_filha, fk, pk_pai, tabela_pai) + exec_legado(sql) def uniformiza_banco(): exec_legado('SET SESSION sql_mode = "";') # desliga checagens do mysql - propaga_exclusoes() + propaga_exclusoes(PROPAGACOES_DE_EXCLUSAO) checa_registros_votacao_ambiguos_e_remove_nao_usados() + propaga_exclusoes(PROPAGACOES_DE_EXCLUSAO_REGISTROS_VOTACAO) garante_coluna_no_legado('proposicao', 'num_proposicao int(11) NULL') @@ -870,7 +870,6 @@ def get_models_a_migrar(): if model in field_renames] # retira reuniões quando não existe na base legada # (só existe no sapl 3.0) - tabelas_legado = [t for (t,) in exec_legado('show tables')] if not EXISTE_REUNIAO_NO_LEGADO: models.remove(Reuniao) # Devido à referência TipoProposicao.tipo_conteudo_related From 51eaff3d4617a4a72f65db531a954f9aa4fa281e Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 14 Aug 2018 14:14:07 -0300 Subject: [PATCH 5/5] =?UTF-8?q?Adciona=20script=20para=20ressucitar=20depe?= =?UTF-8?q?nd=C3=AAncias=20de=20fks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/scripts/ressucita_dependencias.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 sapl/legacy/scripts/ressucita_dependencias.py diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py new file mode 100644 index 000000000..793e51483 --- /dev/null +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -0,0 +1,59 @@ +import yaml +from unipath import Path + +from sapl.legacy.migracao_dados import DIR_REPO, exec_legado + +fks_legado = ''' + autor cod_parlamentar parlamentar + autor tip_autor tipo_autor + autoria cod_autor autor + expediente_materia cod_materia materia_legislativa + ordem_dia cod_materia materia_legislativa + legislacao_citada cod_norma norma_juridica + oradores cod_parlamentar parlamentar + oradores_expediente cod_parlamentar parlamentar + ordem_dia_presenca cod_parlamentar parlamentar + protocolo cod_autor autor + registro_votacao tip_resultado_votacao tipo_resultado_votacao + registro_votacao_parlamentar cod_parlamentar parlamentar + registro_votacao_parlamentar cod_votacao registro_votacao + sessao_legislativa num_legislatura legislatura + sessao_plenaria_presenca cod_parlamentar parlamentar +''' +fks_legado = [l.split() for l in fks_legado.strip().splitlines()] +fks_legado = {(o, c): t for (o, c, t) in fks_legado} + + +def get_excluido(fk): + campo, valor, tabela_origem = [fk[k] for k in ('campo', 'valor', 'tabela')] + tabela_alvo = fks_legado[(tabela_origem, campo)] + sql = 'select ind_excluido, t.* from {} t where {} = {}'.format( + tabela_alvo, campo, valor) + res = list(exec_legado(sql)) + return tabela_origem, campo, valor, tabela_alvo, res + + +def get_dependencias_a_ressucitar(): + ocorrencias = yaml.load( + Path(DIR_REPO.child('ocorrencias.yaml').read_file())) + fks = ocorrencias['fk'] + excluidos = [get_excluido(fk) for fk in fks] + desexcluir, criar = [ + set([(tabela_alvo, campo, valor) + for tabela_origem, campo, valor, tabela_alvo, res in excluidos + if condicao(res)]) + for condicao in ( + # o registro existe e ind_excluido == 1 + lambda res: res and res[0][0] == 1, + # o registro não existe + lambda res: not res + )] + return desexcluir, criar + + +def get_sqls_desexcluir_criar(desexcluir, criar): + sqls_desexcluir = [ + 'update {} set ind_excluido = 0 where {} = {};'.format( + tabela_alvo, campo, valor) + for tabela_alvo, campo, valor in desexcluir] + return '\n'.join(sqls_desexcluir)