From 90f6b24aee7ca61a44165ce24455c7a1838a28ac Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 16 Aug 2018 14:27:13 -0300 Subject: [PATCH 01/34] Corrige verificar nulos ao migrar Proposicao e seus tipos --- sapl/legacy/migracao_dados.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 24bc9948d..78cd68f44 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -1160,7 +1160,7 @@ def set_generic_fk(new, campo_virtual, old): def adjust_tipoproposicao(new, old): "Aponta para o tipo relacionado de matéria ou documento" - if old.tip_mat_ou_doc: + if old.tip_mat_ou_doc is not None: campo_virtual = CAMPOS_VIRTUAIS_TIPO_PROPOSICAO[old.ind_mat_ou_doc] set_generic_fk(new, campo_virtual, old) @@ -1168,7 +1168,7 @@ def adjust_tipoproposicao(new, old): def adjust_proposicao_antes_salvar(new, old): if new.data_envio: new.ano = new.data_envio.year - if old.cod_mat_ou_doc: + if old.cod_mat_ou_doc is not None: tipo_mat_ou_doc = type(new.tipo.tipo_conteudo_related) campo_virtual = CAMPOS_VIRTUAIS_PROPOSICAO[tipo_mat_ou_doc] set_generic_fk(new, campo_virtual, old) From 31f7f9c94cff72f5f8696cc0a9337d48cc32026c Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 16 Aug 2018 14:28:11 -0300 Subject: [PATCH 02/34] =?UTF-8?q?Expande=20ressucitar=20depend=C3=AAncias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/scripts/ressucita_dependencias.py | 75 +++++++++++++++++-- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 793e51483..2005fe588 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -19,6 +19,11 @@ fks_legado = ''' registro_votacao_parlamentar cod_votacao registro_votacao sessao_legislativa num_legislatura legislatura sessao_plenaria_presenca cod_parlamentar parlamentar + composicao_comissao cod_cargo cargo_comissao + sessao_plenaria cod_sessao_leg sessao_legislativa + ordem_dia cod_sessao_plen sessao_plenaria + proposicao cod_materia materia_legislativa + proposicao cod_autor autor ''' fks_legado = [l.split() for l in fks_legado.strip().splitlines()] fks_legado = {(o, c): t for (o, c, t) in fks_legado} @@ -36,8 +41,8 @@ def get_excluido(fk): 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] + fks_faltando = ocorrencias['fk'] + excluidos = [get_excluido(fk) for fk in fks_faltando] desexcluir, criar = [ set([(tabela_alvo, campo, valor) for tabela_origem, campo, valor, tabela_alvo, res in excluidos @@ -51,9 +56,65 @@ def get_dependencias_a_ressucitar(): return desexcluir, criar +SQLS_CRIACAO = { + 'tipo_proposicao': ''' + insert into tipo_materia_legislativa ( + tip_materia, sgl_tipo_materia, des_tipo_materia, ind_num_automatica, + quorum_minimo_votacao, ind_excluido) + values (0, "DESC", "DESCONHECIDO", 0, 0, 0); + + insert into tipo_proposicao ( + tip_proposicao, des_tipo_proposicao, ind_mat_ou_doc, tip_mat_ou_doc, + nom_modelo, ind_excluido) + values ({}, "DESCONHECIDO", "M", 0, "DESCONHECIDO", 0); +''', +} + + +def criar_sessao_legislativa(campo, valor): + assert campo == 'cod_sessao_leg' + [(num_legislatura,)] = exec_legado( + 'select min(num_legislatura) from legislatura where ind_excluido <> 1') + return ''' +insert into sessao_legislativa ( + cod_sessao_leg, num_legislatura, num_sessao_leg, tip_sessao_leg, + dat_inicio, dat_fim, dat_inicio_intervalo, dat_fim_intervalo, +ind_excluido) values ({}, {}, 0, "O", + "1900-01-01", "1900-01-02", "1900-01-01", "1900-01-02", 0); + '''.format(valor, num_legislatura) + + +def get_sql_desexcluir(tabela_alvo, campo, valor): + return 'update {} set ind_excluido = 0 where {} = {};'.format( + tabela_alvo, campo, valor) + + +def get_sql_criar(tabela_alvo, campo, valor): + if tabela_alvo == 'sessao_legislativa': + return criar_sessao_legislativa(campo, valor) + else: + sql = SQLS_CRIACAO[tabela_alvo] + return sql.format(valor) + + +TEMPLATE_RESSUCITADOS = ''' +/* RESSUCITADOS * / + +{} +''' + + 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) + sqls = [get_sql(tabela_alvo, campo, valor) + for conjunto, get_sql in ((desexcluir, get_sql_desexcluir), + (criar, get_sql_criar)) + for tabela_alvo, campo, valor in conjunto] + if not sqls: + return '' + else: + return TEMPLATE_RESSUCITADOS.format('\n'.join(sorted(sqls))) + + +def print_ressucitar(): + desexcluir, criar = get_dependencias_a_ressucitar() + print(get_sqls_desexcluir_criar(desexcluir, criar)) From b0d143bb915b3a21540a0cf43a83639cd29491c3 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 17 Aug 2018 09:32:20 -0300 Subject: [PATCH 03/34] =?UTF-8?q?Permite=20inser=C3=A7=C3=A3o=20de=20zero?= =?UTF-8?q?=20em=20campo=20de=20autoincremento=20no=20legado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 78cd68f44..e6d0f94c8 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -577,8 +577,6 @@ def propaga_exclusoes(propagacoes): def uniformiza_banco(): - exec_legado('SET SESSION sql_mode = "";') # desliga checagens do mysql - propaga_exclusoes(PROPAGACOES_DE_EXCLUSAO) checa_registros_votacao_ambiguos_e_remove_nao_usados() propaga_exclusoes(PROPAGACOES_DE_EXCLUSAO_REGISTROS_VOTACAO) @@ -817,6 +815,10 @@ def migrar_dados(apagar_do_legado=False): normaliza_dump_mysql(arq_dump) roda_comando_shell('mysql -uroot < {}'.format(arq_dump)) + # desliga checagens do mysql + # e possibilita inserir valor zero em campos de autoincremento + exec_legado('SET SESSION sql_mode = "NO_AUTO_VALUE_ON_ZERO";') + # executa ajustes pré-migração, se existirem arq_ajustes_pre_migracao = DIR_DADOS_MIGRACAO.child( 'ajustes_pre_migracao', '{}.sql'.format(sigla_casa)) From 9c52362ef0adf31b61e3ba0cb95095888b1c9a8f Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 17 Aug 2018 16:50:13 -0300 Subject: [PATCH 04/34] =?UTF-8?q?Propaga=20exclus=C3=A3o=20de=20mat=C3=A9r?= =?UTF-8?q?ia=20para=20ordem=20do=20dia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index e6d0f94c8..681063ce0 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -551,6 +551,7 @@ PROPAGACOES_DE_EXCLUSAO = [ ('materia_legislativa', 'documento_acessorio', 'cod_materia'), ('materia_legislativa', 'numeracao', 'cod_materia'), ('materia_legislativa', 'expediente_materia', 'cod_materia'), + ('materia_legislativa', 'ordem_dia', 'cod_materia'), # norma ('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referente'), From 35ccbafb2831fb41a7034fbdea570c8897761bbe Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 17 Aug 2018 16:51:20 -0300 Subject: [PATCH 05/34] =?UTF-8?q?Coloca=20num=20protocolo=20n=C3=A3o=20enc?= =?UTF-8?q?ontrado=20em=20num=20externo=20de=20doc=20adm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 681063ce0..a6f2be4c2 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -1017,9 +1017,16 @@ pois não existe protocolo no sistema com este número no ano {ano_original}. 'ano_original': ano_original, 'nota': nota}) else: + # Se não achamos mesmo no ano anteriro + # colocamos no número externo + new.numero_externo = old.num_protocolo + nota = NOTA_DOCADM + ''' Não existe no sistema nenhum protocolo com estes dados -e portanto nenhum protocolo foi vinculado a este documento.''' +e portanto nenhum protocolo foi vinculado a este documento. + +Colocamos então o número de protocolo no campo "número externo". +''' nota = nota.format( num_protocolo=old.num_protocolo, ano_original=ano_original) From a6d6da3e8c765b0c9e3b0afd07cd8a367d961dd3 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 17 Aug 2018 16:52:29 -0300 Subject: [PATCH 06/34] =?UTF-8?q?Expande=20ressucitar=20depend=C3=AAncias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/scripts/ressucita_dependencias.py | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 2005fe588..758f1cf1b 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -1,3 +1,5 @@ +from textwrap import dedent + import yaml from unipath import Path @@ -24,14 +26,36 @@ fks_legado = ''' ordem_dia cod_sessao_plen sessao_plenaria proposicao cod_materia materia_legislativa proposicao cod_autor autor + tramitacao cod_status status_tramitacao + expediente_sessao_plenaria cod_expediente tipo_expediente + proposicao tip_proposicao tipo_proposicao ''' 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_tabela_campo_valor_proposicao(fk): + [(ind_mat_ou_doc, tip_mat_ou_doc)] = exec_legado(''' + select ind_mat_ou_doc, tip_mat_ou_doc + from tipo_proposicao where tip_proposicao = {} + '''.format(fk['pk']['tip_proposicao'])) + if ind_mat_ou_doc == 'M': + return 'tipo_materia_legislativa', 'tip_materia', tip_mat_ou_doc + elif ind_mat_ou_doc == 'D': + return 'tipo_materia_legislativa', 'tip_documento', tip_mat_ou_doc + else: + raise(Exception('ind_mat_ou_doc inválido')) + + def get_excluido(fk): - campo, valor, tabela_origem = [fk[k] for k in ('campo', 'valor', 'tabela')] - tabela_alvo = fks_legado[(tabela_origem, campo)] + tabela_origem = fk['tabela'] + + if tabela_origem == 'tipo_proposicao': + tabela_alvo, campo, valor = get_tabela_campo_valor_proposicao(fk) + else: + campo, valor = [fk[k] for k in ('campo', 'valor')] + 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)) @@ -56,8 +80,8 @@ def get_dependencias_a_ressucitar(): return desexcluir, criar -SQLS_CRIACAO = { - 'tipo_proposicao': ''' +SQLS_CRIACAO = [ + ('tipo_proposicao', ''' insert into tipo_materia_legislativa ( tip_materia, sgl_tipo_materia, des_tipo_materia, ind_num_automatica, quorum_minimo_votacao, ind_excluido) @@ -67,8 +91,16 @@ SQLS_CRIACAO = { tip_proposicao, des_tipo_proposicao, ind_mat_ou_doc, tip_mat_ou_doc, nom_modelo, ind_excluido) values ({}, "DESCONHECIDO", "M", 0, "DESCONHECIDO", 0); -''', -} + ''', + ), + ('tipo_resultado_votacao', ''' + insert into tipo_resultado_votacao ( + tip_resultado_votacao, nom_resultado, ind_excluido) + values ({}, "DESCONHECIDO", 0); + ''' + ), +] +SQLS_CRIACAO = {k: dedent(v.strip()) for k, v in SQLS_CRIACAO} def criar_sessao_legislativa(campo, valor): @@ -98,7 +130,7 @@ def get_sql_criar(tabela_alvo, campo, valor): TEMPLATE_RESSUCITADOS = ''' -/* RESSUCITADOS * / +/* RESSUCITADOS */ {} ''' From 3bf845701980f4820258a2dcdab14361c5122fa2 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 23 Aug 2018 10:27:06 -0300 Subject: [PATCH 07/34] =?UTF-8?q?Interrompe=20recria=C3=A7=C3=A3o=20de=20b?= =?UTF-8?q?ancos=20postgres=20na=201a=20falha?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/scripts/recria_um_db_postgres.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/legacy/scripts/recria_um_db_postgres.sh b/sapl/legacy/scripts/recria_um_db_postgres.sh index 98defaaa6..48b3d8adf 100755 --- a/sapl/legacy/scripts/recria_um_db_postgres.sh +++ b/sapl/legacy/scripts/recria_um_db_postgres.sh @@ -1,6 +1,8 @@ # (Re)cria um db postgres # uso: recria_um_db_postgres +set -e # Exit immediately if a command exits with a non-zero status + echo "Database $1" sudo -u postgres psql -c "drop DATABASE if exists $1" sudo -u postgres psql -c "CREATE DATABASE $1 WITH OWNER = sapl ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'pt_BR.UTF-8' LC_CTYPE = 'pt_BR.UTF-8' CONNECTION LIMIT = -1 TEMPLATE template0;" From 3b52eb641b6e40c19834feb660aa4f4016fdfa40 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 23 Aug 2018 10:27:55 -0300 Subject: [PATCH 08/34] =?UTF-8?q?Propaga=20exclus=C3=B5es=20de=20mat=C3=A9?= =?UTF-8?q?ria=20antes=20de=20migrar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index a6f2be4c2..2b7dba926 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -552,6 +552,8 @@ PROPAGACOES_DE_EXCLUSAO = [ ('materia_legislativa', 'numeracao', 'cod_materia'), ('materia_legislativa', 'expediente_materia', 'cod_materia'), ('materia_legislativa', 'ordem_dia', 'cod_materia'), + ('materia_legislativa', 'acomp_materia', 'cod_materia'), + ('materia_legislativa', 'despacho_inicial', 'cod_materia'), # norma ('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referente'), From 822aeffe9b0ea34e7392df18212306990b10b46d Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 23 Aug 2018 10:28:25 -0300 Subject: [PATCH 09/34] =?UTF-8?q?Estende=20ressucitar=20deps=20para=20unid?= =?UTF-8?q?ade=20de=20tramita=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/scripts/ressucita_dependencias.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 758f1cf1b..1d5639b23 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -29,6 +29,8 @@ fks_legado = ''' tramitacao cod_status status_tramitacao expediente_sessao_plenaria cod_expediente tipo_expediente proposicao tip_proposicao tipo_proposicao + tramitacao cod_unid_tram_dest unidade_tramitacao + tramitacao cod_unid_tram_local unidade_tramitacao ''' fks_legado = [l.split() for l in fks_legado.strip().splitlines()] fks_legado = {(o, c): t for (o, c, t) in fks_legado} @@ -47,6 +49,12 @@ def get_tabela_campo_valor_proposicao(fk): raise(Exception('ind_mat_ou_doc inválido')) +CAMPOS_ORIGEM_PARA_ALVO = { + 'cod_unid_tram_dest': 'cod_unid_tramitacao', + 'cod_unid_tram_local': 'cod_unid_tramitacao', +} + + def get_excluido(fk): tabela_origem = fk['tabela'] @@ -56,6 +64,9 @@ def get_excluido(fk): campo, valor = [fk[k] for k in ('campo', 'valor')] tabela_alvo = fks_legado[(tabela_origem, campo)] + # troca nome de campo pelo correspondente na tabela alvo + campo = CAMPOS_ORIGEM_PARA_ALVO.get(campo, campo) + sql = 'select ind_excluido, t.* from {} t where {} = {}'.format( tabela_alvo, campo, valor) res = list(exec_legado(sql)) From 1492b33d4e92c74ea9489cb1a4b572468ccb50da Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 23 Aug 2018 11:42:44 -0300 Subject: [PATCH 10/34] =?UTF-8?q?Melhora=20mensagens=20de=20feedback=20da?= =?UTF-8?q?=20migra=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 2b7dba926..66c678220 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -853,6 +853,8 @@ def migrar_dados(apagar_do_legado=False): pyaml.dump(ocorrencias, arq, vspacing=1) REPO.git.add([arq_ocorrencias.name]) info('Ocorrências salvas em\n {}'.format(arq_ocorrencias)) + if not ocorrencias: + info('NÃO HOUVE OCORRÊNCIAS !!!') # recria tipos de autor padrão que não foram criados pela migração cria_models_tipo_autor() @@ -1292,10 +1294,12 @@ def adjust_tiporesultadovotacao(new, old): elif 'rejeita' in new.nome.lower(): new.natureza = TipoResultadoVotacao.NATUREZA_CHOICES.rejeitado else: - warn('natureza_desconhecida_tipo_resultadovotacao', - 'Não foi possível identificar a natureza do ' - 'tipo de resultado de votação [{pk}: "{nome}"]', - {'pk': new.pk, 'nome': new.nome}) + if new.nome != 'DESCONHECIDO': + # ignoramos a natureza de item criado pela migração + warn('natureza_desconhecida_tipo_resultadovotacao', + 'Não foi possível identificar a natureza do ' + 'tipo de resultado de votação [{pk}: "{nome}"]', + {'pk': new.pk, 'nome': new.nome}) def str_to_time(fonte): From 9d55709b1ca60c9a5e1c327014b26f6b2f50db7b Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Thu, 23 Aug 2018 11:42:57 -0300 Subject: [PATCH 11/34] Adiciona links para deps ressucitadas --- sapl/legacy/scripts/ressucita_dependencias.py | 72 +++++++++++++++---- 1 file changed, 57 insertions(+), 15 deletions(-) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 1d5639b23..814f13f99 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -5,6 +5,11 @@ from unipath import Path from sapl.legacy.migracao_dados import DIR_REPO, exec_legado + +def stripsplit(ll): + return [l.split() for l in ll.strip().splitlines()] + + fks_legado = ''' autor cod_parlamentar parlamentar autor tip_autor tipo_autor @@ -32,10 +37,30 @@ fks_legado = ''' tramitacao cod_unid_tram_dest unidade_tramitacao tramitacao cod_unid_tram_local unidade_tramitacao ''' -fks_legado = [l.split() for l in fks_legado.strip().splitlines()] +fks_legado = stripsplit(fks_legado) fks_legado = {(o, c): t for (o, c, t) in fks_legado} +urls = ''' +autor /sistema/autor +cargo_comissao /sistema/comissao/cargo +legislatura /sistema/parlamentar/legislatura +materia_legislativa /materia +norma_juridica /norma +parlamentar /parlamentar +sessao_legislativa /sistema/mesa-diretora/sessao-legislativa +sessao_plenaria /sessao +status_tramitacao /sistema/materia/status-tramitacao +tipo_autor /sistema/autor/tipo +tipo_expediente /sistema/sessao-plenaria/tipo-expediente +tipo_proposicao /sistema/proposicao/tipo +tipo_resultado_votacao /sistema/sessao-plenaria/tipo-resultado-votacao +unidade_tramitacao /sistema/materia/unidade-tramitacao +registro_votacao ????????? +''' +urls = dict(stripsplit(urls)) + + def get_tabela_campo_valor_proposicao(fk): [(ind_mat_ou_doc, tip_mat_ou_doc)] = exec_legado(''' select ind_mat_ou_doc, tip_mat_ou_doc @@ -102,16 +127,17 @@ SQLS_CRIACAO = [ tip_proposicao, des_tipo_proposicao, ind_mat_ou_doc, tip_mat_ou_doc, nom_modelo, ind_excluido) values ({}, "DESCONHECIDO", "M", 0, "DESCONHECIDO", 0); - ''', + ''', ['tipo_materia_legislativa', 0] ), ('tipo_resultado_votacao', ''' insert into tipo_resultado_votacao ( tip_resultado_votacao, nom_resultado, ind_excluido) values ({}, "DESCONHECIDO", 0); - ''' + ''', [] ), ] -SQLS_CRIACAO = {k: dedent(v.strip()) for k, v in SQLS_CRIACAO} +SQLS_CRIACAO = {k: (dedent(sql.strip()), extras) + for k, sql, extras in SQLS_CRIACAO} def criar_sessao_legislativa(campo, valor): @@ -127,35 +153,51 @@ ind_excluido) values ({}, {}, 0, "O", '''.format(valor, num_legislatura) +def get_link(tabela_alvo, valor): + return '{}/{}'.format(urls[tabela_alvo], valor) + + def get_sql_desexcluir(tabela_alvo, campo, valor): - return 'update {} set ind_excluido = 0 where {} = {};'.format( + sql = 'update {} set ind_excluido = 0 where {} = {};'.format( tabela_alvo, campo, valor) + return sql, [get_link(tabela_alvo, valor)] def get_sql_criar(tabela_alvo, campo, valor): if tabela_alvo == 'sessao_legislativa': - return criar_sessao_legislativa(campo, valor) + sql = criar_sessao_legislativa(campo, valor) else: - sql = SQLS_CRIACAO[tabela_alvo] - return sql.format(valor) + sql, extras = SQLS_CRIACAO[tabela_alvo] + sql = sql.format(valor) + links = [get_link(tabela_alvo, valor)] + for tabela_extra, valor_extra in extras: + links.insert(0, get_link(tabela_extra, valor_extra)) + return sql, links TEMPLATE_RESSUCITADOS = ''' -/* RESSUCITADOS */ +/* RESSUCITADOS + +{} + +*/ {} ''' def get_sqls_desexcluir_criar(desexcluir, criar): - sqls = [get_sql(tabela_alvo, campo, valor) - for conjunto, get_sql in ((desexcluir, get_sql_desexcluir), - (criar, get_sql_criar)) - for tabela_alvo, campo, valor in conjunto] - if not sqls: + sqls_links = [get_sql(tabela_alvo, campo, valor) + for conjunto, get_sql in ((desexcluir, get_sql_desexcluir), + (criar, get_sql_criar)) + for tabela_alvo, campo, valor in conjunto] + if not sqls_links: return '' else: - return TEMPLATE_RESSUCITADOS.format('\n'.join(sorted(sqls))) + sqls, links = zip(*sqls_links) + links = [l for ll in links for l in ll] # flatten + sqls, links = ['\n'.join(sorted(s)) for s in [sqls, links]] + return TEMPLATE_RESSUCITADOS.format(links, sqls) def print_ressucitar(): From e9ba8d44ea217bd7260c9732a08c3c1d7f14dcb3 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 24 Aug 2018 11:37:57 -0300 Subject: [PATCH 12/34] =?UTF-8?q?Corrige=20refer=C3=AAncia=20de=20proposi?= =?UTF-8?q?=C3=A7=C3=A3o=20p=20doc=20acess=C3=B3rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 66c678220..75b980982 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -34,8 +34,9 @@ from sapl.legacy.models import NormaJuridica as OldNormaJuridica from sapl.legacy.models import TipoNumeracaoProtocolo from sapl.legacy_migration_settings import (DIR_DADOS_MIGRACAO, DIR_REPO, NOME_BANCO_LEGADO) -from sapl.materia.models import (AcompanhamentoMateria, MateriaLegislativa, - Proposicao, StatusTramitacao, TipoDocumento, +from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio, + MateriaLegislativa, Proposicao, + StatusTramitacao, TipoDocumento, TipoMateriaLegislativa, TipoProposicao, Tramitacao) from sapl.norma.models import (AssuntoNorma, NormaJuridica, NormaRelacionada, @@ -157,7 +158,7 @@ class CampoVirtual(namedtuple('CampoVirtual', 'model related_model')): CAMPOS_VIRTUAIS_PROPOSICAO = { TipoMateriaLegislativa: CampoVirtual(Proposicao, MateriaLegislativa), - TipoDocumento: CampoVirtual(Proposicao, DocumentoAdministrativo) + TipoDocumento: CampoVirtual(Proposicao, DocumentoAcessorio) } for campo_virtual in CAMPOS_VIRTUAIS_PROPOSICAO.values(): campos_novos_para_antigos[campo_virtual] = 'cod_mat_ou_doc' @@ -887,7 +888,7 @@ def get_models_a_migrar(): [TipoMateriaLegislativa, TipoDocumento]) assert models.index(TipoProposicao) < models.index(Proposicao) move_para_depois_de(models, Proposicao, - [MateriaLegislativa, DocumentoAdministrativo]) + [MateriaLegislativa, DocumentoAcessorio]) return models From 5b435d4e48d9552dad74048c245d628107e1fb1e Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 24 Aug 2018 11:41:11 -0300 Subject: [PATCH 13/34] Estende ressucitar deps --- sapl/legacy/scripts/ressucita_dependencias.py | 93 ++++++++++++------- 1 file changed, 61 insertions(+), 32 deletions(-) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 814f13f99..b364a8be1 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -36,40 +36,52 @@ fks_legado = ''' proposicao tip_proposicao tipo_proposicao tramitacao cod_unid_tram_dest unidade_tramitacao tramitacao cod_unid_tram_local unidade_tramitacao + documento_acessorio tip_documento tipo_documento + relatoria cod_parlamentar parlamentar + relatoria cod_materia materia_legislativa + unidade_tramitacao cod_orgao orgao + norma_juridica cod_materia materia_legislativa + sessao_plenaria tip_sessao tipo_sessao_plenaria + mesa_sessao_plenaria cod_cargo cargo_mesa ''' fks_legado = stripsplit(fks_legado) fks_legado = {(o, c): t for (o, c, t) in fks_legado} urls = ''' -autor /sistema/autor -cargo_comissao /sistema/comissao/cargo -legislatura /sistema/parlamentar/legislatura -materia_legislativa /materia -norma_juridica /norma -parlamentar /parlamentar -sessao_legislativa /sistema/mesa-diretora/sessao-legislativa -sessao_plenaria /sessao -status_tramitacao /sistema/materia/status-tramitacao -tipo_autor /sistema/autor/tipo -tipo_expediente /sistema/sessao-plenaria/tipo-expediente -tipo_proposicao /sistema/proposicao/tipo -tipo_resultado_votacao /sistema/sessao-plenaria/tipo-resultado-votacao -unidade_tramitacao /sistema/materia/unidade-tramitacao -registro_votacao ????????? +autor /sistema/autor +cargo_comissao /sistema/comissao/cargo +legislatura /sistema/parlamentar/legislatura +materia_legislativa /materia +norma_juridica /norma +parlamentar /parlamentar +sessao_legislativa /sistema/mesa-diretora/sessao-legislativa +sessao_plenaria /sessao +status_tramitacao /sistema/materia/status-tramitacao +tipo_autor /sistema/autor/tipo +tipo_expediente /sistema/sessao-plenaria/tipo-expediente +tipo_proposicao /sistema/proposicao/tipo +tipo_resultado_votacao /sistema/sessao-plenaria/tipo-resultado-votacao +unidade_tramitacao /sistema/materia/unidade-tramitacao +tipo_documento /sistema/materia/tipo-documento +orgao /sistema/materia/orgao +tipo_sessao_plenaria /sistema/sessao-plenaria/tipo +cargo_mesa /sistema/mesa-diretora/cargo-mesa +documento_administrativo /docadm +tipo_materia_legislativa /sistema/materia/tipo +registro_votacao ????????? ''' urls = dict(stripsplit(urls)) -def get_tabela_campo_valor_proposicao(fk): - [(ind_mat_ou_doc, tip_mat_ou_doc)] = exec_legado(''' - select ind_mat_ou_doc, tip_mat_ou_doc - from tipo_proposicao where tip_proposicao = {} - '''.format(fk['pk']['tip_proposicao'])) +def get_tabela_campo_tipo_proposicao(tip_proposicao): + [(ind_mat_ou_doc,)] = exec_legado(''' + select ind_mat_ou_doc from tipo_proposicao where tip_proposicao = {}; + '''.format(tip_proposicao)) if ind_mat_ou_doc == 'M': - return 'tipo_materia_legislativa', 'tip_materia', tip_mat_ou_doc + return 'tipo_materia_legislativa', 'tip_materia' elif ind_mat_ou_doc == 'D': - return 'tipo_materia_legislativa', 'tip_documento', tip_mat_ou_doc + return 'tipo_documento', 'tip_documento' else: raise(Exception('ind_mat_ou_doc inválido')) @@ -81,12 +93,25 @@ CAMPOS_ORIGEM_PARA_ALVO = { def get_excluido(fk): - tabela_origem = fk['tabela'] + tabela_origem, campo, valor = [fk[k] for k in ('tabela', 'campo', 'valor')] if tabela_origem == 'tipo_proposicao': - tabela_alvo, campo, valor = get_tabela_campo_valor_proposicao(fk) + tip_proposicao = fk['pk']['tip_proposicao'] + tabela_alvo, campo = get_tabela_campo_tipo_proposicao(tip_proposicao) + elif tabela_origem == 'proposicao' and campo == 'cod_mat_ou_doc': + [(ind_mat_ou_doc,)] = exec_legado(''' + select ind_mat_ou_doc from + proposicao p inner join tipo_proposicao t + on p.tip_proposicao = t.tip_proposicao + where cod_proposicao = {}; + '''.format(fk['pk']['cod_proposicao'])) + if ind_mat_ou_doc == 'M': + tabela_alvo, campo = 'materia_legislativa', 'cod_materia' + elif ind_mat_ou_doc == 'D': + tabela_alvo, campo = 'documento_acessorio', 'cod_documento' + else: + raise(Exception('ind_mat_ou_doc inválido')) else: - campo, valor = [fk[k] for k in ('campo', 'valor')] tabela_alvo = fks_legado[(tabela_origem, campo)] # troca nome de campo pelo correspondente na tabela alvo @@ -133,11 +158,14 @@ SQLS_CRIACAO = [ insert into tipo_resultado_votacao ( tip_resultado_votacao, nom_resultado, ind_excluido) values ({}, "DESCONHECIDO", 0); - ''', [] - ), + '''), + ('tipo_autor', ''' + insert into tipo_autor (tip_autor, des_tipo_autor, ind_excluido) + values ({}, "DESCONHECIDO", 0); + ''') ] SQLS_CRIACAO = {k: (dedent(sql.strip()), extras) - for k, sql, extras in SQLS_CRIACAO} + for k, sql, *extras in SQLS_CRIACAO} def criar_sessao_legislativa(campo, valor): @@ -186,7 +214,7 @@ TEMPLATE_RESSUCITADOS = ''' ''' -def get_sqls_desexcluir_criar(desexcluir, criar): +def get_sqls_desexcluir_criar(desexcluir, criar, slug): sqls_links = [get_sql(tabela_alvo, campo, valor) for conjunto, get_sql in ((desexcluir, get_sql_desexcluir), (criar, get_sql_criar)) @@ -194,12 +222,13 @@ def get_sqls_desexcluir_criar(desexcluir, criar): if not sqls_links: return '' else: + url_base = 'sapl.{}.leg.br'.format(slug.replace('-', '.')) sqls, links = zip(*sqls_links) - links = [l for ll in links for l in ll] # flatten + links = [url_base + l for ll in links for l in ll] # flatten sqls, links = ['\n'.join(sorted(s)) for s in [sqls, links]] return TEMPLATE_RESSUCITADOS.format(links, sqls) -def print_ressucitar(): +def print_ressucitar(slug): desexcluir, criar = get_dependencias_a_ressucitar() - print(get_sqls_desexcluir_criar(desexcluir, criar)) + print(get_sqls_desexcluir_criar(desexcluir, criar, slug)) From 6fa7983a60607f8586c78ecf6951a2bf95341942 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 24 Aug 2018 16:23:19 -0300 Subject: [PATCH 14/34] =?UTF-8?q?Propaga=20exclus=C3=A3o=20de=20mat=C3=A9r?= =?UTF-8?q?ia=20p=20legisla=C3=A7=C3=A3o=20citada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 75b980982..a82c608f1 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -555,6 +555,7 @@ PROPAGACOES_DE_EXCLUSAO = [ ('materia_legislativa', 'ordem_dia', 'cod_materia'), ('materia_legislativa', 'acomp_materia', 'cod_materia'), ('materia_legislativa', 'despacho_inicial', 'cod_materia'), + ('materia_legislativa', 'legislacao_citada', 'cod_materia'), # norma ('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referente'), From d9961229d66291cfb359e22f2f5715819f15a69b Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Mon, 27 Aug 2018 10:46:25 -0300 Subject: [PATCH 15/34] =?UTF-8?q?Adiciona=20mais=20extens=C3=B5es=20=C3=A0?= =?UTF-8?q?=20exporta=C3=A7=C3=A3o=20de=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/exporta_zope/exporta_zope.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/sapl/legacy/scripts/exporta_zope/exporta_zope.py b/sapl/legacy/scripts/exporta_zope/exporta_zope.py index f24bdfea5..8f3b1eb4a 100755 --- a/sapl/legacy/scripts/exporta_zope/exporta_zope.py +++ b/sapl/legacy/scripts/exporta_zope/exporta_zope.py @@ -27,6 +27,7 @@ from ZODB.POSException import POSKeyError from variaveis_comuns import DIR_DADOS_MIGRACAO, TAG_ZOPE EXTENSOES = { + # docs 'application/msword': '.doc', 'application/pdf': '.pdf', 'application/vnd.oasis.opendocument.text': '.odt', @@ -36,12 +37,25 @@ EXTENSOES = { 'application/vnd.ms-powerpoint': '.ppt', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx', # noqa 'application/vnd.oasis.opendocument.spreadsheet': '.ods', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation': '.pptx', # noqa + 'application/vnd.oasis.opendocument.graphics': '.odg', + # incertos... associamos a extensão mais provável + 'application/vnd.ms-office': '.doc', + 'text/x-c++': '.cpp', + + # outros 'application/xml': '.xml', 'text/xml': '.xml', 'application/zip': '.zip', 'application/x-rar': '.rar', + 'application/x-dosexec': '.exe', + 'message/rfc822': '.mht', + 'text/richtext': '.rtx', + 'application/gzip': '.gz', + 'image/vnd.dwg': '*.dwg', + # media 'image/jpeg': '.jpeg', 'image/png': '.png', 'image/gif': '.gif', @@ -58,9 +72,8 @@ EXTENSOES = { 'image/x-ms-bmp': '.bmp', 'video/x-ms-asf': '.asf', 'audio/mpeg': '.mp3', - - # TODO rever... - 'text/richtext': '.rtf', + 'video/x-flv': '.flv', + 'video/quicktime': '.mov', # sem extensao 'application/octet-stream': '', # binário From 78d897d1d2f2844e74cb316c6c46a7d62646781f Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Mon, 27 Aug 2018 15:29:15 -0300 Subject: [PATCH 16/34] =?UTF-8?q?N=C3=A3o=20avisa=20sobre=20registro=20de?= =?UTF-8?q?=20vota=C3=A7=C3=A3o=20resolvidos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index a82c608f1..2685ef112 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -503,6 +503,9 @@ def checa_registros_votacao_ambiguos_e_remove_nao_usados(): # interrompe migração se houver registros ambíguos ambiguos = ordem.intersection(expediente) + como_resolver = get_como_resolver_registro_votacao_ambiguo() + ambiguos = ambiguos - set(como_resolver) + if ambiguos: warn('registro_votacao_ambiguos', 'Existe(m) RegistroVotacao ambíguo(s): {cod_votacao}', From 69c37cf3f4dc5ec78ac2ae4b407be952b322ff96 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Mon, 27 Aug 2018 15:36:30 -0300 Subject: [PATCH 17/34] =?UTF-8?q?Enumera=20mat=C3=A9rias=20a=20serem=20apa?= =?UTF-8?q?gadas=20de=20proposi=C3=A7=C3=B5es=20ao=20ressucitar=20deps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements/migration-requirements.txt | 1 + sapl/legacy/scripts/ressucita_dependencias.py | 104 ++++++++++++++++-- 2 files changed, 97 insertions(+), 8 deletions(-) diff --git a/requirements/migration-requirements.txt b/requirements/migration-requirements.txt index e3f887b14..5f45919ed 100644 --- a/requirements/migration-requirements.txt +++ b/requirements/migration-requirements.txt @@ -2,3 +2,4 @@ GitPython mysqlclient==1.3.12 pyaml +texttable diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index b364a8be1..03ba371bf 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -1,5 +1,6 @@ from textwrap import dedent +import texttable import yaml from unipath import Path @@ -36,6 +37,8 @@ fks_legado = ''' proposicao tip_proposicao tipo_proposicao tramitacao cod_unid_tram_dest unidade_tramitacao tramitacao cod_unid_tram_local unidade_tramitacao + tramitacao_administrativo cod_unid_tram_dest unidade_tramitacao + tramitacao_administrativo cod_unid_tram_local unidade_tramitacao documento_acessorio tip_documento tipo_documento relatoria cod_parlamentar parlamentar relatoria cod_materia materia_legislativa @@ -43,6 +46,7 @@ fks_legado = ''' norma_juridica cod_materia materia_legislativa sessao_plenaria tip_sessao tipo_sessao_plenaria mesa_sessao_plenaria cod_cargo cargo_mesa + norma_juridica tip_norma tipo_norma_juridica ''' fks_legado = stripsplit(fks_legado) fks_legado = {(o, c): t for (o, c, t) in fks_legado} @@ -69,6 +73,7 @@ tipo_sessao_plenaria /sistema/sessao-plenaria/tipo cargo_mesa /sistema/mesa-diretora/cargo-mesa documento_administrativo /docadm tipo_materia_legislativa /sistema/materia/tipo +tipo_norma_juridica /sistema/norma/tipo registro_votacao ????????? ''' urls = dict(stripsplit(urls)) @@ -123,10 +128,89 @@ def get_excluido(fk): return tabela_origem, campo, valor, tabela_alvo, res -def get_dependencias_a_ressucitar(): +def get_desc_materia(cod_materia): + sql = ''' + select t.sgl_tipo_materia, t.des_tipo_materia, + m.num_ident_basica, m.ano_ident_basica + from materia_legislativa m inner join tipo_materia_legislativa t + on m.tip_id_basica = t.tip_materia + where cod_materia = {}; + '''.format(cod_materia) + return list(exec_legado(sql))[0] + + +def get_link_proposicao(cod_proposicao, slug): + url_base = get_url(slug) + return 'http://{}/cadastros/proposicao/proposicao_mostrar_proc?cod_proposicao={}'.format( # noqa + url_base, cod_proposicao) + + +def get_apaga_materias_de_proposicoes(fks, slug): + refs_materias = [['id proposicao', 'sigla tipo matéria', + 'tipo matéria', 'número matéria', 'ano matéria']] + sqls = [] + cods_proposicoes = [] + + for fk in fks: + cod_proposicao = fk['pk']['cod_proposicao'] + cods_proposicoes.append(cod_proposicao) + assert fk['campo'] == 'cod_materia' + up = 'update proposicao set cod_materia = NULL where cod_proposicao = {};' # noqa + refs_materias.append( + [cod_proposicao, *get_desc_materia(fk['valor'])]) + sqls.append(up.format(cod_proposicao)) + + table = texttable.Texttable() + table.set_cols_width([10, 10, 50, 10, 10]) + table.set_deco(table.VLINES | table.HEADER) + table.add_rows(refs_materias) + + links = '\n'.join([get_link_proposicao(p, slug) + for p in cods_proposicoes]) + sqls = '\n'.join(sqls) + + return ''' +/* REFERÊNCIAS A MATÉRIAS APAGADAS DE PROPOSIÇÕES + +ATENÇÃO + +As seguintes proposições apontaram no passado para matérias +e esses apontamentos foram em algum momento retirados. + +Elas foram migradas da forma com estão agora: sem apontar para nenhuma matéria. +Entretanto, talvez você deseje rever esses apontamentos. + +Segue então uma lista dos apontamentos anteriores que detectamos. + +{} + +Para facilitar sua conferência, seguem os links para as proposições envolvidas: + +{} + +*/ + +{} + + '''.format(table.draw(), links, sqls) + + +def get_dependencias_a_ressucitar(slug): ocorrencias = yaml.load( Path(DIR_REPO.child('ocorrencias.yaml').read_file())) - fks_faltando = ocorrencias['fk'] + fks_faltando = ocorrencias.get('fk') + if not fks_faltando: + return [], [] + + proposicoes_para_materia = [ + fk for fk in fks_faltando + if fk['tabela'] == 'proposicao' and fk['campo'] == 'cod_materia'] + + print(get_apaga_materias_de_proposicoes(proposicoes_para_materia, slug)) + + fks_faltando = [fk for fk in fks_faltando + if fk not in proposicoes_para_materia] + excluidos = [get_excluido(fk) for fk in fks_faltando] desexcluir, criar = [ set([(tabela_alvo, campo, valor) @@ -214,15 +298,19 @@ TEMPLATE_RESSUCITADOS = ''' ''' +def get_url(slug): + return 'sapl.{}.leg.br'.format(slug.replace('-', '.')) + + def get_sqls_desexcluir_criar(desexcluir, criar, slug): - sqls_links = [get_sql(tabela_alvo, campo, valor) - for conjunto, get_sql in ((desexcluir, get_sql_desexcluir), - (criar, get_sql_criar)) - for tabela_alvo, campo, valor in conjunto] + sqls_links = [get_sql(*args) + for itens, get_sql in ((desexcluir, get_sql_desexcluir), + (criar, get_sql_criar)) + for args in itens] if not sqls_links: return '' else: - url_base = 'sapl.{}.leg.br'.format(slug.replace('-', '.')) + url_base = get_url(slug) sqls, links = zip(*sqls_links) links = [url_base + l for ll in links for l in ll] # flatten sqls, links = ['\n'.join(sorted(s)) for s in [sqls, links]] @@ -230,5 +318,5 @@ def get_sqls_desexcluir_criar(desexcluir, criar, slug): def print_ressucitar(slug): - desexcluir, criar = get_dependencias_a_ressucitar() + desexcluir, criar = get_dependencias_a_ressucitar(slug) print(get_sqls_desexcluir_criar(desexcluir, criar, slug)) From 331a82ed1d0b4e9c0e26526540e90bb9e2143cad Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 28 Aug 2018 10:41:26 -0300 Subject: [PATCH 18/34] =?UTF-8?q?Adiciona=20slug=20=C3=A0=20gera=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20links=20de=20ressucitados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/scripts/ressucita_dependencias.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 03ba371bf..1564879da 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -265,25 +265,26 @@ ind_excluido) values ({}, {}, 0, "O", '''.format(valor, num_legislatura) -def get_link(tabela_alvo, valor): - return '{}/{}'.format(urls[tabela_alvo], valor) +def get_link(tabela_alvo, valor, slug): + url_base = get_url(slug) + return 'http://{}{}/{}'.format(url_base, urls[tabela_alvo], valor) -def get_sql_desexcluir(tabela_alvo, campo, valor): +def get_sql_desexcluir(tabela_alvo, campo, valor, slug): sql = 'update {} set ind_excluido = 0 where {} = {};'.format( tabela_alvo, campo, valor) - return sql, [get_link(tabela_alvo, valor)] + return sql, [get_link(tabela_alvo, valor, slug)] -def get_sql_criar(tabela_alvo, campo, valor): +def get_sql_criar(tabela_alvo, campo, valor, slug): if tabela_alvo == 'sessao_legislativa': sql = criar_sessao_legislativa(campo, valor) else: sql, extras = SQLS_CRIACAO[tabela_alvo] sql = sql.format(valor) - links = [get_link(tabela_alvo, valor)] + links = [get_link(tabela_alvo, valor, slug)] for tabela_extra, valor_extra in extras: - links.insert(0, get_link(tabela_extra, valor_extra)) + links.insert(0, get_link(tabela_extra, valor_extra, slug)) return sql, links @@ -303,16 +304,15 @@ def get_url(slug): def get_sqls_desexcluir_criar(desexcluir, criar, slug): - sqls_links = [get_sql(*args) + sqls_links = [get_sql(*(args + [slug])) for itens, get_sql in ((desexcluir, get_sql_desexcluir), (criar, get_sql_criar)) for args in itens] if not sqls_links: return '' else: - url_base = get_url(slug) sqls, links = zip(*sqls_links) - links = [url_base + l for ll in links for l in ll] # flatten + links = [l for ll in links for l in ll] # flatten sqls, links = ['\n'.join(sorted(s)) for s in [sqls, links]] return TEMPLATE_RESSUCITADOS.format(links, sqls) From d682e6d8553fd0842d2224c3e3017ba7b8429757 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 28 Aug 2018 11:02:52 -0300 Subject: [PATCH 19/34] =?UTF-8?q?Move=20resolu=C3=A7=C3=A3o=20de=20registr?= =?UTF-8?q?os=20de=20vota=C3=A7=C3=A3o=20para=20dir=20de=20ajustes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 2685ef112..fd264124e 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -1125,12 +1125,14 @@ def adjust_protocolo_antes_salvar(new, old): {'cod_protocolo': old.cod_protocolo}) -ARQUIVO_COMO_RESOLVER_REGISTRO_VOTACAO_AMBIGUO = \ - 'como_resolver_registro_votacao_ambiguo.yaml' +def get_arquivo_resolve_registro_votacao(): + return DIR_DADOS_MIGRACAO.child( + 'ajustes_pre_migracao', + '{}_resolve_registro_votacao_ambiguo.yaml'.format(sigla_casa)) def get_como_resolver_registro_votacao_ambiguo(): - path = DIR_REPO.child(ARQUIVO_COMO_RESOLVER_REGISTRO_VOTACAO_AMBIGUO) + path = get_arquivo_resolve_registro_votacao() if path.exists(): return yaml.load(path.read_file()) else: @@ -1159,7 +1161,7 @@ def adjust_registrovotacao_antes_salvar(new, old): raise Exception(''' Registro de Votação ambíguo: {} Resolva criando o arquivo {}'''.format( - new.id, ARQUIVO_COMO_RESOLVER_REGISTRO_VOTACAO_AMBIGUO)) + new.id, get_arquivo_resolve_registro_votacao())) def adjust_tipoafastamento(new, old): From 01c65c9a7298d5f3b05c5b6ff5b8e09b55e92bd5 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 28 Aug 2018 13:15:35 -0300 Subject: [PATCH 20/34] =?UTF-8?q?Propaga=20mais=20exclus=C3=B5es=20e=20ajs?= =?UTF-8?q?uta=20natureza=20do=20resultado=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 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index fd264124e..863493026 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -559,6 +559,7 @@ PROPAGACOES_DE_EXCLUSAO = [ ('materia_legislativa', 'acomp_materia', 'cod_materia'), ('materia_legislativa', 'despacho_inicial', 'cod_materia'), ('materia_legislativa', 'legislacao_citada', 'cod_materia'), + ('materia_legislativa', 'relatoria', 'cod_materia'), # norma ('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referente'), @@ -1300,6 +1301,8 @@ def adjust_tiporesultadovotacao(new, old): new.natureza = TipoResultadoVotacao.NATUREZA_CHOICES.aprovado elif 'rejeita' in new.nome.lower(): new.natureza = TipoResultadoVotacao.NATUREZA_CHOICES.rejeitado + elif 'retirado' in new.nome.lower(): + new.natureza = TipoResultadoVotacao.NATUREZA_CHOICES.rejeitado else: if new.nome != 'DESCONHECIDO': # ignoramos a natureza de item criado pela migração From 8004c93a490993243987d2d73d3cb1614184037c Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 28 Aug 2018 13:17:11 -0300 Subject: [PATCH 21/34] =?UTF-8?q?Desconsidera=20propaga=C3=A7=C3=B5es=20de?= =?UTF-8?q?=20exclus=C3=A3o=20ao=20ressucitar=20deps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/scripts/ressucita_dependencias.py | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 1564879da..dce0e1a0b 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -4,7 +4,8 @@ import texttable import yaml from unipath import Path -from sapl.legacy.migracao_dados import DIR_REPO, exec_legado +from sapl.legacy.migracao_dados import (DIR_REPO, PROPAGACOES_DE_EXCLUSAO, + exec_legado) def stripsplit(ll): @@ -15,9 +16,6 @@ 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 @@ -29,7 +27,6 @@ fks_legado = ''' sessao_plenaria_presenca cod_parlamentar parlamentar composicao_comissao cod_cargo cargo_comissao sessao_plenaria cod_sessao_leg sessao_legislativa - ordem_dia cod_sessao_plen sessao_plenaria proposicao cod_materia materia_legislativa proposicao cod_autor autor tramitacao cod_status status_tramitacao @@ -47,6 +44,9 @@ fks_legado = ''' sessao_plenaria tip_sessao tipo_sessao_plenaria mesa_sessao_plenaria cod_cargo cargo_mesa norma_juridica tip_norma tipo_norma_juridica + materia_legislativa tip_id_basica tipo_materia_legislativa + despacho_inicial cod_comissao comissao + relatoria cod_comissao comissao ''' fks_legado = stripsplit(fks_legado) fks_legado = {(o, c): t for (o, c, t) in fks_legado} @@ -74,6 +74,7 @@ cargo_mesa /sistema/mesa-diretora/cargo-mesa documento_administrativo /docadm tipo_materia_legislativa /sistema/materia/tipo tipo_norma_juridica /sistema/norma/tipo +comissao /comissao registro_votacao ????????? ''' urls = dict(stripsplit(urls)) @@ -94,6 +95,7 @@ def get_tabela_campo_tipo_proposicao(tip_proposicao): CAMPOS_ORIGEM_PARA_ALVO = { 'cod_unid_tram_dest': 'cod_unid_tramitacao', 'cod_unid_tram_local': 'cod_unid_tramitacao', + 'tip_id_basica': 'tip_materia', } @@ -168,8 +170,10 @@ def get_apaga_materias_de_proposicoes(fks, slug): links = '\n'.join([get_link_proposicao(p, slug) for p in cods_proposicoes]) sqls = '\n'.join(sqls) - - return ''' + if not sqls: + return '' + else: + return ''' /* REFERÊNCIAS A MATÉRIAS APAGADAS DE PROPOSIÇÕES ATENÇÃO @@ -208,8 +212,11 @@ def get_dependencias_a_ressucitar(slug): print(get_apaga_materias_de_proposicoes(proposicoes_para_materia, slug)) + propagacoes = {(o, c) for t, o, c in PROPAGACOES_DE_EXCLUSAO} + fks_faltando = [fk for fk in fks_faltando - if fk not in proposicoes_para_materia] + if fk not in proposicoes_para_materia + and (fk['tabela'], fk['campo']) not in propagacoes] excluidos = [get_excluido(fk) for fk in fks_faltando] desexcluir, criar = [ @@ -246,7 +253,11 @@ SQLS_CRIACAO = [ ('tipo_autor', ''' insert into tipo_autor (tip_autor, des_tipo_autor, ind_excluido) values ({}, "DESCONHECIDO", 0); - ''') + '''), + ('unidade_tramitacao', ''' + insert into unidade_tramitacao (cod_unid_tramitacao, cod_comissao, cod_orgao, cod_parlamentar, ind_excluido) + values ({}, NULL, NULL, NULL, 0); + '''), ] SQLS_CRIACAO = {k: (dedent(sql.strip()), extras) for k, sql, *extras in SQLS_CRIACAO} @@ -291,8 +302,18 @@ def get_sql_criar(tabela_alvo, campo, valor, slug): TEMPLATE_RESSUCITADOS = ''' /* RESSUCITADOS + +SOBRE REGISTROS QUE ESTAVAM APAGADOS E FORAM RESTAURADOS + +Os registros que listamos a seguir estavam excluídos (ou simplesmente não existiam) no sistema antigo e precisaram ser restaurados (ou criados) para completarmos a migração. Foi necessário fazer isso pois outros registros ativos no sistema apontam para eles. +Vocês agora podem decidir mantê-los, ajustá-los ou excluí-los. Segue a lista: + {} +Se a opção for por excluir um desses registros novamente, note que só será possível fazer isso quando nada mais no sistema fizer referência a ele. + +Ao tentar excluir um registro usado em outras partes do sistema, você verá uma lista dos itens que apontam para ele de alguma forma. Para conseguir excluir você deve editar cada dos dos itens dependentes lista mostrada, retirando ou trocando a referência ao que deseja excluir. + */ {} @@ -300,11 +321,11 @@ TEMPLATE_RESSUCITADOS = ''' def get_url(slug): - return 'sapl.{}.leg.br'.format(slug.replace('-', '.')) + return 'sapl31.{}.leg.br'.format(slug.replace('-', '.')) def get_sqls_desexcluir_criar(desexcluir, criar, slug): - sqls_links = [get_sql(*(args + [slug])) + sqls_links = [get_sql(*(args + (slug,))) for itens, get_sql in ((desexcluir, get_sql_desexcluir), (criar, get_sql_criar)) for args in itens] From 49739c30cebf9339b37b538f0af762abb1354f46 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 28 Aug 2018 15:00:05 -0300 Subject: [PATCH 22/34] =?UTF-8?q?Corrige=20sql=20de=20revers=C3=A3o=20de?= =?UTF-8?q?=20exclus=C3=A3o=20de=20autores?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 863493026..f417f87f2 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -367,8 +367,8 @@ def reverte_exclusao_de_autores_referenciados_no_legado(): where ind_excluido <> 1) '''.format(parlamentar=tabela, cod_parlamentar=fk) if autores_referenciados: - sql += ' and cod_autor not in {}'.format( - tuple(autores_referenciados)) + sql += ' and cod_autor not in ({})'.format( + ', '.join(map(str, autores_referenciados))) exec_legado(sql) From 26ee44c40caf8a97bc48c51da19a18889affd365 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 28 Aug 2018 15:16:52 -0300 Subject: [PATCH 23/34] Adiciona sqls p ressucitar deps diretamente ao arq de ajustes --- sapl/legacy/migracao_dados.py | 8 ++++++-- sapl/legacy/scripts/ressucita_dependencias.py | 14 +++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index f417f87f2..dec526ecb 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -811,6 +811,11 @@ def roda_comando_shell(cmd): assert res == 0, 'O comando falhou: {}'.format(cmd) +def get_arquivo_ajustes_pre_migracao(): + return DIR_DADOS_MIGRACAO.child( + 'ajustes_pre_migracao', '{}.sql'.format(sigla_casa)) + + def migrar_dados(apagar_do_legado=False): try: ocorrencias.clear() @@ -829,8 +834,7 @@ def migrar_dados(apagar_do_legado=False): exec_legado('SET SESSION sql_mode = "NO_AUTO_VALUE_ON_ZERO";') # executa ajustes pré-migração, se existirem - arq_ajustes_pre_migracao = DIR_DADOS_MIGRACAO.child( - 'ajustes_pre_migracao', '{}.sql'.format(sigla_casa)) + arq_ajustes_pre_migracao = get_arquivo_ajustes_pre_migracao() if arq_ajustes_pre_migracao.exists(): exec_legado(arq_ajustes_pre_migracao.read_file()) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index dce0e1a0b..040476c23 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -5,7 +5,8 @@ import yaml from unipath import Path from sapl.legacy.migracao_dados import (DIR_REPO, PROPAGACOES_DE_EXCLUSAO, - exec_legado) + exec_legado, + get_arquivo_ajustes_pre_migracao) def stripsplit(ll): @@ -338,6 +339,13 @@ def get_sqls_desexcluir_criar(desexcluir, criar, slug): return TEMPLATE_RESSUCITADOS.format(links, sqls) -def print_ressucitar(slug): +def get_ressucitar(slug): desexcluir, criar = get_dependencias_a_ressucitar(slug) - print(get_sqls_desexcluir_criar(desexcluir, criar, slug)) + return get_sqls_desexcluir_criar(desexcluir, criar, slug) + + +def adiciona_ressucitar(slug): + arq_ajustes_pre_migracao = get_arquivo_ajustes_pre_migracao() + conteudo = arq_ajustes_pre_migracao.read_file() + sqls = get_ressucitar(slug) + arq_ajustes_pre_migracao.write_file('{}\n{}'.format(conteudo, sqls)) From 16cdbe39f240837a6c09be382dfb05810c474432 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Wed, 29 Aug 2018 13:34:02 -0300 Subject: [PATCH 24/34] =?UTF-8?q?Adiciona=20mais=20propaga=C3=A7=C3=B5es?= =?UTF-8?q?=20de=20exclus=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index dec526ecb..1984826d3 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -216,6 +216,13 @@ def get_estrutura_legado(model): return model_legado, tabela_legado, campos_pk_legado +def com_aspas_se_necessario(valor): + if isinstance(valor, int): + return valor + else: + return '"{}"'.format(valor) + + class ForeignKeyFaltando(ObjectDoesNotExist): 'Uma FK aponta para um registro inexistente' @@ -233,7 +240,9 @@ class ForeignKeyFaltando(ObjectDoesNotExist): pk = {c: getattr(self.old, c) for c in campos_pk} sql = 'select * from {} where {};'.format( tabela, - ' and '.join(['{} = {}'.format(k, v) for k, v in pk.items()])) + ' and '.join([ + '{} = {}'.format(k, com_aspas_se_necessario(v)) + for k, v in pk.items()])) return OrderedDict((('campo', campo), ('valor', self.valor), ('tabela', tabela), @@ -531,6 +540,9 @@ PROPAGACOES_DE_EXCLUSAO = [ ('parlamentar', 'composicao_mesa', 'cod_parlamentar'), ('parlamentar', 'composicao_comissao', 'cod_parlamentar'), + # coligacao + ('coligacao', 'composicao_coligacao', 'cod_coligacao'), + # comissao ('comissao', 'composicao_comissao', 'cod_comissao'), ('periodo_comp_comissao', 'composicao_comissao', 'cod_periodo_comp'), @@ -539,6 +551,9 @@ 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'), + ('sessao_plenaria', 'sessao_plenaria_presenca', 'cod_sessao_plen'), + ('sessao_plenaria', 'ordem_dia_presenca', 'cod_sessao_plen'), + # 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 @@ -860,7 +875,7 @@ def migrar_dados(apagar_do_legado=False): ocorrencias.default_factory = None arq_ocorrencias = Path(REPO.working_dir, 'ocorrencias.yaml') with open(arq_ocorrencias, 'w') as arq: - pyaml.dump(ocorrencias, arq, vspacing=1) + pyaml.dump(ocorrencias, arq, vspacing=1, width=200) REPO.git.add([arq_ocorrencias.name]) info('Ocorrências salvas em\n {}'.format(arq_ocorrencias)) if not ocorrencias: From 682b780a79076aad96e7e2288738678981de215d Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Wed, 29 Aug 2018 13:34:32 -0300 Subject: [PATCH 25/34] Corrige msg de ressucitar deps --- sapl/legacy/scripts/ressucita_dependencias.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 040476c23..cd3f1a9b4 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -41,6 +41,7 @@ fks_legado = ''' relatoria cod_parlamentar parlamentar relatoria cod_materia materia_legislativa unidade_tramitacao cod_orgao orgao + unidade_tramitacao cod_comissao comissao norma_juridica cod_materia materia_legislativa sessao_plenaria tip_sessao tipo_sessao_plenaria mesa_sessao_plenaria cod_cargo cargo_mesa @@ -211,7 +212,8 @@ def get_dependencias_a_ressucitar(slug): fk for fk in fks_faltando if fk['tabela'] == 'proposicao' and fk['campo'] == 'cod_materia'] - print(get_apaga_materias_de_proposicoes(proposicoes_para_materia, slug)) + preambulo = get_apaga_materias_de_proposicoes( + proposicoes_para_materia, slug) propagacoes = {(o, c) for t, o, c in PROPAGACOES_DE_EXCLUSAO} @@ -230,7 +232,7 @@ def get_dependencias_a_ressucitar(slug): # o registro não existe lambda res: not res )] - return desexcluir, criar + return preambulo, desexcluir, criar SQLS_CRIACAO = [ @@ -300,7 +302,7 @@ def get_sql_criar(tabela_alvo, campo, valor, slug): return sql, links -TEMPLATE_RESSUCITADOS = ''' +TEMPLATE_RESSUCITADOS = '''{} /* RESSUCITADOS @@ -322,10 +324,10 @@ Ao tentar excluir um registro usado em outras partes do sistema, você verá uma def get_url(slug): - return 'sapl31.{}.leg.br'.format(slug.replace('-', '.')) + return 'sapl.{}.leg.br'.format(slug.replace('-', '.')) -def get_sqls_desexcluir_criar(desexcluir, criar, slug): +def get_sqls_desexcluir_criar(preambulo, desexcluir, criar, slug): sqls_links = [get_sql(*(args + (slug,))) for itens, get_sql in ((desexcluir, get_sql_desexcluir), (criar, get_sql_criar)) @@ -336,12 +338,12 @@ def get_sqls_desexcluir_criar(desexcluir, criar, slug): sqls, links = zip(*sqls_links) links = [l for ll in links for l in ll] # flatten sqls, links = ['\n'.join(sorted(s)) for s in [sqls, links]] - return TEMPLATE_RESSUCITADOS.format(links, sqls) + return TEMPLATE_RESSUCITADOS.format(preambulo, links, sqls) def get_ressucitar(slug): - desexcluir, criar = get_dependencias_a_ressucitar(slug) - return get_sqls_desexcluir_criar(desexcluir, criar, slug) + preambulo, desexcluir, criar = get_dependencias_a_ressucitar(slug) + return get_sqls_desexcluir_criar(preambulo, desexcluir, criar, slug) def adiciona_ressucitar(slug): From aef257f04cdecb0fc2406fe470029a8e12cdd4d9 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 31 Aug 2018 16:08:34 -0300 Subject: [PATCH 26/34] =?UTF-8?q?Atualiza=20testes=20de=20renames=20de=20m?= =?UTF-8?q?igra=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/test_renames.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/sapl/legacy/test_renames.py b/sapl/legacy/test_renames.py index 573129725..b92c5d0ac 100644 --- a/sapl/legacy/test_renames.py +++ b/sapl/legacy/test_renames.py @@ -5,12 +5,13 @@ from sapl.base.models import AppConfig, Autor, CasaLegislativa, TipoAutor from sapl.comissoes.models import \ DocumentoAcessorio as DocumentoAcessorioComissoes from sapl.comissoes.models import Comissao, Composicao, Participacao, Reuniao +from sapl.legacy.migracao_dados import appconfs, get_renames, legacy_app from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio, MateriaLegislativa, Proposicao, TipoMateriaLegislativa, TipoProposicao, Tramitacao) -from sapl.norma.models import (NormaJuridica, NormaRelacionada, - TipoVinculoNormaJuridica) +from sapl.norma.models import (AnexoNormaJuridica, NormaJuridica, + NormaRelacionada, TipoVinculoNormaJuridica) from sapl.parlamentares.models import (Frente, Mandato, Parlamentar, Partido, TipoAfastamento, Votante) from sapl.protocoloadm.models import DocumentoAdministrativo @@ -20,14 +21,12 @@ from sapl.sessao.models import (Bancada, Bloco, CargoBancada, SessaoPlenaria, TipoResultadoVotacao, VotoParlamentar) -from .migracao_dados import appconfs, get_renames, legacy_app - RENAMING_IGNORED_MODELS = [ - Votante, Frente, Bancada, CargoBancada, Bloco, # parlamentares + Votante, Frente, Bancada, Bloco, Votante, # parlamentares Composicao, Reuniao, DocumentoAcessorioComissoes, # commissoes AppConfig, CasaLegislativa, # base - ResumoOrdenacao, # sessao - TipoVinculoNormaJuridica, # norma + CargoBancada, ResumoOrdenacao, # sessao + AnexoNormaJuridica, TipoVinculoNormaJuridica, # norma ] @@ -49,15 +48,16 @@ RENAMING_IGNORED_FIELDS = [ 'upload_ata', 'upload_anexo', 'upload_pauta'}), - (ExpedienteMateria, {'votacao_aberta'}), - (OrdemDia, {'votacao_aberta'}), + (ExpedienteMateria, {'votacao_aberta', 'registro_aberto'}), + (OrdemDia, {'votacao_aberta', 'registro_aberto'}), (NormaJuridica, {'texto_integral', 'data_ultima_atualizacao', 'assuntos'}), (Parlamentar, { 'uf_residencia', 'municipio_residencia', 'cropping', 'fotografia'}), - (Partido, {'logo_partido'}), + (Partido, {'logo_partido', 'observacao'}), (MateriaLegislativa, { 'autores', 'anexadas', 'data_ultima_atualizacao', 'texto_original'}), - (DocumentoAdministrativo, {'protocolo', 'texto_integral'}), + (DocumentoAdministrativo, { + 'protocolo', 'numero_externo', 'texto_integral'}), (Mandato, {'titular', 'data_fim_mandato', 'data_inicio_mandato'}), (TipoMateriaLegislativa, {'sequencia_numeracao'}), (TipoAutor, {'content_type'}), @@ -71,6 +71,9 @@ RENAMING_IGNORED_FIELDS = [ (AcompanhamentoMateria, {'confirmado', 'data_cadastro', 'usuario'}), (Autor, {'user', 'content_type', 'object_id', 'autor_related'}), (Comissao, {'ativa'}), + (Reuniao, {'url_audio', 'url_video', 'local_reuniao', 'upload_anexo', + 'periodo', 'upload_pauta', 'tema', 'hora_fim', 'upload_ata', + 'nome', 'hora_inicio'}) ] From f51bd99c3444880f5dcd179948e01cad7435a16c Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 31 Aug 2018 16:09:01 -0300 Subject: [PATCH 27/34] =?UTF-8?q?Usa=20slug=20de=20arquivo=20de=20configur?= =?UTF-8?q?a=C3=A7=C3=A3o=20ao=20ressucitar=20deps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/scripts/ressucita_dependencias.py | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index cd3f1a9b4..3fa9decd7 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -1,12 +1,13 @@ from textwrap import dedent -import texttable import yaml -from unipath import Path -from sapl.legacy.migracao_dados import (DIR_REPO, PROPAGACOES_DE_EXCLUSAO, - exec_legado, +import texttable +from sapl.legacy.migracao_dados import (PROPAGACOES_DE_EXCLUSAO, exec_legado, get_arquivo_ajustes_pre_migracao) +from sapl.legacy_migration_settings import (DIR_DADOS_MIGRACAO, DIR_REPO, + NOME_BANCO_LEGADO) +from unipath import Path def stripsplit(ll): @@ -49,6 +50,9 @@ fks_legado = ''' materia_legislativa tip_id_basica tipo_materia_legislativa despacho_inicial cod_comissao comissao relatoria cod_comissao comissao + autor cod_comissao comissao + composicao_mesa cod_cargo cargo_mesa + comissao tip_comissao tipo_comissao ''' fks_legado = stripsplit(fks_legado) fks_legado = {(o, c): t for (o, c, t) in fks_legado} @@ -346,8 +350,16 @@ def get_ressucitar(slug): return get_sqls_desexcluir_criar(preambulo, desexcluir, criar, slug) -def adiciona_ressucitar(slug): +def get_slug(): + arq = DIR_DADOS_MIGRACAO.child('siglas_para_slugs.yaml') + with open(arq, 'r') as arq: + siglas_para_slugs = yaml.load(arq) + sigla = NOME_BANCO_LEGADO[-3:] + return siglas_para_slugs[sigla] + + +def adiciona_ressucitar(): arq_ajustes_pre_migracao = get_arquivo_ajustes_pre_migracao() conteudo = arq_ajustes_pre_migracao.read_file() - sqls = get_ressucitar(slug) + sqls = get_ressucitar(get_slug()) arq_ajustes_pre_migracao.write_file('{}\n{}'.format(conteudo, sqls)) From 9063709427eb76834ed4cb0e254dbc23726bedec Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 31 Aug 2018 16:40:59 -0300 Subject: [PATCH 28/34] =?UTF-8?q?Refatora=20preenche=20dados=20b=C3=A1sico?= =?UTF-8?q?s=20ao=20migrar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migracao_dados.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 1984826d3..ecb5537eb 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -750,19 +750,21 @@ def fill_vinculo_norma_juridica(): def fill_dados_basicos(): - # Ajusta sequencia numérica e cria base.AppConfig - letra = 'A' - try: + # Ajusta sequencia numérica de protocolo e cria base.AppConfig + if (TipoNumeracaoProtocolo._meta.db_table in TABELAS_LEGADO + and TipoNumeracaoProtocolo.objects.exists()): + # se este banco legado tem a a configuração de numeração de protocolo tipo = TipoNumeracaoProtocolo.objects.latest('dat_inicial_protocolo') - if 'POR ANO' in tipo.des_numeracao_protocolo: - letra = 'A' - elif 'POR LEGISLATURA' in tipo.des_numeracao_protocolo: - letra = 'L' - elif 'CONSECUTIVO' in tipo.des_numeracao_protocolo: - letra = 'U' - except Exception as e: - pass - appconf = AppConf(sequencia_numeracao=letra) + descricao = tipo.des_numeracao_protocolo + if 'POR ANO' in descricao: + sequencia_numeracao = 'A' + elif 'POR LEGISLATURA' in descricao: + sequencia_numeracao = 'L' + elif 'CONSECUTIVO' in descricao: + sequencia_numeracao = 'U' + else: + sequencia_numeracao = 'A' + appconf = AppConf(sequencia_numeracao=sequencia_numeracao) appconf.save() From 7dc55f67cf747f2b0008d99f60e3c9c61d02eede Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 31 Aug 2018 16:51:17 -0300 Subject: [PATCH 29/34] Corrige unid tramitacao vazia como a anterior --- sapl/legacy/migracao_dados.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index ecb5537eb..40b8a1ddc 100644 --- a/sapl/legacy/migracao_dados.py +++ b/sapl/legacy/migracao_dados.py @@ -600,6 +600,18 @@ def propaga_exclusoes(propagacoes): exec_legado(sql) +def corrige_unidades_tramitacao_destino_vazia_como_anterior(): + """Se uma unidade de tramitação estiver vazia no legado a configura + como a anterior""" + + for tabela_tramitacao in ['tramitacao', 'tramitacao_administrativo']: + exec_legado(''' + update {} + set cod_unid_tram_dest = cod_unid_tram_local + where cod_unid_tram_dest is null; + '''.format(tabela_tramitacao)) + + def uniformiza_banco(): propaga_exclusoes(PROPAGACOES_DE_EXCLUSAO) checa_registros_votacao_ambiguos_e_remove_nao_usados() @@ -691,6 +703,7 @@ sessao_plenaria_presenca | dat_sessao = NULL | dat_sessao = 0 reverte_exclusao_de_autores_referenciados_no_legado() anula_tipos_origem_externa_invalidos() + corrige_unidades_tramitacao_destino_vazia_como_anterior() class Record: From 90f8ff34cc41fb404675dfb2c307dfb94c652d1f Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 31 Aug 2018 16:57:56 -0300 Subject: [PATCH 30/34] Corrige retorno de get_dependencias_a_ressucitar --- sapl/legacy/scripts/ressucita_dependencias.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 3fa9decd7..6b346c537 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -1,13 +1,13 @@ from textwrap import dedent +import texttable import yaml +from unipath import Path -import texttable from sapl.legacy.migracao_dados import (PROPAGACOES_DE_EXCLUSAO, exec_legado, get_arquivo_ajustes_pre_migracao) from sapl.legacy_migration_settings import (DIR_DADOS_MIGRACAO, DIR_REPO, NOME_BANCO_LEGADO) -from unipath import Path def stripsplit(ll): @@ -210,7 +210,7 @@ def get_dependencias_a_ressucitar(slug): Path(DIR_REPO.child('ocorrencias.yaml').read_file())) fks_faltando = ocorrencias.get('fk') if not fks_faltando: - return [], [] + return [], [], [] proposicoes_para_materia = [ fk for fk in fks_faltando From 346c31ae26e3d0ceb80f61468735c9584bfb6e79 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Sat, 1 Sep 2018 14:10:04 -0300 Subject: [PATCH 31/34] Generaliza mapeamento de fks p ressucitar deps --- sapl/legacy/scripts/ressucita_dependencias.py | 63 ++++++------------- 1 file changed, 19 insertions(+), 44 deletions(-) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 6b346c537..8037f23ee 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -4,8 +4,10 @@ import texttable import yaml from unipath import Path -from sapl.legacy.migracao_dados import (PROPAGACOES_DE_EXCLUSAO, exec_legado, - get_arquivo_ajustes_pre_migracao) +from sapl.legacy.migracao_dados import (PROPAGACOES_DE_EXCLUSAO, + campos_novos_para_antigos, exec_legado, + get_arquivo_ajustes_pre_migracao, + models_novos_para_antigos) from sapl.legacy_migration_settings import (DIR_DADOS_MIGRACAO, DIR_REPO, NOME_BANCO_LEGADO) @@ -14,48 +16,21 @@ def stripsplit(ll): return [l.split() for l in ll.strip().splitlines()] -fks_legado = ''' - autor cod_parlamentar parlamentar - autor tip_autor tipo_autor - autoria cod_autor autor - 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 - composicao_comissao cod_cargo cargo_comissao - sessao_plenaria cod_sessao_leg sessao_legislativa - proposicao cod_materia materia_legislativa - proposicao cod_autor autor - tramitacao cod_status status_tramitacao - expediente_sessao_plenaria cod_expediente tipo_expediente - proposicao tip_proposicao tipo_proposicao - tramitacao cod_unid_tram_dest unidade_tramitacao - tramitacao cod_unid_tram_local unidade_tramitacao - tramitacao_administrativo cod_unid_tram_dest unidade_tramitacao - tramitacao_administrativo cod_unid_tram_local unidade_tramitacao - documento_acessorio tip_documento tipo_documento - relatoria cod_parlamentar parlamentar - relatoria cod_materia materia_legislativa - unidade_tramitacao cod_orgao orgao - unidade_tramitacao cod_comissao comissao - norma_juridica cod_materia materia_legislativa - sessao_plenaria tip_sessao tipo_sessao_plenaria - mesa_sessao_plenaria cod_cargo cargo_mesa - norma_juridica tip_norma tipo_norma_juridica - materia_legislativa tip_id_basica tipo_materia_legislativa - despacho_inicial cod_comissao comissao - relatoria cod_comissao comissao - autor cod_comissao comissao - composicao_mesa cod_cargo cargo_mesa - comissao tip_comissao tipo_comissao -''' -fks_legado = stripsplit(fks_legado) -fks_legado = {(o, c): t for (o, c, t) in fks_legado} +def _tab_legado(model): + return models_novos_para_antigos[model]._meta.db_table + +fks_legado = { + (_tab_legado(m), campos_novos_para_antigos[f]): _tab_legado(f.related_model) # noqa + for m in models_novos_para_antigos + for f in m._meta.fields + if f in campos_novos_para_antigos and f.related_model} + +# acrescenta mapeamentos que não existem em campos_novos_para_antigos +for tabela_origem, campo, tabela_destino in [ + ['autor', 'cod_parlamentar', 'parlamentar'], + ['autor', 'cod_comissao', 'comissao'], + ['autor', 'cod_partido', 'partido']]: + fks_legado[(tabela_origem, campo)] = tabela_destino urls = ''' From e622ae193f729ff289a3809050857ad64518955b Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Sat, 1 Sep 2018 14:10:13 -0300 Subject: [PATCH 32/34] Adiciona comando para ressucitar deps --- sapl/legacy/management/commands/ressucitar_deps.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 sapl/legacy/management/commands/ressucitar_deps.py diff --git a/sapl/legacy/management/commands/ressucitar_deps.py b/sapl/legacy/management/commands/ressucitar_deps.py new file mode 100644 index 000000000..70900e887 --- /dev/null +++ b/sapl/legacy/management/commands/ressucitar_deps.py @@ -0,0 +1,12 @@ +from django.core.management.base import BaseCommand + +from sapl.legacy.scripts.ressucita_dependencias import adiciona_ressucitar + + +class Command(BaseCommand): + + help = 'Ressucita dependências apagadas ' \ + 'que são necessárias para migrar outros registros' + + def handle(self, *args, **options): + adiciona_ressucitar() From 866e2b4535c12c3bad878b8e7ed6025375d3f3fb Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Sat, 1 Sep 2018 14:59:40 -0300 Subject: [PATCH 33/34] Edita ajustes apenas se houver deps a ressucitar --- sapl/legacy/scripts/ressucita_dependencias.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 8037f23ee..5653a9ada 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -334,7 +334,8 @@ def get_slug(): def adiciona_ressucitar(): - arq_ajustes_pre_migracao = get_arquivo_ajustes_pre_migracao() - conteudo = arq_ajustes_pre_migracao.read_file() sqls = get_ressucitar(get_slug()) - arq_ajustes_pre_migracao.write_file('{}\n{}'.format(conteudo, sqls)) + if sqls.strip(): + arq_ajustes_pre_migracao = get_arquivo_ajustes_pre_migracao() + conteudo = arq_ajustes_pre_migracao.read_file() + arq_ajustes_pre_migracao.write_file('{}\n{}'.format(conteudo, sqls)) From e2b06cf9b7e9791a380a2781b59c0e8ed1859a27 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Sat, 1 Sep 2018 15:46:23 -0300 Subject: [PATCH 34/34] =?UTF-8?q?Corrige=20erro=20na=20cria=C3=A7=C3=A3o?= =?UTF-8?q?=20ao=20ressucitar=20deps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/scripts/ressucita_dependencias.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/legacy/scripts/ressucita_dependencias.py b/sapl/legacy/scripts/ressucita_dependencias.py index 5653a9ada..7b37c1977 100644 --- a/sapl/legacy/scripts/ressucita_dependencias.py +++ b/sapl/legacy/scripts/ressucita_dependencias.py @@ -272,6 +272,7 @@ def get_sql_desexcluir(tabela_alvo, campo, valor, slug): def get_sql_criar(tabela_alvo, campo, valor, slug): if tabela_alvo == 'sessao_legislativa': sql = criar_sessao_legislativa(campo, valor) + extras = [] else: sql, extras = SQLS_CRIACAO[tabela_alvo] sql = sql.format(valor)