Browse Source

Melhora estrutura do log de migração

pull/1847/head
Marcio Mazza 7 years ago
parent
commit
9475c17cfb
  1. 66
      sapl/legacy/migracao_dados.py

66
sapl/legacy/migracao_dados.py

@ -1,6 +1,6 @@
import re import re
import traceback import traceback
from collections import defaultdict from collections import OrderedDict, defaultdict
from datetime import date from datetime import date
from functools import lru_cache, partial from functools import lru_cache, partial
from itertools import groupby from itertools import groupby
@ -136,10 +136,10 @@ class ForeignKeyFaltando(ObjectDoesNotExist):
@property @property
def dados(self): def dados(self):
return {'field': self.field.name, return OrderedDict((('field', self.field.name),
'value': self.value, ('value', self.value),
'model': self.field.model.__name__, ('model', self.field.model.__name__),
'label': self.label} ('label', self.label)))
@lru_cache() @lru_cache()
@ -148,7 +148,7 @@ def _get_all_ids_from_model(model):
return set(model.objects.values_list('id', flat=True)) return set(model.objects.values_list('id', flat=True))
def get_fk_related(field, value, label='---'): def get_fk_related(field, value, label={}):
if value is None and field.null: if value is None and field.null:
return None return None
@ -554,9 +554,14 @@ relatoria | tip_fim_relatoria = NULL | tip_fim_relatoria = 0
anula_tipos_origem_externa_invalidos() anula_tipos_origem_externa_invalidos()
def iter_sql_records(sql): class Record:
class Record: pass
pass
def iter_sql_records(tabela):
sql = 'select * from ' + tabela
if existe_coluna_no_legado(tabela, 'ind_excluido'):
sql += ' where ind_excluido != 1'
cursor = exec_legado(sql) cursor = exec_legado(sql)
fieldnames = [name[0] for name in cursor.description] fieldnames = [name[0] for name in cursor.description]
for row in cursor.fetchall(): for row in cursor.fetchall():
@ -637,6 +642,11 @@ PATH_TABELA_TIMEZONES = DIR_DADOS_MIGRACAO.child('tabela_timezones.yaml')
DIR_RESULTADOS = DIR_DADOS_MIGRACAO.child('resultados') DIR_RESULTADOS = DIR_DADOS_MIGRACAO.child('resultados')
def dict_representer(dumper, data):
return dumper.represent_dict(data.items())
yaml.add_representer(OrderedDict, dict_representer)
class DataMigrator: class DataMigrator:
def __init__(self): def __init__(self):
@ -655,7 +665,7 @@ class DataMigrator:
else: else:
self.timezone = get_timezone(municipio, uf) self.timezone = get_timezone(municipio, uf)
def populate_renamed_fields(self, new, old): def populate_renamed_fields(self, new, old, campos_pk_legado):
renames = self.field_renames[type(new)] renames = self.field_renames[type(new)]
for field in new._meta.fields: for field in new._meta.fields:
@ -665,16 +675,12 @@ class DataMigrator:
old_value = getattr(old, old_field_name) old_value = getattr(old, old_field_name)
if field_type == 'ForeignKey': if field_type == 'ForeignKey':
# not necessarily a model label = {c: getattr(old, c) for c in campos_pk_legado}
if hasattr(old, '_meta') and old._meta.pk.name != 'id':
label = 'pk = {}'.format(old.pk)
else:
label = '-- SEM PK --'
fk_field_name = '{}_id'.format(field.name) fk_field_name = '{}_id'.format(field.name)
value = get_fk_related(field, old_value, label) value = get_fk_related(field, old_value, label)
setattr(new, fk_field_name, value) setattr(new, fk_field_name, value)
else: else:
value = getattr(old, old_field_name) value = old_value
if (field_type in ['CharField', 'TextField'] if (field_type in ['CharField', 'TextField']
and value in [None, 'None']): and value in [None, 'None']):
@ -732,7 +738,8 @@ class DataMigrator:
arq_ocorrencias = dir_ocorrencias.child( arq_ocorrencias = dir_ocorrencias.child(
self.nome_banco_legado + '.yaml') self.nome_banco_legado + '.yaml')
with open(arq_ocorrencias, 'w') as arq: with open(arq_ocorrencias, 'w') as arq:
yaml.safe_dump(dict(ocorrencias), arq, allow_unicode=True) dump = yaml.dump(dict(ocorrencias), allow_unicode=True)
arq.write(dump.replace('\n- ', '\n\n- '))
info('Ocorrências salvas em\n {}'.format(arq_ocorrencias)) info('Ocorrências salvas em\n {}'.format(arq_ocorrencias))
# recria tipos de autor padrão que não foram criados pela migração # recria tipos de autor padrão que não foram criados pela migração
@ -771,9 +778,9 @@ class DataMigrator:
nome_model = self.model_renames.get(model, model.__name__) nome_model = self.model_renames.get(model, model.__name__)
model_legado = legacy_app.get_model(nome_model) model_legado = legacy_app.get_model(nome_model)
tabela_legado = model_legado._meta.db_table tabela_legado = model_legado._meta.db_table
campos_pk = get_pk_legado(tabela_legado) campos_pk_legado = get_pk_legado(tabela_legado)
if len(campos_pk) == 1: if len(campos_pk_legado) == 1:
# a pk no legado tem um único campo # a pk no legado tem um único campo
nome_pk = model_legado._meta.pk.name nome_pk = model_legado._meta.pk.name
if 'ind_excluido' in {f.name for f in model_legado._meta.fields}: if 'ind_excluido' in {f.name for f in model_legado._meta.fields}:
@ -788,11 +795,7 @@ class DataMigrator:
return getattr(old, nome_pk) return getattr(old, nome_pk)
else: else:
# a pk no legado tem mais de um campo # a pk no legado tem mais de um campo
sql = 'select * from ' + tabela_legado old_records = iter_sql_records(tabela_legado)
if existe_coluna_no_legado(tabela_legado, 'ind_excluido'):
sql += ' where ind_excluido != 1'
old_records = iter_sql_records(sql)
get_id_do_legado = None get_id_do_legado = None
ajuste_antes_salvar = AJUSTE_ANTES_SALVAR.get(model) ajuste_antes_salvar = AJUSTE_ANTES_SALVAR.get(model)
@ -805,7 +808,7 @@ class DataMigrator:
for old in old_records: for old in old_records:
new = model() new = model()
try: try:
self.populate_renamed_fields(new, old) self.populate_renamed_fields(new, old, campos_pk_legado)
if ajuste_antes_salvar: if ajuste_antes_salvar:
ajuste_antes_salvar(new, old) ajuste_antes_salvar(new, old)
except ForeignKeyFaltando as e: except ForeignKeyFaltando as e:
@ -827,7 +830,7 @@ class DataMigrator:
' and '.join( ' and '.join(
'{} = "{}"'.format(campo, '{} = "{}"'.format(campo,
getattr(old, campo)) getattr(old, campo))
for campo in campos_pk)) for campo in campos_pk_legado))
# salva novos registros # salva novos registros
model.objects.bulk_create(novos) model.objects.bulk_create(novos)
@ -963,9 +966,7 @@ def adjust_participacao(new, old):
composicao.comissao_id, composicao.periodo_id = [ composicao.comissao_id, composicao.periodo_id = [
get_fk_related(Composicao._meta.get_field(name), get_fk_related(Composicao._meta.get_field(name),
value, value,
'composicao_comissao.cod_comp_comissao = {}'.format( {'composicao_comissao.cod_comp_comissao': old.pk})
old.pk
))
for name, value in (('comissao', old.cod_comissao), for name, value in (('comissao', old.cod_comissao),
('periodo', old.cod_periodo_comp))] ('periodo', old.cod_periodo_comp))]
# check if there is already an "equal" one in the db # check if there is already an "equal" one in the db
@ -1033,7 +1034,7 @@ def adjust_tipoproposicao(new, old):
raise ForeignKeyFaltando( raise ForeignKeyFaltando(
field=TipoProposicao.tipo_conteudo_related, field=TipoProposicao.tipo_conteudo_related,
value=(model_tipo.__name__, value), value=(model_tipo.__name__, value),
label='ind_mat_ou_doc = {}'.format(old.ind_mat_ou_doc)) label={'ind_mat_ou_doc': old.ind_mat_ou_doc})
def adjust_statustramitacao(new, old): def adjust_statustramitacao(new, old):
@ -1105,9 +1106,8 @@ def vincula_autor(new, old, model_relacionado, campo_relacionado, campo_nome):
nome_model_relacionado = model_relacionado._meta.model.__name__ nome_model_relacionado = model_relacionado._meta.model.__name__
raise ForeignKeyFaltando( raise ForeignKeyFaltando(
field=Autor.autor_related, field=Autor.autor_related,
value=(nome_model_relacionado, pk_rel), value=[nome_model_relacionado, pk_rel],
label='{} [pk={}] inexistente para autor'.format( label={'cod_autor': old.pk})
nome_model_relacionado, pk_rel))
else: else:
new.nome = getattr(new.autor_related, campo_nome) new.nome = getattr(new.autor_related, campo_nome)
return True return True

Loading…
Cancel
Save