diff --git a/sapl/base/views.py b/sapl/base/views.py index b24dd5d37..0d11c5692 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -1198,7 +1198,7 @@ class ListarInconsistenciasView(PermissionRequiredMixin, ListView): tabela.append( ('anexadas_ciclicas', 'Matérias Anexadas cíclicas', - len(anexados_ciclicos(True)) + len(materias_anexadas_ciclicas()) ) ) tabela.append( @@ -1209,10 +1209,43 @@ class ListarInconsistenciasView(PermissionRequiredMixin, ListView): ) return tabela +def materias_anexadas_ciclicas(): + ciclos = [] + + for a in Anexada.objects.select_related('materia_principal', + 'materia_anexada', + 'materia_principal__tipo', + 'materia_anexada__tipo'): + visitados = [a.materia_principal] + anexadas = [a.materia_anexada] + while len(anexadas) > 0: + ma = anexadas.pop() + if ma not in visitados: + visitados.append(ma) + anexadas.extend([a.materia_anexada for a in Anexada.objects.filter(materia_principal=ma)]) + else: + ciclo_list = visitados + [ma] + ciclos.append(ciclo_list) + + """ + Remove ciclos repetidos (ou semanticamente equivalentes). + Exemplo: A -> B -> A e B -> A -> B + """ + ciclos_set = [] + ciclos_unique = [e for e in ciclos if is_ciclo_unique(e, ciclos_set)] + + return ciclos_unique + +def is_ciclo_unique(ciclo, ciclos_set): + if set(ciclo) not in ciclos_set: + ciclos_set.append(set(ciclo)) + return True + else: + return False def anexados_ciclicos(ofMateriaLegislativa): ciclicos = [] - + if ofMateriaLegislativa: principais = Anexada.objects.values( 'materia_principal' @@ -1299,7 +1332,7 @@ class ListarAnexadasCiclicasView(PermissionRequiredMixin, ListView): paginate_by = 10 def get_queryset(self): - return anexados_ciclicos(True) + return materias_anexadas_ciclicas() def get_context_data(self, **kwargs): context = super( diff --git a/sapl/templates/base/anexadas_ciclicas.html b/sapl/templates/base/anexadas_ciclicas.html index 9008d3428..fdd68f175 100644 --- a/sapl/templates/base/anexadas_ciclicas.html +++ b/sapl/templates/base/anexadas_ciclicas.html @@ -10,19 +10,20 @@
Matéria Fim do Ciclo | -Matéria Início do Ciclo | +Ciclo |
---|---|---|
{{ data }} | - {{ fim }} - | -- {{ inicio }} + {{ page_obj.start_index|add:forloop.counter0 }} ) + {% for ciclo in ciclos %} + {{ ciclo }} + {% if not forloop.last %} + -> + {% endif %} + {% endfor %} |