From 89af2b9dfa8698662abaa6a4f904056d09599898 Mon Sep 17 00:00:00 2001 From: Cesar Carvalho Date: Mon, 27 May 2019 10:14:35 -0300 Subject: [PATCH] Tramita anexadas como opcional --- sapl/base/forms.py | 4 +- .../migrations/0037_auto_20190527_0901.py | 25 ++++ sapl/base/models.py | 8 ++ sapl/materia/forms.py | 86 ++++++------ sapl/materia/views.py | 32 +++-- sapl/protocoloadm/forms.py | 132 +++++++++--------- sapl/protocoloadm/views.py | 38 ++--- sapl/templates/base/layouts.yaml | 3 + 8 files changed, 190 insertions(+), 138 deletions(-) create mode 100644 sapl/base/migrations/0037_auto_20190527_0901.py diff --git a/sapl/base/forms.py b/sapl/base/forms.py index a3c20064d..d78f4a5e4 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -1225,7 +1225,9 @@ class ConfiguracoesAppForm(ModelForm): 'receber_recibo_proposicao', 'assinatura_ata', 'estatisticas_acesso_normas', - 'escolher_numero_materia_proposicao'] + 'escolher_numero_materia_proposicao', + 'tramitacao_materia', + 'tramitacao_documento'] def __init__(self, *args, **kwargs): super(ConfiguracoesAppForm, self).__init__(*args, **kwargs) diff --git a/sapl/base/migrations/0037_auto_20190527_0901.py b/sapl/base/migrations/0037_auto_20190527_0901.py new file mode 100644 index 000000000..35ab87acc --- /dev/null +++ b/sapl/base/migrations/0037_auto_20190527_0901.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-05-27 12:01 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0036_auto_20190417_1432'), + ] + + operations = [ + migrations.AddField( + model_name='appconfig', + name='tramitacao_documento', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=True, verbose_name='Tramitar documentos anexados junto com os documentos principais?'), + ), + migrations.AddField( + model_name='appconfig', + name='tramitacao_materia', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=True, verbose_name='Tramitar matérias anexadas junto com as matérias principais?'), + ), + ] diff --git a/sapl/base/models.py b/sapl/base/models.py index eea9241d9..c4ce3d1a2 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -176,6 +176,14 @@ class AppConfig(models.Model): verbose_name=_('Indicar número da matéria a ser gerada na proposição?'), choices=YES_NO_CHOICES, default=False) + tramitacao_materia = models.BooleanField( + verbose_name=_('Tramitar matérias anexadas junto com as matérias principais?'), + choices=YES_NO_CHOICES, default=True) + + tramitacao_documento = models.BooleanField( + verbose_name=_('Tramitar documentos anexados junto com os documentos principais?'), + choices=YES_NO_CHOICES, default=True) + class Meta: verbose_name = _('Configurações da Aplicação') verbose_name_plural = _('Configurações da Aplicação') diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 0b8a0e451..1be97fab3 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -557,28 +557,30 @@ class TramitacaoForm(ModelForm): materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True materia.save() - lista_tramitacao = [] - lista_anexadas = lista_anexados(materia) - for ma in lista_anexadas: - if not ma.tramitacao_set.all() \ - or ma.tramitacao_set.last().unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local: - ma.em_tramitacao = False if tramitacao.status.indicador == "F" else True - ma.save() - lista_tramitacao.append(Tramitacao( - status=tramitacao.status, - materia=ma, - data_tramitacao=tramitacao.data_tramitacao, - unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, - data_encaminhamento=tramitacao.data_encaminhamento, - unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, - urgente=tramitacao.urgente, - turno=tramitacao.turno, - texto=tramitacao.texto, - data_fim_prazo=tramitacao.data_fim_prazo, - user=tramitacao.user, - ip=tramitacao.ip - )) - Tramitacao.objects.bulk_create(lista_tramitacao) + tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia') + if tramitar_anexadas: + lista_tramitacao = [] + anexadas_list = lista_anexados(materia) + for ma in anexadas_list: + if not ma.tramitacao_set.all() \ + or ma.tramitacao_set.last().unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local: + ma.em_tramitacao = False if tramitacao.status.indicador == "F" else True + ma.save() + lista_tramitacao.append(Tramitacao( + status=tramitacao.status, + materia=ma, + data_tramitacao=tramitacao.data_tramitacao, + unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, + data_encaminhamento=tramitacao.data_encaminhamento, + unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, + urgente=tramitacao.urgente, + turno=tramitacao.turno, + texto=tramitacao.texto, + data_fim_prazo=tramitacao.data_fim_prazo, + user=tramitacao.user, + ip=tramitacao.ip + )) + Tramitacao.objects.bulk_create(lista_tramitacao) return tramitacao @@ -678,25 +680,27 @@ class TramitacaoUpdateForm(TramitacaoForm): materia.em_tramitacao = False if nova_tram_principal.status.indicador == "F" else True materia.save() - lista_anexadas = lista_anexados(materia) - for ma in lista_anexadas: - tram_anexada = ma.tramitacao_set.last() - if compara_tramitacoes_mat(ant_tram_principal, tram_anexada): - tram_anexada.status = nova_tram_principal.status - tram_anexada.data_tramitacao = nova_tram_principal.data_tramitacao - tram_anexada.unidade_tramitacao_local = nova_tram_principal.unidade_tramitacao_local - tram_anexada.data_encaminhamento = nova_tram_principal.data_encaminhamento - tram_anexada.unidade_tramitacao_destino = nova_tram_principal.unidade_tramitacao_destino - tram_anexada.urgente = nova_tram_principal.urgente - tram_anexada.turno = nova_tram_principal.turno - tram_anexada.texto = nova_tram_principal.texto - tram_anexada.data_fim_prazo = nova_tram_principal.data_fim_prazo - tram_anexada.user = nova_tram_principal.user - tram_anexada.ip = nova_tram_principal.ip - tram_anexada.save() - - ma.em_tramitacao = False if nova_tram_principal.status.indicador == "F" else True - ma.save() + tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia') + if tramitar_anexadas: + anexadas_list = lista_anexados(materia) + for ma in anexadas_list: + tram_anexada = ma.tramitacao_set.last() + if compara_tramitacoes_mat(ant_tram_principal, tram_anexada): + tram_anexada.status = nova_tram_principal.status + tram_anexada.data_tramitacao = nova_tram_principal.data_tramitacao + tram_anexada.unidade_tramitacao_local = nova_tram_principal.unidade_tramitacao_local + tram_anexada.data_encaminhamento = nova_tram_principal.data_encaminhamento + tram_anexada.unidade_tramitacao_destino = nova_tram_principal.unidade_tramitacao_destino + tram_anexada.urgente = nova_tram_principal.urgente + tram_anexada.turno = nova_tram_principal.turno + tram_anexada.texto = nova_tram_principal.texto + tram_anexada.data_fim_prazo = nova_tram_principal.data_fim_prazo + tram_anexada.user = nova_tram_principal.user + tram_anexada.ip = nova_tram_principal.ip + tram_anexada.save() + + ma.em_tramitacao = False if nova_tram_principal.status.indicador == "F" else True + ma.save() return nova_tram_principal class LegislacaoCitadaForm(ModelForm): diff --git a/sapl/materia/views.py b/sapl/materia/views.py index d1d933e47..7eda72a34 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1320,14 +1320,16 @@ class TramitacaoCrud(MasterDetailCrud): if materia.tramitacao_set.count() == 0: materia.em_tramitacao = False materia.save() - mat_anexadas = lista_anexados(materia) - for ma in mat_anexadas: - tram_anexada = ma.tramitacao_set.last() - if compara_tramitacoes_mat(tram_anexada, tramitacao): - tramitacoes_deletar.append(tram_anexada.id) - if ma.tramitacao_set.count() == 0: - ma.em_tramitacao = False - ma.save() + tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia') + if tramitar_anexadas: + mat_anexadas = lista_anexados(materia) + for ma in mat_anexadas: + tram_anexada = ma.tramitacao_set.last() + if compara_tramitacoes_mat(tram_anexada, tramitacao): + tramitacoes_deletar.append(tram_anexada.id) + if ma.tramitacao_set.count() == 0: + ma.em_tramitacao = False + ma.save() Tramitacao.objects.filter(id__in=tramitacoes_deletar).delete() return HttpResponseRedirect(url) @@ -2295,12 +2297,12 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): flag_error = False materias_principais = [m for m in MateriaLegislativa.objects.filter(id__in=marcadas)] - materias_anexadas = [m.anexadas.all() for m in MateriaLegislativa.objects.filter(id__in=marcadas) if m.anexadas.all()] - materias_anexadas = list(itertools.chain.from_iterable(materias_anexadas)) - tramitacao_local = int(request.POST['unidade_tramitacao_local']) - materias_anexadas = list(filter(lambda ma : not ma.tramitacao_set.all() or \ - ma.tramitacao_set.last().unidade_tramitacao_destino.id == tramitacao_local, - materias_anexadas)) + tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia') + materias_anexadas = [] + if tramitar_anexadas: + for materia in materias_principais: + materias_anexadas = materias_anexadas + lista_anexados(materia) + materias = set(materias_principais + materias_anexadas) for materia in materias: @@ -2358,7 +2360,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): materia.em_tramitacao = True materia.save() - msg = _('Tramitação completa. ' + "Foram tramitadas " + str(len(marcadas)) + " matéria(s).") + msg = _('Tramitação completa. ' + "Foram tramitadas " + str(len(materias)) + " matéria(s).") self.logger.info('user=' + username + '. Tramitação completa.') messages.add_message(request, messages.SUCCESS, msg) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index b7c92bcc6..14073f1e4 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -752,28 +752,30 @@ class TramitacaoAdmForm(ModelForm): documento.tramitacao = False if tramitacao.status.indicador == "F" else True documento.save() - lista_tramitacao = [] - list_anexados = lista_anexados(documento, False) - for da in list_anexados: - if not da.tramitacaoadministrativo_set.all() \ - or da.tramitacaoadministrativo_set.last() \ - .unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local: - da.tramitacao = False if tramitacao.status.indicador == "F" else True - da.save() - lista_tramitacao.append(TramitacaoAdministrativo( - status=tramitacao.status, - documento=da, - data_tramitacao=tramitacao.data_tramitacao, - unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, - data_encaminhamento=tramitacao.data_encaminhamento, - unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, - urgente=tramitacao.urgente, - texto=tramitacao.texto, - data_fim_prazo=tramitacao.data_fim_prazo, - user=tramitacao.user, - ip=tramitacao.ip - )) - TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao) + tramitar_anexados = AppConfig.attr('tramitacao_documento') + if tramitar_anexados: + lista_tramitacao = [] + anexados_list = lista_anexados(documento, False) + for da in anexados_list: + if not da.tramitacaoadministrativo_set.all() \ + or da.tramitacaoadministrativo_set.last() \ + .unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local: + da.tramitacao = False if tramitacao.status.indicador == "F" else True + da.save() + lista_tramitacao.append(TramitacaoAdministrativo( + status=tramitacao.status, + documento=da, + data_tramitacao=tramitacao.data_tramitacao, + unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, + data_encaminhamento=tramitacao.data_encaminhamento, + unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, + urgente=tramitacao.urgente, + texto=tramitacao.texto, + data_fim_prazo=tramitacao.data_fim_prazo, + user=tramitacao.user, + ip=tramitacao.ip + )) + TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao) return tramitacao @@ -860,31 +862,32 @@ class TramitacaoAdmEditForm(TramitacaoAdmForm): @transaction.atomic def save(self, commit=True): - # tram_principal = super(TramitacaoAdmEditForm, self).save(commit) ant_tram_principal = TramitacaoAdministrativo.objects.get(id=self.instance.id) nova_tram_principal = super(TramitacaoAdmEditForm, self).save(commit) documento = nova_tram_principal.documento documento.tramitacao = False if nova_tram_principal.status.indicador == "F" else True documento.save() - list_anexados = lista_anexados(documento, False) - for da in list_anexados: - tram_anexada = da.tramitacaoadministrativo_set.last() - if compara_tramitacoes_doc(ant_tram_principal, tram_anexada): - tram_anexada.status = nova_tram_principal.status - tram_anexada.data_tramitacao = nova_tram_principal.data_tramitacao - tram_anexada.unidade_tramitacao_local = nova_tram_principal.unidade_tramitacao_local - tram_anexada.data_encaminhamento = nova_tram_principal.data_encaminhamento - tram_anexada.unidade_tramitacao_destino = nova_tram_principal.unidade_tramitacao_destino - tram_anexada.urgente = nova_tram_principal.urgente - tram_anexada.texto = nova_tram_principal.texto - tram_anexada.data_fim_prazo = nova_tram_principal.data_fim_prazo - tram_anexada.user = nova_tram_principal.user - tram_anexada.ip = nova_tram_principal.ip - tram_anexada.save() - - da.tramitacao = False if nova_tram_principal.status.indicador == "F" else True - da.save() + tramitar_anexados = AppConfig.attr('tramitacao_documento') + if tramitar_anexados: + anexados_list = lista_anexados(documento, False) + for da in anexados_list: + tram_anexada = da.tramitacaoadministrativo_set.last() + if compara_tramitacoes_doc(ant_tram_principal, tram_anexada): + tram_anexada.status = nova_tram_principal.status + tram_anexada.data_tramitacao = nova_tram_principal.data_tramitacao + tram_anexada.unidade_tramitacao_local = nova_tram_principal.unidade_tramitacao_local + tram_anexada.data_encaminhamento = nova_tram_principal.data_encaminhamento + tram_anexada.unidade_tramitacao_destino = nova_tram_principal.unidade_tramitacao_destino + tram_anexada.urgente = nova_tram_principal.urgente + tram_anexada.texto = nova_tram_principal.texto + tram_anexada.data_fim_prazo = nova_tram_principal.data_fim_prazo + tram_anexada.user = nova_tram_principal.user + tram_anexada.ip = nova_tram_principal.ip + tram_anexada.save() + + da.tramitacao = False if nova_tram_principal.status.indicador == "F" else True + da.save() return nova_tram_principal @@ -1581,6 +1584,7 @@ class TramitacaoEmLoteAdmForm(ModelForm): documentos = self.initial['documentos'] user = self.initial['user'] if 'user' in self.initial else None ip = self.initial['ip'] if 'ip' in self.initial else '' + tramitar_anexados = AppConfig.attr('tramitacao_documento') for doc_id in documentos: doc = DocumentoAdministrativo.objects.get(id=doc_id) tramitacao = TramitacaoAdministrativo.objects.create( @@ -1598,28 +1602,30 @@ class TramitacaoEmLoteAdmForm(ModelForm): ) doc.tramitacao = False if tramitacao.status.indicador == "F" else True doc.save() - lista_tramitacao = [] - anexados = lista_anexados(doc, False) - for da in anexados: - if not da.tramitacaoadministrativo_set.all() \ - or da.tramitacaoadministrativo_set.last() \ - .unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local: - da.tramitacao = False if tramitacao.status.indicador == "F" else True - da.save() - lista_tramitacao.append(TramitacaoAdministrativo( - status=tramitacao.status, - documento=da, - data_tramitacao=tramitacao.data_tramitacao, - unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, - data_encaminhamento=tramitacao.data_encaminhamento, - unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, - urgente=tramitacao.urgente, - texto=tramitacao.texto, - data_fim_prazo=tramitacao.data_fim_prazo, - user=tramitacao.user, - ip=tramitacao.ip - )) - TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao) + + if tramitar_anexados: + lista_tramitacao = [] + anexados = lista_anexados(doc, False) + for da in anexados: + if not da.tramitacaoadministrativo_set.all() \ + or da.tramitacaoadministrativo_set.last() \ + .unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local: + da.tramitacao = False if tramitacao.status.indicador == "F" else True + da.save() + lista_tramitacao.append(TramitacaoAdministrativo( + status=tramitacao.status, + documento=da, + data_tramitacao=tramitacao.data_tramitacao, + unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, + data_encaminhamento=tramitacao.data_encaminhamento, + unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, + urgente=tramitacao.urgente, + texto=tramitacao.texto, + data_fim_prazo=tramitacao.data_fim_prazo, + user=tramitacao.user, + ip=tramitacao.ip + )) + TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao) return tramitacao diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index dea961ca9..297d1249d 100755 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -24,7 +24,7 @@ from django_filters.views import FilterView import sapl from sapl.base.email_utils import do_envia_email_confirmacao -from sapl.base.models import Autor, CasaLegislativa +from sapl.base.models import Autor, CasaLegislativa, AppConfig from sapl.base.signals import tramitacao_signal from sapl.comissoes.models import Comissao from sapl.crud.base import (Crud, CrudAux, MasterDetailCrud, make_pagination, @@ -93,7 +93,7 @@ def doc_texto_integral(request, pk): can_see = True if not request.user.is_authenticated(): - app_config = sapl.base.models.AppConfig.objects.last() + app_config = AppConfig.objects.last() if app_config and app_config.documentos_administrativos == 'R': can_see = False @@ -315,7 +315,7 @@ class AcompanhamentoDocumentoView(CreateView): class DocumentoAdministrativoMixin: def has_permission(self): - app_config = sapl.base.models.AppConfig.objects.last() + app_config = AppConfig.objects.last() if app_config and app_config.documentos_administrativos == 'O': return True @@ -544,7 +544,7 @@ class ProtocoloDocumentoView(PermissionRequiredMixin, self.logger.debug("user=" + username + ". Tentando obter sequência de numeração.") - numeracao = sapl.base.models.AppConfig.objects.last( + numeracao = AppConfig.objects.last( ).sequencia_numeracao_protocolo if not numeracao: self.logger.error("user=" + username + ". É preciso definir a sequencia de " @@ -730,7 +730,7 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): username = self.request.user.username self.logger.debug("user=" + username + ". Tentando obter sequência de numeração.") - numeracao = sapl.base.models.AppConfig.objects.last( + numeracao = AppConfig.objects.last( ).sequencia_numeracao_protocolo if not numeracao: self.logger.error("user=" + username + ". É preciso definir a sequencia de " @@ -1257,14 +1257,16 @@ class TramitacaoAdmCrud(MasterDetailCrud): if documento.tramitacaoadministrativo_set.count() == 0: documento.tramitacao = False documento.save() - docs_anexados = lista_anexados(documento, False) - for da in docs_anexados: - tram_anexada = da.tramitacaoadministrativo_set.last() - if compara_tramitacoes_doc(tram_anexada, tramitacao): - tramitacoes_deletar.append(tram_anexada.id) - if da.tramitacaoadministrativo_set.count() == 0: - da.tramitacao = False - da.save() + tramitar_anexados = AppConfig.attr('tramitacao_documento') + if tramitar_anexados: + docs_anexados = lista_anexados(documento, False) + for da in docs_anexados: + tram_anexada = da.tramitacaoadministrativo_set.last() + if compara_tramitacoes_doc(tram_anexada, tramitacao): + tramitacoes_deletar.append(tram_anexada.id) + if da.tramitacaoadministrativo_set.count() == 0: + da.tramitacao = False + da.save() TramitacaoAdministrativo.objects.filter(id__in=tramitacoes_deletar).delete() return HttpResponseRedirect(url) @@ -1503,12 +1505,11 @@ class PrimeiraTramitacaoEmLoteAdmView(PermissionRequiredMixin, FilterView): messages.add_message(request, messages.ERROR, msg) return self.get(request, self.kwargs) - form = TramitacaoEmLoteAdmForm(request.POST, initial= - {'documentos': documentos_ids, - 'user': user, 'ip':ip}) + form = TramitacaoEmLoteAdmForm(request.POST, + initial= {'documentos': documentos_ids, + 'user': user, 'ip':ip}) if form.is_valid(): - # cd = form.clean() form.save() msg = _('Tramitação completa.') @@ -1563,6 +1564,7 @@ class TramitacaoEmLoteAdmView(PrimeiraTramitacaoEmLoteAdmView): 'documento_id').annotate(data_encaminhamento=Max( 'data_encaminhamento'), id=Max('id')).values_list('id', flat=True) + def filtra_tramitacao_status(self, status): lista = self.pega_ultima_tramitacao() @@ -1585,4 +1587,4 @@ class TramitacaoEmLoteAdmView(PrimeiraTramitacaoEmLoteAdmView): id__in=lista, status=status, unidade_tramitacao_destino=destino).distinct().values_list( - 'documento_id', flat=True) \ No newline at end of file + 'documento_id', flat=True) diff --git a/sapl/templates/base/layouts.yaml b/sapl/templates/base/layouts.yaml index 4768577b8..b3b0daca0 100644 --- a/sapl/templates/base/layouts.yaml +++ b/sapl/templates/base/layouts.yaml @@ -22,6 +22,9 @@ AppConfig: - protocolo_manual receber_recibo_proposicao - proposicao_incorporacao_obrigatoria escolher_numero_materia_proposicao + {% trans 'Tramitações' %}: + - tramitacao_materia tramitacao_documento + {% trans 'Textos Articulados' %}: - texto_articulado_proposicao texto_articulado_materia texto_articulado_norma