Repository: interlegis/sapl

Issue:
Funcionalidade de apagar todos protocolos.
<!--- Forneça um resumo geral da _issue_ no título acima -->

## Comportamento Esperado
<!--- Se você está descrevendo um _bug_, conte-nos o que deveria acontecer. -->
<!--- Se você está sugerindo uma mudança/melhoria, conte-nos como deve funcionar. -->
Adicionar função em tabelas auxiliares ou na parte administrativa para apagar todos os protocolos. Deixar salvo quem apagou e qual protocolos foram apagados(pelo número do protocolo).

## Comportamento Atual
<!--- Se está descrevendo um bug, conte-nos o que acontece em vez do comportamento esperado. -->
<!--- Se está sugerindo uma mudança/melhoria, explique a diferença com o comportamento atual. -->

## Possível Solução
<!--- Não é obrigatório, mas sugira uma possível correção/razão para o bug -->
<!--- ou ideias de como implementar a adição/mudança. -->

## Passos para Reproduzir (para bugs)
<!--- Forneça um link para um exemplo, ou um conjunto de passos inequívocos -->
<!--- para reproduzir esse bug. Inclua código para reproduzir, se relevante. -->
1.
2.
3.
4.

## Contexto
<!--- Como esse problema o afeta? O que você está tentando realizar? -->
<!--- Fornecer o contexto nos ajuda a encontrar uma solução que seja mais útil no mundo real -->

## Imagens do Ocorrido
<!--- Representação visual em vídeo ou imagem do ocorrido -->
<!--- Se está descrevendo um bug poste imagens ou vídeos na repordução do bug citado, caso se aplique -->

## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_):
* Nome e versão do navegador:
* Nome e versão do Sistema Operacional (desktop ou mobile):
* Link para o seu projeto (Caso de fork deste projeto):



Discussion:

Resolving patch:
diff --git a/sapl/protocoloadm/urls.py b/sapl/protocoloadm/urls.py
--- a/sapl/protocoloadm/urls.py
+++ b/sapl/protocoloadm/urls.py
@@ -24,7 +24,8 @@
                                      DesvincularMateriaView,
                                      AnexadoCrud, DocumentoAnexadoEmLoteView,
                                      PrimeiraTramitacaoEmLoteAdmView,
-                                     TramitacaoEmLoteAdmView)
+                                     TramitacaoEmLoteAdmView,
+                                     apaga_protocolos_view)
 
 from .apps import AppConfig
 
@@ -107,6 +108,10 @@
     url(r'^protocoloadm/tramitacao-em-lote', TramitacaoEmLoteAdmView.as_view(),
         name='tramitacao_em_lote_docadm'),
 
+    url(r'^protocoloadm/apaga_protocolos', apaga_protocolos_view,
+        name='apaga_protocolos_view'),
+
+
 ]
 
 urlpatterns_sistema = [
diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py
--- a/sapl/protocoloadm/views.py
+++ b/sapl/protocoloadm/views.py
@@ -22,6 +22,7 @@
 from django.views.generic.base import RedirectView, TemplateView
 from django.views.generic.edit import FormView
 from django_filters.views import FilterView
+from django.contrib.admin.views.decorators import staff_member_required
 
 import sapl
 from sapl.base.email_utils import do_envia_email_confirmacao
@@ -33,12 +34,15 @@
 from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa, UnidadeTramitacao
 from sapl.materia.views import gerar_pdf_impressos
 from sapl.parlamentares.models import Legislatura, Parlamentar
-from sapl.protocoloadm.models import Protocolo
+from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo
 from sapl.relatorios.views import relatorio_doc_administrativos
 from sapl.utils import (create_barcode, get_base_url, get_client_ip,
                         get_mime_type_from_file_extension, lista_anexados,
                         show_results_filter_set, mail_service_configured)
 
+from django.shortcuts import render
+
+
 from .forms import (AcompanhamentoDocumentoForm, AnularProtocoloAdmForm,
                     DocumentoAcessorioAdministrativoForm,
                     DocumentoAdministrativoFilterSet,
@@ -1607,3 +1611,48 @@ def filtra_tramitacao_destino_and_status(self, status, destino):
             status=status,
             unidade_tramitacao_destino=destino).distinct().values_list(
                 'documento_id', flat=True)
+
+
+def apaga_protocolos(request, ano,numero_protocolo=None):
+    kwargs = {'ano__in':ano}
+    if numero_protocolo:
+        kwargs.update({'numero__gte':numero_protocolo})
+
+    all_protocolos = Protocolo.objects.filter(**kwargs)
+
+    for doc in DocumentoAdministrativo.objects.filter(protocolo__in=all_protocolos):
+        doc.protocolo = None
+        doc.save()
+
+    for ml in MateriaLegislativa.objects.filter(ano__in=ano, numero_protocolo__in=all_protocolos.values_list('numero')):
+        ml.numero_protocolo = None
+        ml.save()
+
+    for deleted_object in all_protocolos:
+        post_delete_signal.send(sender=None,
+                                instance=deleted_object,
+                                operation='D',
+                                request=request
+                                )
+    all_protocolos.delete()
+
+
+@staff_member_required
+def apaga_protocolos_view(request):
+    if request.method == "GET":
+        if Protocolo.objects.exists():
+            intervalo_data = Protocolo.objects.all().distinct('ano').values_list('ano', flat=True).order_by('-ano')
+        else:
+            intervalo_data = None
+        return render(request,"protocoloadm/deleta_todos_protocolos.html",{'intervalo_data':intervalo_data})
+    
+    elif request.method == "POST":
+        password = request.POST.get('senha')
+        valid = request.user.check_password(password)        
+        if valid:
+            anos = request.POST.getlist('ano')
+            numero_protocolo = request.POST.get('numero_protocolo')    
+            apaga_protocolos(request,anos,numero_protocolo)
+            return JsonResponse({'type':'success','msg':''})
+        else:
+            return JsonResponse({'type':'error','msg':'Senha Incorreta'})
\ No newline at end of file


Test patch: