diff --git a/requirements/test-requirements.txt b/requirements/test-requirements.txt index 5599b6d80..324856842 100644 --- a/requirements/test-requirements.txt +++ b/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 diff --git a/sapl/protocoloadm/migrations/0026_auditoriaprotocolo.py b/sapl/protocoloadm/migrations/0026_auditoriaprotocolo.py new file mode 100644 index 000000000..310a65715 --- /dev/null +++ b/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)), + ], + ), + ] diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py index e4fa79a55..3cebb3870 100644 --- a/sapl/protocoloadm/models.py +++ b/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) + ) \ No newline at end of file diff --git a/sapl/protocoloadm/urls.py b/sapl/protocoloadm/urls.py index 0fca1b76b..2e3e07ac1 100644 --- a/sapl/protocoloadm/urls.py +++ b/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 = [ diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 24e3ac080..c6141f8d4 100755 --- a/sapl/protocoloadm/views.py +++ b/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'}) \ No newline at end of file diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index e47ebe5dc..4a643cd40 100644 --- a/sapl/rules/map_rules.py +++ b/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()), + ] } diff --git a/sapl/templates/menu_tabelas_auxiliares.yaml b/sapl/templates/menu_tabelas_auxiliares.yaml index 9a9c40d8d..84dbde48a 100644 --- a/sapl/templates/menu_tabelas_auxiliares.yaml +++ b/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 \ No newline at end of file diff --git a/sapl/templates/protocoloadm/deleta_todos_protocolos.html b/sapl/templates/protocoloadm/deleta_todos_protocolos.html new file mode 100644 index 000000000..881fcc061 --- /dev/null +++ b/sapl/templates/protocoloadm/deleta_todos_protocolos.html @@ -0,0 +1,114 @@ +{% extends "base.html" %} +{% load i18n crispy_forms_tags %} + +{% block base_content %} + +
Por questões de auditoria seu login será gravado como realizador dessa ação. Deseja continuar ?
+ +