Browse Source

Adicionando função de apagar todos os protocolos (#2960)

* Adicionando função de apagar todos os protocolos

Melhorando usabilidade

Colocando privilegios de admin para acessar função de apagar protocolos Fix #2958

Filtrando anos a serem apagados #Fix 2958

Atualizando django mommy para aceitar ArrayField

* Resolvendo problemas relatados no pr

* Mudando sistema de auditoria de protocolos para o já existente

* Removendo codigo desnecessario

* Melhorando querys

* Update sapl/templates/protocoloadm/deleta_todos_protocolos.html

Co-authored-by: Edward <9326037+edwardoliveira@users.noreply.github.com>
pull/3169/head
Ulysses Lara 5 years ago
committed by GitHub
parent
commit
b40ecbda70
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      sapl/protocoloadm/urls.py
  2. 51
      sapl/protocoloadm/views.py
  3. 3
      sapl/templates/menu_tabelas_auxiliares.yaml
  4. 127
      sapl/templates/protocoloadm/deleta_todos_protocolos.html

7
sapl/protocoloadm/urls.py

@ -24,7 +24,8 @@ from sapl.protocoloadm.views import (AcompanhamentoDocumentoView,
DesvincularMateriaView,
AnexadoCrud, DocumentoAnexadoEmLoteView,
PrimeiraTramitacaoEmLoteAdmView,
TramitacaoEmLoteAdmView)
TramitacaoEmLoteAdmView,
apaga_protocolos_view)
from .apps import AppConfig
@ -107,6 +108,10 @@ urlpatterns_protocolo = [
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 = [

51
sapl/protocoloadm/views.py

@ -23,6 +23,7 @@ from django.views.generic import ListView, CreateView, UpdateView
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
@ -34,12 +35,15 @@ from sapl.crud.base import (Crud, CrudAux, MasterDetailCrud, make_pagination,
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_date_to_datetime_utc)
from django.shortcuts import render
from .forms import (AcompanhamentoDocumentoForm, AnularProtocoloAdmForm,
DocumentoAcessorioAdministrativoForm,
DocumentoAdministrativoFilterSet,
@ -1731,3 +1735,48 @@ class TramitacaoEmLoteAdmView(PrimeiraTramitacaoEmLoteAdmView):
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'})

3
sapl/templates/menu_tabelas_auxiliares.yaml

@ -185,3 +185,6 @@
- title: {% trans 'Status de Tramitação' %}
url: sapl.protocoloadm:statustramitacaoadministrativo_list
css_class: btn btn-link
- title: {% trans 'Apagar Todos Protocolos' %}
url: sapl.protocoloadm:apaga_protocolos_view
css_class: btn btn-link

127
sapl/templates/protocoloadm/deleta_todos_protocolos.html

@ -0,0 +1,127 @@
{% extends "base.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
{% if intervalo_data %}
<h2 class="page-header">Selecione o ano dos registros a serem apagados e confirme com a sua senha.</h2>
<div class="form-row">
<label style="margin-top:20px">Ano</label>
<select id="id_ano" class="form-control">
{% for ano in intervalo_data %}
<option>{{ano}}</option>
{% endfor %}
</select>
<label style="margin-top:20px">A partir do numero: (Opcional)</label>
<input type="number" class="form-control" id="numero_protocolo">
<label style="margin-top:20px">Senha</label>
<input type="password" class="form-control" id="password" placeholder="Senha" required>
<div id="feedback" class="invalid-feedback"></div>
</div>
<div style="margin-top:20px" class="form-group row justify-content-between">
<a href="{% url 'sapl.base:sistema' %}" type="button" class="btn btn-secondary float-left" >Cancelar</a>
<button type="button" data-toggle="modal" data-target="#exampleModal" class="btn btn-danger float-right">Apagar protocolos</button>
</div>
{% else %}
<h1>Não há registros de protocolos.</h1>
<a style="margin-top:5%" href="{% url 'sapl.base:sistema' %}" type="button" class="btn btn-secondary" >Voltar para tabelas auxiliares.</a>
{% endif %}
<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div id="content-block-1">
<div class="modal-header bg-danger ">
<h5 class="modal-title" id="exampleModalLabel">ALERTA</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
Tem certeza que deseja apagar esses protocolos ? Essa operação é <b>irreversível</b>.
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
<button type="button" class="btn btn-danger" id="apagar-protocolos">Apagar</button>
<div id="spinner-id" style="margin-left:20px" class="spinner-border text-danger" role="status">
<span class="sr-only">Loading...</span>
</div>
</div>
</div>
<div id="content-block-2">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Operação realizada com sucesso.</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
Os protocolos foram apagados com sucesso.
</div>
<div class="modal-footer">
<a href="{% url 'sapl.base:sistema' %}" class="btn btn-secondary">Voltar para tabelas auxiliares.</a>
</div>
</div>
</div>
</div>
</div>
{% endblock base_content %}
{% block extra_js %}
<script>
$('#content-block-2').hide();
$('#spinner-id').hide();
$('#apagar-protocolos').click( () => {
$('#spinner-id').show();
$.ajax({
data: {numero_protocolo:$('#numero_protocolo').val(),senha:$('#password').val(),ano:$("#id_ano").val()},
type: 'POST',
url: "{% url 'sapl.protocoloadm:apaga_protocolos_view' %}",
traditional: true,
headers: {
'X-CSRFToken': getCookie('csrftoken')
},
success: function(data){
if (data['type'] == 'error'){
$('#password').addClass('is-invalid')
$('#exampleModal').modal('hide')
$('#feedback').text(data['msg'])
}
else if(data['type'] == 'success'){
$('#content-block-1').hide("", function() {
});
$('#content-block-2').show("slow");
}
$('#spinner-id').hide();
},
});
})
$('option').mousedown(function(e) {
e.preventDefault();
var originalScrollTop = $(this).parent().scrollTop();
$(this).prop('selected', $(this).prop('selected') ? false : true);
var self = this;
$(this).parent().focus();
setTimeout(function() {
$(self).parent().scrollTop(originalScrollTop);
}, 0);
return false;
});
</script>
{% endblock extra_js%}
Loading…
Cancel
Save