Repository: interlegis/sapl

Issue:
Migração - Resultado votação matérias do expediente
Base sapl 2.5
![25](https://cloud.githubusercontent.com/assets/13314947/25485889/d4ce05c2-2b35-11e7-9bb6-4f4bb6bcb944.PNG)

Base importada 3.1
![photo_2017-04-27_10-38-49](https://cloud.githubusercontent.com/assets/13314947/25485887/d1c8338e-2b35-11e7-823f-f483008c113b.jpg)

a materia_id 5006 teria que ter registro de expediente_id e não de ordem_id


Discussion:
Base 2.5
e olha que interessante.

quando em materia_expediente o cod_ordem não existe na ordem_dia, migra certo
porém, quando existe o mesmo cod_ordem na ordem_dia ele migra para ordem_id

Ref. cod_ordem 1840 e 1841
1840 migrado correto
1841 migrado errado

Expediente_materia
![expediente](https://cloud.githubusercontent.com/assets/13314947/25488959/d51cc712-2b3e-11e7-8f2d-fd50b074f395.PNG)


ordem_dia
![ordem_dia](https://cloud.githubusercontent.com/assets/13314947/25488960/d59863ea-2b3e-11e7-8b0f-21a12004b9e5.PNG)


Resolving patch:
diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py
--- a/sapl/legacy/migration.py
+++ b/sapl/legacy/migration.py
@@ -28,7 +28,7 @@
                                TipoVinculoNormaJuridica, NormaRelacionada)
 from sapl.parlamentares.models import Parlamentar
 from sapl.protocoloadm.models import Protocolo, StatusTramitacaoAdministrativo
-from sapl.sessao.models import ExpedienteMateria, OrdemDia
+from sapl.sessao.models import ExpedienteMateria, OrdemDia, RegistroVotacao
 from sapl.settings import PROJECT_DIR
 from sapl.utils import delete_texto, normalize, save_texto
 
@@ -413,26 +413,6 @@ def populate_renamed_fields(self, new, old):
                 if field_type == 'CharField' or field_type == 'TextField':
                     if value is None or value == 'None':
                         value = ''
-                if field.model._meta.label == 'sessao.RegistroVotacao' and \
-                        field.name == 'ordem' and \
-                        not isinstance(value, OrdemDia):
-                    try:
-                        new_value = ExpedienteMateria.objects.get(pk=value)
-                        setattr(new, 'expediente', new_value)
-                        setattr(new, field.name, None)
-                        continue
-                    except ObjectDoesNotExist:
-                        msg = 'FK [%s] não encontrada para valor %s ' \
-                            '(em %s %s)' % (
-                                field.name, value,
-                                field.model.__name__, label or '---')
-                        with reversion.create_revision():
-                            value = make_stub(field.related_model, value)
-                            descricao = 'stub criado para entrada orfã!'
-                            warn(msg + ' => ' + descricao)
-                            save_relation(value, [field.name], msg, descricao,
-                                          eh_stub=True)
-                            reversion.set_comment('Stub criado pela migração')
                 setattr(new, field.name, value)
             elif field.model.__name__ == 'TipoAutor' and \
                     field.name == 'content_type':
@@ -657,6 +637,31 @@ def adjust_protocolo(new, old):
         new.numero = p['numero__max'] + 1
 
 
+def adjust_registrovotacao_antes_salvar(new, old):
+    ordem_dia = OrdemDia.objects.filter(
+        pk=old.cod_ordem, materia=old.cod_materia)
+    expediente_materia = ExpedienteMateria.objects.filter(
+        pk=old.cod_ordem, materia=old.cod_materia)
+
+    if ordem_dia and not expediente_materia:
+        new.ordem = ordem_dia[0]
+    if not ordem_dia and expediente_materia:
+        new.expediente = expediente_materia[0]
+
+
+def adjust_registrovotacao_depois_salvar(new, old):
+    if not new.ordem and not new.expediente:
+        with reversion.create_revision():
+            problema = 'RegistroVotacao de PK %s não possui nenhuma OrdemDia'\
+                ' ou ExpedienteMateria.' % old.pk
+            descricao = 'RevistroVotacao deve ter no mínimo uma ordem do dia'\
+                ' ou expediente vinculado.'
+            warn(problema + ' => ' + descricao)
+            save_relation(obj=new, problema=problema,
+                          descricao=descricao, eh_stub=False)
+            reversion.set_comment('RegistroVotacao sem ordem ou expediente')
+
+
 def adjust_tipoproposicao(new, old):
     if old.ind_mat_ou_doc == 'M':
         new.tipo_conteudo_related = TipoMateriaLegislativa.objects.get(
@@ -754,6 +759,7 @@ def adjust_comissao(new, old):
     Parlamentar: adjust_parlamentar,
     Participacao: adjust_participacao,
     Protocolo: adjust_protocolo,
+    RegistroVotacao: adjust_registrovotacao_antes_salvar,
     TipoProposicao: adjust_tipoproposicao,
     StatusTramitacao: adjust_statustramitacao,
     StatusTramitacaoAdministrativo: adjust_statustramitacaoadm,
@@ -763,6 +769,7 @@ def adjust_comissao(new, old):
 AJUSTE_DEPOIS_SALVAR = {
     NormaJuridica: adjust_normajuridica_depois_salvar,
     Protocolo: adjust_protocolo_depois_salvar,
+    RegistroVotacao: adjust_registrovotacao_depois_salvar,
 }
 
 # CHECKS ####################################################################


Test patch: