Browse Source

Resolve conflitos em TipoAutor p migração corretiva

migracao
Marcio Mazza 6 years ago
parent
commit
01d3fd1f95
  1. 68
      sapl/legacy/migracao_dados.py

68
sapl/legacy/migracao_dados.py

@ -730,7 +730,28 @@ def apaga_ref_a_mats_e_docs_inexistentes_em_proposicoes():
)
def uniformiza_banco():
def restringe_e_reaponta_tipo_autor():
# restringe somente ao realmente utilizado
exec_legado(
"""delete from tipo_autor where tip_autor not in (
select distinct(tip_autor) from autor)"""
)
conflitos, max_id = encontra_conflitos_tipo_autor()
for id_novo, id_antigo in enumerate(conflitos, max_id + 1):
exec_legado(
f"""
update tipo_autor set tip_autor = {id_novo} where tip_autor = {id_antigo};
update autor set tip_autor = {id_novo} where tip_autor = {id_antigo};
"""
)
def uniformiza_banco(primeira_migracao):
"Uniformiza e ajusta o banco legado antes de migrar"
if not primeira_migracao:
restringe_e_reaponta_tipo_autor()
propaga_exclusoes(PROPAGACOES_DE_EXCLUSAO)
checa_registros_votacao_ambiguos_e_remove_nao_usados()
propaga_exclusoes(PROPAGACOES_DE_EXCLUSAO_REGISTROS_VOTACAO)
@ -919,9 +940,9 @@ def fill_vinculo_norma_juridica():
def criar_configuracao_inicial():
if AppConf.objects.exists():
# se estamos refazendo a migração não recriamos o appconf
return False
# só deve ser chamado na primeira migracão
assert not AppConf.objects.exists()
# Ajusta sequencia numérica de protocolo e cria base.AppConfig
if (
TipoNumeracaoProtocolo._meta.db_table in TABELAS_LEGADO
@ -940,7 +961,6 @@ def criar_configuracao_inicial():
sequencia_numeracao = "A"
appconf = AppConf(sequencia_numeracao_protocolo=sequencia_numeracao)
appconf.save()
return True
def get_sequence_name_and_last_value(model):
@ -1054,11 +1074,15 @@ def migrar_dados(flush=False, apagar_do_legado=False):
if arq_ajustes_pre_migracao.exists():
exec_legado(arq_ajustes_pre_migracao.read_file())
uniformiza_banco()
primeira_migracao = not AppConf.objects.exists()
uniformiza_banco(primeira_migracao)
if flush:
do_flush()
primeira_migracao = criar_configuracao_inicial()
if primeira_migracao:
criar_configuracao_inicial()
info("Começando migração: ...")
migrar_todos_os_models(apagar_do_legado)
@ -1127,9 +1151,6 @@ def migrar_todos_os_models(apagar_do_legado):
def migrar_model(model, apagar_do_legado):
print("Migrando %s..." % model.__name__)
if model == TipoAutor:
checagem_tipo_autor()
model_legado, tabela_legado, campos_pk_legado = get_estrutura_legado(model)
if len(campos_pk_legado) == 1:
@ -1267,7 +1288,7 @@ def migrar_model(model, apagar_do_legado):
exec_legado(sql_delete_legado)
def checagem_tipo_autor():
def encontra_conflitos_tipo_autor():
# Encontrei conflito de ids em TipoAutor entre
# um registro que existiu na base e foi apagado e um registro ressuscitado.
# Então testamos p garantir que não associamos um ressuscitado erroneamente
@ -1286,17 +1307,22 @@ def checagem_tipo_autor():
}
atual_e_historia = {**atual, **historia}
so_no_legado = set(legado.items()) - set(atual_e_historia.items())
# o que está so no legado agora
# nao tem conflito com a base atual e sua historia
conflito = [
(id, desc, atual_e_historia[id], "atual" if id in atual else "apagado")
for id, desc in so_no_legado
# o que:
# 1) está so no legado
# 2) tem um id igual ao de um registro da base atual (incluindo histórico)
# 3) mas com uma descrição difente
conflitos = {
id: (
descricao_no_legado,
atual_e_historia[id],
"atual" if id in atual else "historia",
)
for id, descricao_no_legado in so_no_legado
if id in atual_e_historia
]
assert not conflito, f"""
Existem tipos do legado em conflito com algum registro atual ou apagado:
{conflito}
"""
}
max_id = max(*atual_e_historia, *legado)
return conflitos, max_id
# MIGRATION_ADJUSTMENTS #####################################################

Loading…
Cancel
Save