Browse Source

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
pull/2960/head
ulyssesBML 6 years ago
parent
commit
2fe10a5fb2
  1. 2
      requirements/test-requirements.txt
  2. 29
      sapl/protocoloadm/migrations/0026_auditoriaprotocolo.py
  3. 9
      sapl/protocoloadm/models.py
  4. 7
      sapl/protocoloadm/urls.py
  5. 44
      sapl/protocoloadm/views.py
  6. 2
      sapl/rules/map_rules.py
  7. 3
      sapl/templates/menu_tabelas_auxiliares.yaml
  8. 114
      sapl/templates/protocoloadm/deleta_todos_protocolos.html

2
requirements/test-requirements.txt

@ -3,7 +3,7 @@ coverage==4.1
django-webtest==1.7.8
flake8==2.6.2
isort==4.2.5
model-mommy==1.2.6
model-mommy==1.6.0
pep8==1.7.0
pytest==2.9.2
pytest-cov==2.3.0

29
sapl/protocoloadm/migrations/0026_auditoriaprotocolo.py

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-10-03 18:19
from __future__ import unicode_literals
from django.conf import settings
import django.contrib.postgres.fields
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('protocoloadm', '0025_auto_20191001_1115'),
]
operations = [
migrations.CreateModel(
name='AuditoriaProtocolo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('data', models.DateTimeField(default=django.utils.timezone.now)),
('info', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=12), size=None)),
('usuario', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

9
sapl/protocoloadm/models.py

@ -1,7 +1,9 @@
from django.db import models
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User
from model_utils import Choices
from django.contrib.postgres.fields import ArrayField
import reversion
from sapl.base.models import Autor
@ -408,3 +410,10 @@ class AcompanhamentoDocumento(models.Model):
'email': self.email,
'data': str(self.data_cadastro.strftime('%d/%m/%Y'))
}
class AuditoriaProtocolo(models.Model):
usuario = models.ForeignKey(User, on_delete=models.CASCADE)
data = models.DateTimeField(default=timezone.now)
info = ArrayField(
models.CharField(max_length=12)
)

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 = [

44
sapl/protocoloadm/views.py

@ -22,6 +22,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
@ -33,12 +34,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, AuditoriaProtocolo, 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,41 @@ class TramitacaoEmLoteAdmView(PrimeiraTramitacaoEmLoteAdmView):
status=status,
unidade_tramitacao_destino=destino).distinct().values_list(
'documento_id', flat=True)
def apaga_protocolos(user, ano):
all_protocolos = Protocolo.objects.filter(ano__in=ano)
for doc in DocumentoAdministrativo.objects.filter(protocolo__in=all_protocolos):
doc.protocolo = None
doc.save()
for ml in MateriaLegislativa.objects.filter(ano__in=ano):
ml.numero_protocolo = None
ml.save()
info = [str(p.numero)+'/'+str(p.ano) for p in all_protocolos]
auditoria = AuditoriaProtocolo(usuario=user,info=info)
auditoria.save()
all_protocolos.delete()
@staff_member_required
def apaga_protocolos_view(request):
if request.method == "GET":
if Protocolo.objects.exists():
ano_minimo = Protocolo.objects.all().order_by('ano').first().ano
intervalo_data = range(ano_minimo, datetime.now().year)
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')
ano = list(map(int,request.POST.getlist('ano')))
valid = request.user.check_password(password)
if valid:
apaga_protocolos(request.user, ano)
return JsonResponse({'type':'success','msg':''})
else:
return JsonResponse({'type':'error','msg':'Senha Incorreta'})

2
sapl/rules/map_rules.py

@ -63,6 +63,8 @@ rules_group_administrativo = {
(protocoloadm.Anexado, __base__, set()),
(protocoloadm.DocumentoAcessorioAdministrativo, __base__, set()),
(protocoloadm.TramitacaoAdministrativo, __base__, set()),
(protocoloadm.AuditoriaProtocolo, __base__, set()),
]
}

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

114
sapl/templates/protocoloadm/deleta_todos_protocolos.html

@ -0,0 +1,114 @@
{% extends "base.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
<div class="card border-danger mb-3" style="">
<div class="card-header">Cuidado</div>
<div class="container">
<div class="row">
<div class="col">
</div>
<div class="col-6 ">
<div class="card-body">
<h1 class="card-title">Essa ação apagara todos os protocolos !!</h1>
<p class="card-text">Por questões de auditoria seu login será gravado como realizador dessa ação. Deseja continuar ?</p>
<button type="button" class="btn btn-danger" data-toggle="modal" data-target="#exampleModalCenter" >Sim, estou ciente e desejo continuar.</button>
</div>
</div>
<div class="col">
</div>
</div>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLongTitle">Validação</h5>
</div>
<div id="content-block-1">
{% if intervalo_data %}
<div class="modal-body">
Digite o ano dos registro a serem apagados e a sua senha para confirmar essa operação.
<div class="form-row">
<label style="margin-top:20px">Ano</label>
<select multiple id="id_ano" class="form-control">
{% for ano in intervalo_data %}
<option>{{ano}}</option>
{% endfor %}
</select>
<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 class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
<button id="apagar-protocolos" type="button" class="btn btn-danger">Apagar protocolos</button>
</div>
</div>
</div>
{% else %}
<div class="modal-body">
Não há registros de protocolos.
</div>
<div class="modal-footer">
<a href="{% url 'sapl.base:sistema' %}" class="btn btn-secondary">Voltar para tabelas auxiliares.</a>
</div>
{% endif %}
</div>
<div id="content-block-2">
<div class="modal-body">Protocolos 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>
{% endblock base_content %}
{% block extra_js %}
<script>
$('#content-block-2').hide();
$('#apagar-protocolos').click( () => {
$.ajax({
data: {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')
$('#feedback').text(data['msg'])
}
else if(data['type'] == 'success'){
$('#content-block-1').hide("", function() {
});
$('#content-block-2').show("slow");
}
},
});
})
$('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