Browse Source

Merge branch 'migracao' into 3.1.x

pull/2144/head
Marcio Mazza 6 years ago
parent
commit
fff0ee63d3
  1. 11
      sapl/legacy/management/commands/migracao_25_31.py
  2. 4
      sapl/legacy/migracao.py
  3. 52
      sapl/legacy/migracao_dados.py
  4. 1
      sapl/legacy/migracao_usuarios.py
  5. 59
      sapl/legacy/scripts/ressucita_dependencias.py

11
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' 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): def handle(self, *args, **options):
migrar(interativo=False) migrar(apagar_do_legado=options['apagar_do_legado'])

4
sapl/legacy/migracao.py

@ -18,7 +18,7 @@ def adornar_msg(msg):
return '\n{1}\n{0}\n{1}'.format(msg, '#' * len(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: if TAG_MARCO in REPO.tags:
info('A migração já está feita.') info('A migração já está feita.')
return return
@ -26,7 +26,7 @@ def migrar(interativo=False):
'Antes de migrar ' 'Antes de migrar '
'é necessário fazer a exportação de documentos do zope') 'é necessário fazer a exportação de documentos do zope')
management.call_command('migrate') management.call_command('migrate')
migrar_dados() migrar_dados(apagar_do_legado)
migrar_usuarios(REPO.working_dir) migrar_usuarios(REPO.working_dir)
migrar_documentos(REPO) migrar_documentos(REPO)
gravar_marco() gravar_marco()

52
sapl/legacy/migracao_dados.py

@ -8,7 +8,6 @@ from datetime import date
from functools import lru_cache, partial from functools import lru_cache, partial
from itertools import groupby from itertools import groupby
from operator import xor from operator import xor
from subprocess import PIPE, call
import git import git
import pkg_resources import pkg_resources
@ -31,12 +30,10 @@ from unipath import Path
from sapl.base.models import AppConfig as AppConf from sapl.base.models import AppConfig as AppConf
from sapl.base.models import Autor, TipoAutor, cria_models_tipo_autor from sapl.base.models import Autor, TipoAutor, cria_models_tipo_autor
from sapl.comissoes.models import Comissao, Composicao, Participacao, Reuniao 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 NormaJuridica as OldNormaJuridica
from sapl.legacy.models import TipoNumeracaoProtocolo from sapl.legacy.models import TipoNumeracaoProtocolo
from sapl.legacy_migration_settings import (DATABASES, DIR_DADOS_MIGRACAO, from sapl.legacy_migration_settings import (DIR_DADOS_MIGRACAO, DIR_REPO,
DIR_REPO, NOME_BANCO_LEGADO, NOME_BANCO_LEGADO)
PROJECT_DIR)
from sapl.materia.models import (AcompanhamentoMateria, MateriaLegislativa, from sapl.materia.models import (AcompanhamentoMateria, MateriaLegislativa,
Proposicao, StatusTramitacao, TipoDocumento, Proposicao, StatusTramitacao, TipoDocumento,
TipoMateriaLegislativa, TipoProposicao, TipoMateriaLegislativa, TipoProposicao,
@ -141,10 +138,6 @@ models_novos_para_antigos = {
for model in field_renames} for model in field_renames}
models_novos_para_antigos[Composicao] = models_novos_para_antigos[Participacao] 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 = { campos_novos_para_antigos = {
model._meta.get_field(nome_novo): nome_antigo model._meta.get_field(nome_novo): nome_antigo
for model, renames in field_renames.items() for model, renames in field_renames.items()
@ -226,10 +219,6 @@ class ForeignKeyFaltando(ObjectDoesNotExist):
'Uma FK aponta para um registro inexistente' 'Uma FK aponta para um registro inexistente'
def __init__(self, field, valor, old): 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.field = field
self.valor = valor self.valor = valor
self.old = old self.old = old
@ -546,7 +535,6 @@ PROPAGACOES_DE_EXCLUSAO = [
('sessao_plenaria', 'ordem_dia', 'cod_sessao_plen'), ('sessao_plenaria', 'ordem_dia', 'cod_sessao_plen'),
('sessao_plenaria', 'expediente_materia', 'cod_sessao_plen'), ('sessao_plenaria', 'expediente_materia', 'cod_sessao_plen'),
('sessao_plenaria', 'expediente_sessao_plenaria', '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 # as consultas no código do sapl 2.5
# votacao_ordem_dia_obter_zsql e votacao_expediente_materia_obter_zsql # 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 # indicam que os registros de votação de matérias excluídas não são
@ -562,30 +550,38 @@ PROPAGACOES_DE_EXCLUSAO = [
('materia_legislativa', 'anexada', 'cod_materia_anexada'), ('materia_legislativa', 'anexada', 'cod_materia_anexada'),
('materia_legislativa', 'documento_acessorio', 'cod_materia'), ('materia_legislativa', 'documento_acessorio', 'cod_materia'),
('materia_legislativa', 'numeracao', 'cod_materia'), ('materia_legislativa', 'numeracao', 'cod_materia'),
('materia_legislativa', 'expediente_materia', 'cod_materia'),
# norma # norma
('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referente'), ('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referente'),
('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referida'), ('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referida'),
('norma_juridica', 'legislacao_citada', 'cod_norma'),
# documento administrativo # documento administrativo
('documento_administrativo', 'tramitacao_administrativo', 'cod_documento'), ('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) [pk_pai] = get_pk_legado(tabela_pai)
exec_legado(''' sql = '''
update {} set ind_excluido = 1 where {} not in ( update {} set ind_excluido = 1 where {} not in (
select {} from {} where ind_excluido != 1) 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(): def uniformiza_banco():
exec_legado('SET SESSION sql_mode = "";') # desliga checagens do mysql 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() checa_registros_votacao_ambiguos_e_remove_nao_usados()
propaga_exclusoes(PROPAGACOES_DE_EXCLUSAO_REGISTROS_VOTACAO)
garante_coluna_no_legado('proposicao', garante_coluna_no_legado('proposicao',
'num_proposicao int(11) NULL') 'num_proposicao int(11) NULL')
@ -808,7 +804,7 @@ def roda_comando_shell(cmd):
assert res == 0, 'O comando falhou: {}'.format(cmd) assert res == 0, 'O comando falhou: {}'.format(cmd)
def migrar_dados(): def migrar_dados(apagar_do_legado=False):
try: try:
ocorrencias.clear() ocorrencias.clear()
ocorrencias.default_factory = list ocorrencias.default_factory = list
@ -840,7 +836,7 @@ def migrar_dados():
fill_vinculo_norma_juridica() fill_vinculo_norma_juridica()
fill_dados_basicos() fill_dados_basicos()
info('Começando migração: ...') info('Começando migração: ...')
migrar_todos_os_models() migrar_todos_os_models(apagar_do_legado)
except Exception as e: except Exception as e:
ocorrencias['traceback'] = str(traceback.format_exc()) ocorrencias['traceback'] = str(traceback.format_exc())
raise e raise e
@ -874,7 +870,6 @@ def get_models_a_migrar():
if model in field_renames] if model in field_renames]
# retira reuniões quando não existe na base legada # retira reuniões quando não existe na base legada
# (só existe no sapl 3.0) # (só existe no sapl 3.0)
tabelas_legado = [t for (t,) in exec_legado('show tables')]
if not EXISTE_REUNIAO_NO_LEGADO: if not EXISTE_REUNIAO_NO_LEGADO:
models.remove(Reuniao) models.remove(Reuniao)
# Devido à referência TipoProposicao.tipo_conteudo_related # Devido à referência TipoProposicao.tipo_conteudo_related
@ -890,12 +885,12 @@ def get_models_a_migrar():
return models return models
def migrar_todos_os_models(): def migrar_todos_os_models(apagar_do_legado):
for model in get_models_a_migrar(): 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__) print('Migrando %s...' % model.__name__)
model_legado, tabela_legado, campos_pk_legado = \ model_legado, tabela_legado, campos_pk_legado = \
@ -949,6 +944,7 @@ def migrar_model(model):
novos.append(new) # guarda para salvar novos.append(new) # guarda para salvar
# acumula deleção do registro no legado # acumula deleção do registro no legado
if apagar_do_legado:
sql_delete_legado += 'delete from {} where {};\n'.format( sql_delete_legado += 'delete from {} where {};\n'.format(
tabela_legado, tabela_legado,
' and '.join( ' and '.join(
@ -973,7 +969,7 @@ def migrar_model(model):
reinicia_sequence(model, ultima_pk_legado + 1) reinicia_sequence(model, ultima_pk_legado + 1)
# apaga registros migrados do legado # apaga registros migrados do legado
if sql_delete_legado: if apagar_do_legado and sql_delete_legado:
exec_legado(sql_delete_legado) exec_legado(sql_delete_legado)
@ -1156,7 +1152,9 @@ def adjust_tipoafastamento(new, old):
def set_generic_fk(new, campo_virtual, 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) new.object_id = get_fk_related(campo_virtual, old)

1
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 Protocolo', 'Operador de Protocolo Administrativo'),
('Operador Sessao Plenaria', 'Operador de Sessão Plenária'), ('Operador Sessao Plenaria', 'Operador de Sessão Plenária'),
('Parlamentar', 'Votante'), ('Parlamentar', 'Votante'),
('Operador Painel', 'Operador de Painel Eletrônico'),
] ]
} }

59
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)
Loading…
Cancel
Save