diff --git a/sapl/materia/tests/test_materia.py b/sapl/materia/tests/test_materia.py index 1938d04f4..2bd8f98bc 100644 --- a/sapl/materia/tests/test_materia.py +++ b/sapl/materia/tests/test_materia.py @@ -78,6 +78,51 @@ def test_lista_materias_anexadas(): assert lista[1] == materia_anexada_anexada +@pytest.mark.django_db(transaction=False) +def test_lista_materias_anexadas_ciclo(): + tipo_materia = mommy.make( + TipoMateriaLegislativa, + descricao="Tipo_Teste" + ) + regime_tramitacao = mommy.make( + RegimeTramitacao, + descricao="Regime_Teste" + ) + materia_principal = mommy.make( + MateriaLegislativa, + numero=20, + ano=2018, + data_apresentacao="2018-01-04", + regime_tramitacao=regime_tramitacao, + tipo=tipo_materia + ) + materia_anexada = mommy.make( + MateriaLegislativa, + numero=21, + ano=2019, + data_apresentacao="2019-05-04", + regime_tramitacao=regime_tramitacao, + tipo=tipo_materia + ) + + mommy.make( + Anexada, + materia_principal=materia_principal, + materia_anexada=materia_anexada, + data_anexacao="2019-05-11" + ) + mommy.make( + Anexada, + materia_principal=materia_anexada, + materia_anexada=materia_principal, + data_anexacao="2020-11-05" + ) + + lista = lista_anexados(materia_principal) + + assert len(lista) == 1 + assert lista[0] == materia_anexada + @pytest.mark.django_db(transaction=False) def make_unidade_tramitacao(descricao): # Cria uma comissão para ser a unidade de tramitação diff --git a/sapl/utils.py b/sapl/utils.py index 53ab057a9..f3b4b953c 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -965,16 +965,21 @@ def lista_anexados(principal, isMateriaLegislativa=True): else: #DocAdm from sapl.protocoloadm.models import Anexado anexados_iterator = Anexado.objects.filter(documento_principal=principal) - while anexados_iterator: - anexados_tmp = [] - for anx in anexados_iterator: - if isMateriaLegislativa: + + anexadas_temp = list(anexados_iterator) + + while anexadas_temp: + anx = anexadas_temp.pop() + if isMateriaLegislativa: + if anx.materia_anexada not in anexados_total: anexados_total.append(anx.materia_anexada) anexados_anexado = Anexada.objects.filter(materia_principal=anx.materia_anexada) - else: + anexadas_temp.extend(anexados_anexado) + else: + if anx.documento_anexado not in anexados_total: anexados_total.append(anx.documento_anexado) anexados_anexado = Anexado.objects.filter(documento_principal=anx.documento_anexado) - anexados_tmp.extend(anexados_anexado) - anexados_iterator = anexados_tmp - + anexadas_temp.extend(anexados_anexado) + if principal in anexados_total: + anexados_total.remove(principal) return anexados_total