Browse Source

Corrige vinculação de autor p nova busca de fk

pull/1847/head
Marcio Mazza 7 years ago
parent
commit
0005ed9a3d
  1. 64
      sapl/legacy/migracao_dados.py

64
sapl/legacy/migracao_dados.py

@ -131,14 +131,25 @@ for nome_novo, nome_antigo in (('comissao', 'cod_comissao'),
Composicao._meta.get_field(nome_novo)] = nome_antigo
# campos virtuais de Proposicao para funcionarem com get_fk_related
CampoFalso = namedtuple('CampoFalso', ['model', 'related_model'])
CAMPOS_FALSOS_PROPOSICAO = {
TipoMateriaLegislativa: CampoFalso(Proposicao, MateriaLegislativa),
TipoDocumento: CampoFalso(Proposicao, DocumentoAdministrativo)
# campos virtuais de Proposicao para funcionar com get_fk_related
class CampoVirtual(namedtuple('CampoVirtual', 'model related_model')):
null = True
CAMPOS_VIRTUAIS_PROPOSICAO = {
TipoMateriaLegislativa: CampoVirtual(Proposicao, MateriaLegislativa),
TipoDocumento: CampoVirtual(Proposicao, DocumentoAdministrativo)
}
for campo_falso in CAMPOS_FALSOS_PROPOSICAO.values():
campos_novos_para_antigos[campo_falso] = 'cod_mat_ou_doc'
for campo_virtual in CAMPOS_VIRTUAIS_PROPOSICAO.values():
campos_novos_para_antigos[campo_virtual] = 'cod_mat_ou_doc'
# campos virtuais de Autor para funcionar com get_fk_related
CAMPOS_VIRTUAIS_AUTOR = {related: CampoVirtual(Autor, related)
for related in (Parlamentar, Comissao, Partido)}
for related, campo_antigo in [(Parlamentar, 'cod_parlamentar'),
(Comissao, 'cod_comissao'),
(Partido, 'cod_partido')]:
campo_virtual = CAMPOS_VIRTUAIS_AUTOR[related]
campos_novos_para_antigos[campo_virtual] = campo_antigo
# MIGRATION #################################################################
@ -1069,9 +1080,9 @@ def adjust_proposicao_antes_salvar(new, old):
new.ano = new.data_envio.year
if old.cod_mat_ou_doc:
tipo_mat_ou_doc = type(new.tipo.tipo_conteudo_related)
campo_falso = CAMPOS_FALSOS_PROPOSICAO[tipo_mat_ou_doc]
new.content_type = content_types[campo_falso.related_model]
new.object_id = get_fk_related(campo_falso, old)
campo_virtual = CAMPOS_VIRTUAIS_PROPOSICAO[tipo_mat_ou_doc]
new.content_type = content_types[campo_virtual.related_model]
new.object_id = get_fk_related(campo_virtual, old)
def adjust_statustramitacao(new, old):
@ -1133,30 +1144,17 @@ def adjust_normajuridica_depois_salvar():
for assunto in assuntos)
def vincula_autor(new, old, model_relacionado, campo_relacionado, campo_nome):
pk_rel = getattr(old, campo_relacionado)
if pk_rel:
try:
new.autor_related = model_relacionado.objects.get(pk=pk_rel)
except ObjectDoesNotExist:
# ignoramos o autor órfão
nome_model_relacionado = model_relacionado._meta.model.__name__
raise ForeignKeyFaltando(
field=Autor.autor_related,
value=[nome_model_relacionado, pk_rel],
label={'cod_autor': old.pk})
else:
new.nome = getattr(new.autor_related, campo_nome)
return True
def adjust_autor(new, old):
for args in [
# essa ordem é importante
(Parlamentar, 'cod_parlamentar', 'nome_parlamentar'),
(Comissao, 'cod_comissao', 'nome'),
(Partido, 'cod_partido', 'nome')]:
if vincula_autor(new, old, *args):
# vincula autor com o objeto relacionado, tentando os três campos antigos
# o primeiro campo preenchido será usado, podendo lançar ForeignKeyFaltando
for model_relacionado, campo_nome in [(Parlamentar, 'nome_parlamentar'),
(Comissao, 'nome'),
(Partido, 'nome')]:
field = CAMPOS_VIRTUAIS_AUTOR[model_relacionado]
fk_encontrada = get_fk_related(field, old)
if fk_encontrada:
new.autor_related = model_relacionado.objects.get(id=fk_encontrada)
new.nome = getattr(new.autor_related, campo_nome)
break
if old.col_username:

Loading…
Cancel
Save