From 9b290f4d807512501dcd62535670075ef3a0ed6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rodrigues?= Date: Fri, 12 Apr 2019 07:48:13 -0300 Subject: [PATCH] =?UTF-8?q?Evita=20anexos=20de=20mat=C3=A9rias=20em=20cicl?= =?UTF-8?q?o=20(#2670)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Evitar anexo ciclico - Anexada * Evitar anexo cíclico - Anexada em Lote * Evitar anexo ciclico - Anexada * Evitar anexo cíclico - Anexada em Lote * Atualizar materia/forms.py * Atualizar sapl/materia/views.py * Atualizar migrations --- sapl/materia/forms.py | 20 +++++++++++ sapl/materia/views.py | 34 +++++++++++++++++-- .../migrations/0036_auto_20190409_1334.py | 21 ++++++++++++ sapl/templates/materia/em_lote/anexada.html | 6 ++-- 4 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 sapl/sessao/migrations/0036_auto_20190409_1334.py diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index edbeed810..f662c0fec 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -817,6 +817,26 @@ class AnexadaForm(ModelForm): if is_anexada: self.logger.error("Matéria já se encontra anexada.") raise ValidationError(_('Matéria já se encontra anexada')) + + ciclico = False + anexadas_anexada = Anexada.objects.filter(materia_principal=materia_anexada) + + while anexadas_anexada and not ciclico: + anexadas = [] + + for anexa in anexadas_anexada: + + if materia_principal == anexa.materia_anexada: + ciclico = True + else: + for a in Anexada.objects.filter(materia_principal=anexa.materia_anexada): + anexadas.append(a) + + anexadas_anexada = anexadas + + if ciclico: + self.logger.error("A matéria não pode ser anexada por uma de suas anexadas.") + raise ValidationError(_("A matéria não pode ser anexada por uma de suas anexadas.")) cleaned_data['materia_anexada'] = materia_anexada diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 8d7278e5f..aae53ddac 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -2070,11 +2070,39 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): qr = self.request.GET.copy() context['object_list'] = context['object_list'].order_by( - 'ano', 'numero') + 'numero', '-ano') principal = MateriaLegislativa.objects.get(pk=self.kwargs['pk']) not_list = [self.kwargs['pk']] + \ [m for m in principal.materia_principal_set.all().values_list('materia_anexada_id', flat=True)] context['object_list'] = context['object_list'].exclude(pk__in=not_list) + + context['temp_object_list'] = context['object_list'] + context['object_list'] = [] + for obj in context['temp_object_list']: + materia_anexada = obj + ciclico = False + anexadas_anexada = Anexada.objects.filter( + materia_principal = materia_anexada + ) + + while anexadas_anexada and not ciclico: + anexadas = [] + + for anexa in anexadas_anexada: + + if principal == anexa.materia_anexada: + ciclico = True + else: + for a in Anexada.objects.filter(materia_principal=anexa.materia_anexada): + anexadas.append(a) + + anexadas_anexada = anexadas + + if not ciclico: + context['object_list'].append(obj) + + context['numero_res'] = len(context['object_list']) + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' context['show_results'] = show_results_filter_set(qr) @@ -2110,7 +2138,9 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): msg = _('Materia(s) anexada(s).') messages.add_message(request, messages.SUCCESS, msg) - return self.get(request, self.kwargs) + + sucess_url = reverse('sapl_index') + 'materia/' + kwargs['pk'] + '/anexada' + return HttpResponseRedirect(sucess_url) class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): diff --git a/sapl/sessao/migrations/0036_auto_20190409_1334.py b/sapl/sessao/migrations/0036_auto_20190409_1334.py new file mode 100644 index 000000000..81ffca6b1 --- /dev/null +++ b/sapl/sessao/migrations/0036_auto_20190409_1334.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-04-09 16:34 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0035_resumoordenacao_decimo_quarto'), + ] + + operations = [ + migrations.AlterField( + model_name='expedientesessao', + name='sessao_plenaria', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='expedientesessao_set', to='sessao.SessaoPlenaria'), + ), + ] diff --git a/sapl/templates/materia/em_lote/anexada.html b/sapl/templates/materia/em_lote/anexada.html index 76a154ec6..2b1c22c56 100644 --- a/sapl/templates/materia/em_lote/anexada.html +++ b/sapl/templates/materia/em_lote/anexada.html @@ -8,11 +8,11 @@ {% endif %} {% if show_results %} - {% if object_list.count > 0 %} - {% if object_list.count == 1 %} + {% if numero_res > 0 %} + {% if numero_res == 1 %}

{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}

{% else %} -

{% blocktrans with object_list.count as total_materias %}Foram encontradas {{total_materias}} matérias.{% endblocktrans %}

+

Foram encontradas {{ numero_res }} matérias.

{% endif %}
{% csrf_token %}