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/tests/test_materia.py b/sapl/materia/tests/test_materia.py index 2bd8f98bc..e12b03dff 100644 --- a/sapl/materia/tests/test_materia.py +++ b/sapl/materia/tests/test_materia.py @@ -7,7 +7,7 @@ from django.db.models import Max from model_mommy import mommy import pytest -from sapl.base.models import Autor, TipoAutor +from sapl.base.models import Autor, TipoAutor, AppConfig from sapl.comissoes.models import Comissao, TipoComissao from sapl.materia.models import (Anexada, Autoria, DespachoInicial, DocumentoAcessorio, MateriaLegislativa, @@ -688,6 +688,8 @@ def test_numeracao_materia_legislativa_por_ano(admin_client): @pytest.mark.django_db(transaction=False) def test_tramitacoes_materias_anexadas(admin_client): + config = mommy.make(AppConfig, tramitacao_materia=True) + tipo_materia = mommy.make( TipoMateriaLegislativa, descricao="Tipo_Teste" @@ -858,4 +860,105 @@ def test_tramitacoes_materias_anexadas(admin_client): kwargs={'pk': tramitacao_anexada.pk}) response = admin_client.post(url, {'confirmar':'confirmar'} ,follow=True) assert Tramitacao.objects.filter(id=tramitacao_anexada.pk).count() == 0 - assert Tramitacao.objects.filter(id=tramitacao_anexada_anexada.pk).count() == 0 \ No newline at end of file + assert Tramitacao.objects.filter(id=tramitacao_anexada_anexada.pk).count() == 0 + + + # Agora testando para caso não seja desejado tramitar as matérias anexadas + # junto com as matérias principais + + assert Tramitacao.objects.all().count() == 0 + + config.tramitacao_materia = False + config.save() + + # Teste criação de Tramitacao + form = TramitacaoForm(data={}) + form.data = {'data_tramitacao':date(2019, 5, 6), + 'unidade_tramitacao_local':unidade_tramitacao_local_1.pk, + 'unidade_tramitacao_destino':unidade_tramitacao_destino_1.pk, + 'status':status.pk, + 'urgente': False, + 'texto': "Texto de teste"} + form.instance.materia_id=materia_principal.pk + + assert form.is_valid() + + tramitacao_principal = form.save() + tramitacao_anexada = materia_anexada.tramitacao_set.last() + tramitacao_anexada_anexada = materia_anexada_anexada.tramitacao_set.last() + + # Deve ser criada tramitação apenas para a matéria principal + assert materia_principal.tramitacao_set.last() == tramitacao_principal + assert not tramitacao_anexada + assert not tramitacao_anexada_anexada + + + # Criação de uma tramitação igual para a anexada à principal para testar a edição + form = TramitacaoForm(data={}) + form.data = {'data_tramitacao':date(2019, 5, 6), + 'unidade_tramitacao_local':unidade_tramitacao_local_1.pk, + 'unidade_tramitacao_destino':unidade_tramitacao_destino_1.pk, + 'status':status.pk, + 'urgente': False, + 'texto': "Texto de teste"} + form.instance.materia_id=materia_anexada.pk + + assert form.is_valid() + + tramitacao_anexada = form.save() + tramitacao_principal = materia_principal.tramitacao_set.last() + tramitacao_anexada_anexada = materia_anexada_anexada.tramitacao_set.last() + + assert materia_anexada.tramitacao_set.last() == tramitacao_anexada + assert materia_principal.tramitacao_set.all().count() == 1 + assert compara_tramitacoes_mat(tramitacao_principal, tramitacao_anexada) + assert not tramitacao_anexada_anexada + + # Teste Edição de Tramitacao + form = TramitacaoUpdateForm(data={}) + # Alterando unidade_tramitacao_destino + form.data = {'data_tramitacao':tramitacao_principal.data_tramitacao, + 'unidade_tramitacao_local':tramitacao_principal.unidade_tramitacao_local.pk, + 'unidade_tramitacao_destino':unidade_tramitacao_destino_2.pk, + 'status':tramitacao_principal.status.pk, + 'urgente': tramitacao_principal.urgente, + 'texto': tramitacao_principal.texto} + form.instance = tramitacao_principal + + assert form.is_valid() + tramitacao_principal = form.save() + tramitacao_anexada = materia_anexada.tramitacao_set.last() + tramitacao_anexada_anexada = materia_anexada_anexada.tramitacao_set.last() + + assert tramitacao_principal.unidade_tramitacao_destino == unidade_tramitacao_destino_2 + assert tramitacao_anexada.unidade_tramitacao_destino == unidade_tramitacao_destino_1 + assert not tramitacao_anexada_anexada + + # Alterando a tramitação anexada para testar a remoção de tramitações + # Alterando unidade_tramitacao_destino + form = TramitacaoUpdateForm(data={}) + form.data = {'data_tramitacao':tramitacao_principal.data_tramitacao, + 'unidade_tramitacao_local':tramitacao_principal.unidade_tramitacao_local.pk, + 'unidade_tramitacao_destino':unidade_tramitacao_destino_2.pk, + 'status':tramitacao_principal.status.pk, + 'urgente': tramitacao_principal.urgente, + 'texto': tramitacao_principal.texto} + form.instance = tramitacao_anexada + + assert form.is_valid() + tramitacao_anexada = form.save() + tramitacao_principal = materia_principal.tramitacao_set.last() + tramitacao_anexada_anexada = materia_anexada_anexada.tramitacao_set.last() + + assert tramitacao_principal.unidade_tramitacao_destino == unidade_tramitacao_destino_2 + assert tramitacao_anexada.unidade_tramitacao_destino == unidade_tramitacao_destino_2 + assert not tramitacao_anexada_anexada + assert compara_tramitacoes_mat(tramitacao_principal, tramitacao_anexada) + + # Testando a remoção + # Removendo a tramitação pricipal, as tramitações anexadas não devem ser removidas + url = reverse('sapl.materia:tramitacao_delete', + kwargs={'pk': tramitacao_principal.pk}) + response = admin_client.post(url, {'confirmar':'confirmar'} ,follow=True) + assert Tramitacao.objects.filter(id=tramitacao_principal.pk).count() == 0 + assert Tramitacao.objects.filter(id=tramitacao_anexada.pk).count() == 1 \ No newline at end of file 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 baf935dbb..71d45b7d7 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -769,28 +769,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 @@ -877,31 +879,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 @@ -1598,6 +1601,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( @@ -1615,28 +1619,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/tests/test_protocoloadm.py b/sapl/protocoloadm/tests/test_protocoloadm.py index ff7bf06d2..bd9b823dc 100644 --- a/sapl/protocoloadm/tests/test_protocoloadm.py +++ b/sapl/protocoloadm/tests/test_protocoloadm.py @@ -534,6 +534,9 @@ def make_unidade_tramitacao(descricao): @pytest.mark.django_db(transaction=False) def test_tramitacoes_documentos_anexados(admin_client): + + config = mommy.make(AppConfig, tramitacao_documento=True) + tipo_documento = mommy.make( TipoDocumentoAdministrativo, descricao="Tipo_Teste" @@ -707,6 +710,101 @@ def test_tramitacoes_documentos_anexados(admin_client): assert TramitacaoAdministrativo.objects.filter(id=tramitacao_anexada_anexada.pk).count() == 0 + # Agora testando para caso não seja desejado tramitar os documentos anexados + # junto com os documentos principais + config.tramitacao_documento = False + config.save() + + # Teste criação de Tramitacao + form = TramitacaoAdmForm(data={}) + form.data = {'data_tramitacao':date(2019, 5, 6), + 'unidade_tramitacao_local':unidade_tramitacao_local_1.pk, + 'unidade_tramitacao_destino':unidade_tramitacao_destino_1.pk, + 'status':status.pk, + 'urgente': False, + 'texto': "Texto de teste"} + form.instance.documento_id=documento_principal.pk + + assert form.is_valid() + tramitacao_principal = form.save() + tramitacao_anexada = documento_anexado.tramitacaoadministrativo_set.last() + tramitacao_anexada_anexada = documento_anexado_anexado.tramitacaoadministrativo_set.last() + + # Verifica se não foram criadas as tramitações para os documentos anexados e anexados aos anexados + assert documento_principal.tramitacaoadministrativo_set.last() == tramitacao_principal + assert tramitacao_principal.documento.tramitacao == (tramitacao_principal.status.indicador != "F") + assert not tramitacao_anexada + assert not tramitacao_anexada_anexada + + + # Cria uma tramitação igual na tramitação anexada para testar a edição + form = TramitacaoAdmForm(data={}) + form.data = {'data_tramitacao':date(2019, 5, 6), + 'unidade_tramitacao_local':unidade_tramitacao_local_1.pk, + 'unidade_tramitacao_destino':unidade_tramitacao_destino_1.pk, + 'status':status.pk, + 'urgente': False, + 'texto': "Texto de teste"} + form.instance.documento_id=documento_anexado.pk + + assert form.is_valid() + tramitacao_anexada = form.save() + tramitacao_principal = documento_principal.tramitacaoadministrativo_set.last() + tramitacao_anexada_anexada = documento_anexado_anexado.tramitacaoadministrativo_set.last() + + assert documento_principal.tramitacaoadministrativo_set.all().count() == 1 + assert documento_anexado.tramitacaoadministrativo_set.last() == tramitacao_anexada + assert not tramitacao_anexada_anexada + + form = TramitacaoAdmEditForm(data={}) + # Alterando unidade_tramitacao_destino da matéria principal, + # as anexadas não devem ser alteradas + form.data = {'data_tramitacao':tramitacao_principal.data_tramitacao, + 'unidade_tramitacao_local':tramitacao_principal.unidade_tramitacao_local.pk, + 'unidade_tramitacao_destino':unidade_tramitacao_destino_2.pk, + 'status':tramitacao_principal.status.pk, + 'urgente': tramitacao_principal.urgente, + 'texto': tramitacao_principal.texto} + form.instance = tramitacao_principal + + assert form.is_valid() + tramitacao_principal = form.save() + tramitacao_anexada = documento_anexado.tramitacaoadministrativo_set.last() + tramitacao_anexada_anexada = documento_anexado_anexado.tramitacaoadministrativo_set.last() + + assert tramitacao_principal.unidade_tramitacao_destino == unidade_tramitacao_destino_2 + assert tramitacao_anexada.unidade_tramitacao_destino == unidade_tramitacao_destino_1 + assert not tramitacao_anexada_anexada + + + form = TramitacaoAdmEditForm(data={}) + # Alterando a anexada da principal para testar a remoção de tramitação + form.data = {'data_tramitacao':tramitacao_principal.data_tramitacao, + 'unidade_tramitacao_local':tramitacao_principal.unidade_tramitacao_local.pk, + 'unidade_tramitacao_destino':unidade_tramitacao_destino_2.pk, + 'status':tramitacao_principal.status.pk, + 'urgente': tramitacao_principal.urgente, + 'texto': tramitacao_principal.texto} + form.instance = tramitacao_anexada + + assert form.is_valid() + tramitacao_anexada = form.save() + tramitacao_principal = documento_principal.tramitacaoadministrativo_set.last() + tramitacao_anexada_anexada = documento_anexado_anexado.tramitacaoadministrativo_set.last() + + assert tramitacao_principal.unidade_tramitacao_destino == unidade_tramitacao_destino_2 + assert tramitacao_anexada.unidade_tramitacao_destino == unidade_tramitacao_destino_2 + assert not tramitacao_anexada_anexada + assert compara_tramitacoes_doc(tramitacao_anexada, tramitacao_principal) + + # Removendo a tramitação principal, a tramitação anexada não deve ser removida + url = reverse('sapl.protocoloadm:tramitacaoadministrativo_delete', + kwargs={'pk': tramitacao_principal.pk}) + response = admin_client.post(url, {'confirmar':'confirmar'} ,follow=True) + assert TramitacaoAdministrativo.objects.filter(id=tramitacao_principal.pk).count() == 0 + assert TramitacaoAdministrativo.objects.filter(id=tramitacao_anexada.pk).count() == 1 + + @pytest.mark.django_db(transaction=False) def test_tramitacao_lote_documentos_form(admin_client): tipo_documento = mommy.make( @@ -812,6 +910,8 @@ def test_tramitacao_lote_documentos_form(admin_client): @pytest.mark.django_db(transaction=False) def test_tramitacao_lote_documentos_views(admin_client): + config = mommy.make(AppConfig, tramitacao_documento=True) + tipo_documento = mommy.make( TipoDocumentoAdministrativo, descricao="Tipo_Teste" @@ -1040,3 +1140,83 @@ def test_tramitacao_lote_documentos_views(admin_client): assert documento_principal.tramitacaoadministrativo_set.all().count() == 3 assert documento_anexado.tramitacaoadministrativo_set.all().count() == 3 assert documento_anexado_anexado.tramitacaoadministrativo_set.all().count() == 3 + + + # Agora testando para caso não seja desejado tramitar os documentos anexados + # junto com os documentos principais + config.tramitacao_documento = False + config.save() + + TramitacaoAdministrativo.objects.all().delete() + assert TramitacaoAdministrativo.objects.all().count() == 0 + + # Primeira tramitação em lote + # Tramitar documentos com anexados + # O documento anexado não deve tramitar junto com o prinicpal + documentos = [documento_principal.id] + + response = admin_client.post(url, + {'documentos': documentos, + 'data_tramitacao': date(2019, 5, 15), + 'unidade_tramitacao_local': unidade_tramitacao_local_1.id, + 'unidade_tramitacao_destino': unidade_tramitacao_destino_1.id, + 'status': status.id, + 'urgente': False, + 'texto': 'aaaa', + 'salvar':'salvar'}, + follow=True) + + assert response.status_code == 200 + + assert TramitacaoAdministrativo.objects.all().count() == 1 + assert documento_principal.tramitacaoadministrativo_set.all().count() == 1 + assert documento_anexado.tramitacaoadministrativo_set.all().count() == 0 + assert documento_anexado_anexado.tramitacaoadministrativo_set.all().count() == 0 + + # Tramitar o doc anexado ao principal para testar a segunda tramitação em lote + documentos = [documento_anexado.id] + + response = admin_client.post(url, + {'documentos': documentos, + 'data_tramitacao': date(2019, 5, 15), + 'unidade_tramitacao_local': unidade_tramitacao_local_1.id, + 'unidade_tramitacao_destino': unidade_tramitacao_destino_1.id, + 'status': status.id, + 'urgente': False, + 'texto': 'aaaa', + 'salvar':'salvar'}, + follow=True) + + assert response.status_code == 200 + + assert TramitacaoAdministrativo.objects.all().count() == 2 + assert documento_principal.tramitacaoadministrativo_set.all().count() == 1 + assert documento_anexado.tramitacaoadministrativo_set.all().count() == 1 + assert documento_anexado_anexado.tramitacaoadministrativo_set.all().count() == 0 + + tramitacao_principal = documento_principal.tramitacaoadministrativo_set.last() + tramitacao_anexada = documento_anexado.tramitacaoadministrativo_set.last() + assert compara_tramitacoes_doc(tramitacao_anexada, tramitacao_principal) + + documentos = [documento_principal.id] + # Segunda tramitação, o documento anexado não deve tramitar com o principal + response = admin_client.post(url_lote, + {'documentos': documentos, + 'data_tramitacao': date(2019, 5, 15), + 'unidade_tramitacao_local': unidade_tramitacao_destino_1.id, + 'unidade_tramitacao_destino': unidade_tramitacao_destino_2.id, + 'status': status.id, + 'urgente': False, + 'texto': 'aaaa', + 'salvar':'salvar'}, + follow=True) + assert response.status_code == 200 + + msgs = [m.message for m in response.context['messages']] + + assert 'Tramitação completa.' in msgs + + assert TramitacaoAdministrativo.objects.all().count() == 3 + assert documento_principal.tramitacaoadministrativo_set.all().count() == 2 + assert documento_anexado.tramitacaoadministrativo_set.all().count() == 1 + assert documento_anexado_anexado.tramitacaoadministrativo_set.all().count() == 0 \ No newline at end of file diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 1285453db..89de69c72 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, @@ -94,7 +94,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 @@ -316,7 +316,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 @@ -545,7 +545,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 " @@ -731,7 +731,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 " @@ -1258,14 +1258,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) @@ -1504,12 +1506,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.') @@ -1564,6 +1565,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() @@ -1586,4 +1588,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