Repository: interlegis/sapl

Issue:
sugestão para sapl 3.2 (ou 3.1 mesmo, analisando a necessidade)
olá. Gostaria de sugerir o seguinte: já que é possível realizar a tramitação em lote de matérias, deveria ser possível também alterar ou excluir essa tramitação em lote, pois imagine a situação, em que foram tramitadas 100, 150 ou mais matérias em lote, mas que sem querer, foi selecionado o status da tramitação errado, ou foi tramitado para o lugar errado. Imagina ter que desfazer todas essas tramitações uma por uma??? Na minha opinião, isso já poderia ser estudado para ser implantado na versão 3.1 mesmo, haja visto que essa versão vai ficar por muito tempo ainda em uso. Caso isso já seja possível, por favor, me apontem onde é possível fazer. Obrigado.


Discussion:

Resolving patch:
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -32,7 +32,8 @@
                                       to_row)
 from sapl.materia.models import (AssuntoMateria, Autoria, MateriaAssunto,
                                  MateriaLegislativa, Orgao, RegimeTramitacao,
-                                 TipoDocumento, TipoProposicao)
+                                 TipoDocumento, TipoProposicao, StatusTramitacao,
+                                 UnidadeTramitacao)
 from sapl.norma.models import (LegislacaoCitada, NormaJuridica,
                                TipoNormaJuridica)
 from sapl.parlamentares.models import Legislatura
@@ -2032,3 +2033,67 @@ def __init__(self, *args, **kwargs):
                 form_actions(label='Gerar Impresso')
             )
         )
+
+
+class ExcluirTramitacaoEmLote(forms.Form):
+
+    data_tramitacao = forms.DateField(required=True,
+                             label=_('Data da Tramitação'))
+
+    unidade_tramitacao_local = forms.ModelChoiceField(label=_('Unidade Local'),
+                                  required=True,
+                                  queryset=UnidadeTramitacao.objects.all(),
+                                  empty_label='------')
+
+    unidade_tramitacao_destino = forms.ModelChoiceField(label=_('Unidade Destino'),
+                                  required=True,
+                                  queryset=UnidadeTramitacao.objects.all(),
+                                  empty_label='------')
+
+    status = forms.ModelChoiceField(label=_('Status'),
+                                  required=True,
+                                  queryset=StatusTramitacao.objects.all(),
+                                  empty_label='------')
+
+    def clean(self):
+        super(ExcluirTramitacaoEmLote, self).clean()
+
+        cleaned_data = self.cleaned_data
+
+        if not self.is_valid():
+            return cleaned_data
+
+        data_tramitacao = cleaned_data['data_tramitacao']
+        unidade_tramitacao_local = cleaned_data['unidade_tramitacao_local']
+        unidade_tramitacao_destino = cleaned_data['unidade_tramitacao_destino']
+        status = cleaned_data['status']
+
+        tramitacao_set = Tramitacao.objects.filter(data_tramitacao=data_tramitacao,
+                                                           unidade_tramitacao_local=unidade_tramitacao_local,
+                                                           unidade_tramitacao_destino=unidade_tramitacao_destino,
+                                                           status=status)
+        if not tramitacao_set.exists():
+            raise forms.ValidationError(
+                _("Não existem tramitações com os dados informados."))
+
+        return cleaned_data
+
+    def __init__(self, *args, **kwargs):
+        super(ExcluirTramitacaoEmLote, self).__init__(*args, **kwargs)
+
+        row1 = to_row(
+            [('data_tramitacao', 6),
+             ('status', 6),])
+        row2 = to_row(
+            [('unidade_tramitacao_local', 6),
+             ('unidade_tramitacao_destino', 6)])
+
+        self.helper = FormHelper()
+        self.helper.layout = Layout(
+            Fieldset(_('Dados das Tramitações'),
+                     row1,
+                     row2,
+                     HTML("&nbsp;"),
+                     form_actions(label='Excluir')
+                     )
+        )
diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py
--- a/sapl/materia/urls.py
+++ b/sapl/materia/urls.py
@@ -23,7 +23,8 @@
                                 TipoFimRelatoriaCrud, TipoMateriaCrud,
                                 TipoProposicaoCrud, TramitacaoCrud,
                                 TramitacaoEmLoteView, UnidadeTramitacaoCrud,
-                                proposicao_texto, recuperar_materia)
+                                proposicao_texto, recuperar_materia,
+                                ExcluirTramitacaoEmLoteView)
 from sapl.norma.views import NormaPesquisaSimplesView
 
 from .apps import AppConfig
@@ -90,6 +91,8 @@
         name='primeira_tramitacao_em_lote'),
     url(r'^materia/tramitacao-em-lote', TramitacaoEmLoteView.as_view(),
         name='tramitacao_em_lote'),
+    url(r'^materia/excluir-tramitacao-em-lote', ExcluirTramitacaoEmLoteView.as_view(),
+        name='excluir_tramitacao_em_lote'),
 ]
 
 
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -57,7 +57,8 @@
                     TramitacaoEmLoteFilterSet, UnidadeTramitacaoForm,
                     filtra_tramitacao_destino,
                     filtra_tramitacao_destino_and_status,
-                    filtra_tramitacao_status)
+                    filtra_tramitacao_status,
+                    ExcluirTramitacaoEmLote)
 from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria,
                      DespachoInicial, DocumentoAcessorio, MateriaAssunto,
                      MateriaLegislativa, Numeracao, Orgao, Origem, Proposicao,
@@ -1972,3 +1973,27 @@ def form_valid(self, form):
 
         return gerar_pdf_impressos(self.request, context,
                                    'materia/impressos/ficha_pdf.html')
+
+
+class ExcluirTramitacaoEmLoteView(PermissionRequiredMixin, FormView):
+
+    template_name = 'materia/em_lote/excluir_tramitacao.html'
+    permission_required = ('materia.add_tramitacao',)
+    form_class = ExcluirTramitacaoEmLote
+    form_valid_message = _('Tramitações excluídas com sucesso!')
+
+    def get_success_url(self):
+        return reverse('sapl.materia:excluir_tramitacao_em_lote')
+
+    def form_valid(self, form):
+
+        tramitacao_set = Tramitacao.objects.filter(data_tramitacao=form.cleaned_data['data_tramitacao'],
+                                                           unidade_tramitacao_local=form.cleaned_data['unidade_tramitacao_local'],
+                                                           unidade_tramitacao_destino=form.cleaned_data['unidade_tramitacao_destino'],
+                                                           status=form.cleaned_data['status'])
+        for tramitacao in tramitacao_set:
+            materia = tramitacao.materia
+            if tramitacao == materia.tramitacao_set.last():
+                tramitacao.delete()
+
+        return redirect(self.get_success_url())
\ No newline at end of file


Test patch: