diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py index 14663f8ed..42114dbfa 100644 --- a/sapl/legacy/migracao_dados.py +++ b/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: