Browse Source

#2805 - Tramitação de anexadas como opcional (#2810)

* Tramita anexadas como opcional

* Adiciona testes para as alterações
pull/2766/head
Cesar Augusto de Carvalho 6 years ago
committed by Edward
parent
commit
9e65baf1f6
  1. 4
      sapl/base/forms.py
  2. 25
      sapl/base/migrations/0037_auto_20190527_0901.py
  3. 8
      sapl/base/models.py
  4. 86
      sapl/materia/forms.py
  5. 107
      sapl/materia/tests/test_materia.py
  6. 32
      sapl/materia/views.py
  7. 132
      sapl/protocoloadm/forms.py
  8. 180
      sapl/protocoloadm/tests/test_protocoloadm.py
  9. 38
      sapl/protocoloadm/views.py
  10. 3
      sapl/templates/base/layouts.yaml

4
sapl/base/forms.py

@ -1225,7 +1225,9 @@ class ConfiguracoesAppForm(ModelForm):
'receber_recibo_proposicao', 'receber_recibo_proposicao',
'assinatura_ata', 'assinatura_ata',
'estatisticas_acesso_normas', 'estatisticas_acesso_normas',
'escolher_numero_materia_proposicao'] 'escolher_numero_materia_proposicao',
'tramitacao_materia',
'tramitacao_documento']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(ConfiguracoesAppForm, self).__init__(*args, **kwargs) super(ConfiguracoesAppForm, self).__init__(*args, **kwargs)

25
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?'),
),
]

8
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?'), verbose_name=_('Indicar número da matéria a ser gerada na proposição?'),
choices=YES_NO_CHOICES, default=False) 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: class Meta:
verbose_name = _('Configurações da Aplicação') verbose_name = _('Configurações da Aplicação')
verbose_name_plural = _('Configurações da Aplicação') verbose_name_plural = _('Configurações da Aplicação')

86
sapl/materia/forms.py

@ -557,28 +557,30 @@ class TramitacaoForm(ModelForm):
materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True
materia.save() materia.save()
lista_tramitacao = [] tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia')
lista_anexadas = lista_anexados(materia) if tramitar_anexadas:
for ma in lista_anexadas: lista_tramitacao = []
if not ma.tramitacao_set.all() \ anexadas_list = lista_anexados(materia)
or ma.tramitacao_set.last().unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local: for ma in anexadas_list:
ma.em_tramitacao = False if tramitacao.status.indicador == "F" else True if not ma.tramitacao_set.all() \
ma.save() or ma.tramitacao_set.last().unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local:
lista_tramitacao.append(Tramitacao( ma.em_tramitacao = False if tramitacao.status.indicador == "F" else True
status=tramitacao.status, ma.save()
materia=ma, lista_tramitacao.append(Tramitacao(
data_tramitacao=tramitacao.data_tramitacao, status=tramitacao.status,
unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, materia=ma,
data_encaminhamento=tramitacao.data_encaminhamento, data_tramitacao=tramitacao.data_tramitacao,
unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, unidade_tramitacao_local=tramitacao.unidade_tramitacao_local,
urgente=tramitacao.urgente, data_encaminhamento=tramitacao.data_encaminhamento,
turno=tramitacao.turno, unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino,
texto=tramitacao.texto, urgente=tramitacao.urgente,
data_fim_prazo=tramitacao.data_fim_prazo, turno=tramitacao.turno,
user=tramitacao.user, texto=tramitacao.texto,
ip=tramitacao.ip data_fim_prazo=tramitacao.data_fim_prazo,
)) user=tramitacao.user,
Tramitacao.objects.bulk_create(lista_tramitacao) ip=tramitacao.ip
))
Tramitacao.objects.bulk_create(lista_tramitacao)
return tramitacao return tramitacao
@ -678,25 +680,27 @@ class TramitacaoUpdateForm(TramitacaoForm):
materia.em_tramitacao = False if nova_tram_principal.status.indicador == "F" else True materia.em_tramitacao = False if nova_tram_principal.status.indicador == "F" else True
materia.save() materia.save()
lista_anexadas = lista_anexados(materia) tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia')
for ma in lista_anexadas: if tramitar_anexadas:
tram_anexada = ma.tramitacao_set.last() anexadas_list = lista_anexados(materia)
if compara_tramitacoes_mat(ant_tram_principal, tram_anexada): for ma in anexadas_list:
tram_anexada.status = nova_tram_principal.status tram_anexada = ma.tramitacao_set.last()
tram_anexada.data_tramitacao = nova_tram_principal.data_tramitacao if compara_tramitacoes_mat(ant_tram_principal, tram_anexada):
tram_anexada.unidade_tramitacao_local = nova_tram_principal.unidade_tramitacao_local tram_anexada.status = nova_tram_principal.status
tram_anexada.data_encaminhamento = nova_tram_principal.data_encaminhamento tram_anexada.data_tramitacao = nova_tram_principal.data_tramitacao
tram_anexada.unidade_tramitacao_destino = nova_tram_principal.unidade_tramitacao_destino tram_anexada.unidade_tramitacao_local = nova_tram_principal.unidade_tramitacao_local
tram_anexada.urgente = nova_tram_principal.urgente tram_anexada.data_encaminhamento = nova_tram_principal.data_encaminhamento
tram_anexada.turno = nova_tram_principal.turno tram_anexada.unidade_tramitacao_destino = nova_tram_principal.unidade_tramitacao_destino
tram_anexada.texto = nova_tram_principal.texto tram_anexada.urgente = nova_tram_principal.urgente
tram_anexada.data_fim_prazo = nova_tram_principal.data_fim_prazo tram_anexada.turno = nova_tram_principal.turno
tram_anexada.user = nova_tram_principal.user tram_anexada.texto = nova_tram_principal.texto
tram_anexada.ip = nova_tram_principal.ip tram_anexada.data_fim_prazo = nova_tram_principal.data_fim_prazo
tram_anexada.save() tram_anexada.user = nova_tram_principal.user
tram_anexada.ip = nova_tram_principal.ip
ma.em_tramitacao = False if nova_tram_principal.status.indicador == "F" else True tram_anexada.save()
ma.save()
ma.em_tramitacao = False if nova_tram_principal.status.indicador == "F" else True
ma.save()
return nova_tram_principal return nova_tram_principal
class LegislacaoCitadaForm(ModelForm): class LegislacaoCitadaForm(ModelForm):

107
sapl/materia/tests/test_materia.py

@ -7,7 +7,7 @@ from django.db.models import Max
from model_mommy import mommy from model_mommy import mommy
import pytest 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.comissoes.models import Comissao, TipoComissao
from sapl.materia.models import (Anexada, Autoria, DespachoInicial, from sapl.materia.models import (Anexada, Autoria, DespachoInicial,
DocumentoAcessorio, MateriaLegislativa, DocumentoAcessorio, MateriaLegislativa,
@ -688,6 +688,8 @@ def test_numeracao_materia_legislativa_por_ano(admin_client):
@pytest.mark.django_db(transaction=False) @pytest.mark.django_db(transaction=False)
def test_tramitacoes_materias_anexadas(admin_client): def test_tramitacoes_materias_anexadas(admin_client):
config = mommy.make(AppConfig, tramitacao_materia=True)
tipo_materia = mommy.make( tipo_materia = mommy.make(
TipoMateriaLegislativa, TipoMateriaLegislativa,
descricao="Tipo_Teste" descricao="Tipo_Teste"
@ -858,4 +860,105 @@ def test_tramitacoes_materias_anexadas(admin_client):
kwargs={'pk': tramitacao_anexada.pk}) kwargs={'pk': tramitacao_anexada.pk})
response = admin_client.post(url, {'confirmar':'confirmar'} ,follow=True) 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.pk).count() == 0
assert Tramitacao.objects.filter(id=tramitacao_anexada_anexada.pk).count() == 0 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

32
sapl/materia/views.py

@ -1320,14 +1320,16 @@ class TramitacaoCrud(MasterDetailCrud):
if materia.tramitacao_set.count() == 0: if materia.tramitacao_set.count() == 0:
materia.em_tramitacao = False materia.em_tramitacao = False
materia.save() materia.save()
mat_anexadas = lista_anexados(materia) tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia')
for ma in mat_anexadas: if tramitar_anexadas:
tram_anexada = ma.tramitacao_set.last() mat_anexadas = lista_anexados(materia)
if compara_tramitacoes_mat(tram_anexada, tramitacao): for ma in mat_anexadas:
tramitacoes_deletar.append(tram_anexada.id) tram_anexada = ma.tramitacao_set.last()
if ma.tramitacao_set.count() == 0: if compara_tramitacoes_mat(tram_anexada, tramitacao):
ma.em_tramitacao = False tramitacoes_deletar.append(tram_anexada.id)
ma.save() if ma.tramitacao_set.count() == 0:
ma.em_tramitacao = False
ma.save()
Tramitacao.objects.filter(id__in=tramitacoes_deletar).delete() Tramitacao.objects.filter(id__in=tramitacoes_deletar).delete()
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@ -2295,12 +2297,12 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView):
flag_error = False flag_error = False
materias_principais = [m for m in MateriaLegislativa.objects.filter(id__in=marcadas)] 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()] tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia')
materias_anexadas = list(itertools.chain.from_iterable(materias_anexadas)) materias_anexadas = []
tramitacao_local = int(request.POST['unidade_tramitacao_local']) if tramitar_anexadas:
materias_anexadas = list(filter(lambda ma : not ma.tramitacao_set.all() or \ for materia in materias_principais:
ma.tramitacao_set.last().unidade_tramitacao_destino.id == tramitacao_local, materias_anexadas = materias_anexadas + lista_anexados(materia)
materias_anexadas))
materias = set(materias_principais + materias_anexadas) materias = set(materias_principais + materias_anexadas)
for materia in materias: for materia in materias:
@ -2358,7 +2360,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView):
materia.em_tramitacao = True materia.em_tramitacao = True
materia.save() 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.') self.logger.info('user=' + username + '. Tramitação completa.')
messages.add_message(request, messages.SUCCESS, msg) messages.add_message(request, messages.SUCCESS, msg)

132
sapl/protocoloadm/forms.py

@ -769,28 +769,30 @@ class TramitacaoAdmForm(ModelForm):
documento.tramitacao = False if tramitacao.status.indicador == "F" else True documento.tramitacao = False if tramitacao.status.indicador == "F" else True
documento.save() documento.save()
lista_tramitacao = [] tramitar_anexados = AppConfig.attr('tramitacao_documento')
list_anexados = lista_anexados(documento, False) if tramitar_anexados:
for da in list_anexados: lista_tramitacao = []
if not da.tramitacaoadministrativo_set.all() \ anexados_list = lista_anexados(documento, False)
or da.tramitacaoadministrativo_set.last() \ for da in anexados_list:
.unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local: if not da.tramitacaoadministrativo_set.all() \
da.tramitacao = False if tramitacao.status.indicador == "F" else True or da.tramitacaoadministrativo_set.last() \
da.save() .unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local:
lista_tramitacao.append(TramitacaoAdministrativo( da.tramitacao = False if tramitacao.status.indicador == "F" else True
status=tramitacao.status, da.save()
documento=da, lista_tramitacao.append(TramitacaoAdministrativo(
data_tramitacao=tramitacao.data_tramitacao, status=tramitacao.status,
unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, documento=da,
data_encaminhamento=tramitacao.data_encaminhamento, data_tramitacao=tramitacao.data_tramitacao,
unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, unidade_tramitacao_local=tramitacao.unidade_tramitacao_local,
urgente=tramitacao.urgente, data_encaminhamento=tramitacao.data_encaminhamento,
texto=tramitacao.texto, unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino,
data_fim_prazo=tramitacao.data_fim_prazo, urgente=tramitacao.urgente,
user=tramitacao.user, texto=tramitacao.texto,
ip=tramitacao.ip data_fim_prazo=tramitacao.data_fim_prazo,
)) user=tramitacao.user,
TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao) ip=tramitacao.ip
))
TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao)
return tramitacao return tramitacao
@ -877,31 +879,32 @@ class TramitacaoAdmEditForm(TramitacaoAdmForm):
@transaction.atomic @transaction.atomic
def save(self, commit=True): def save(self, commit=True):
# tram_principal = super(TramitacaoAdmEditForm, self).save(commit)
ant_tram_principal = TramitacaoAdministrativo.objects.get(id=self.instance.id) ant_tram_principal = TramitacaoAdministrativo.objects.get(id=self.instance.id)
nova_tram_principal = super(TramitacaoAdmEditForm, self).save(commit) nova_tram_principal = super(TramitacaoAdmEditForm, self).save(commit)
documento = nova_tram_principal.documento documento = nova_tram_principal.documento
documento.tramitacao = False if nova_tram_principal.status.indicador == "F" else True documento.tramitacao = False if nova_tram_principal.status.indicador == "F" else True
documento.save() documento.save()
list_anexados = lista_anexados(documento, False) tramitar_anexados = AppConfig.attr('tramitacao_documento')
for da in list_anexados: if tramitar_anexados:
tram_anexada = da.tramitacaoadministrativo_set.last() anexados_list = lista_anexados(documento, False)
if compara_tramitacoes_doc(ant_tram_principal, tram_anexada): for da in anexados_list:
tram_anexada.status = nova_tram_principal.status tram_anexada = da.tramitacaoadministrativo_set.last()
tram_anexada.data_tramitacao = nova_tram_principal.data_tramitacao if compara_tramitacoes_doc(ant_tram_principal, tram_anexada):
tram_anexada.unidade_tramitacao_local = nova_tram_principal.unidade_tramitacao_local tram_anexada.status = nova_tram_principal.status
tram_anexada.data_encaminhamento = nova_tram_principal.data_encaminhamento tram_anexada.data_tramitacao = nova_tram_principal.data_tramitacao
tram_anexada.unidade_tramitacao_destino = nova_tram_principal.unidade_tramitacao_destino tram_anexada.unidade_tramitacao_local = nova_tram_principal.unidade_tramitacao_local
tram_anexada.urgente = nova_tram_principal.urgente tram_anexada.data_encaminhamento = nova_tram_principal.data_encaminhamento
tram_anexada.texto = nova_tram_principal.texto tram_anexada.unidade_tramitacao_destino = nova_tram_principal.unidade_tramitacao_destino
tram_anexada.data_fim_prazo = nova_tram_principal.data_fim_prazo tram_anexada.urgente = nova_tram_principal.urgente
tram_anexada.user = nova_tram_principal.user tram_anexada.texto = nova_tram_principal.texto
tram_anexada.ip = nova_tram_principal.ip tram_anexada.data_fim_prazo = nova_tram_principal.data_fim_prazo
tram_anexada.save() tram_anexada.user = nova_tram_principal.user
tram_anexada.ip = nova_tram_principal.ip
da.tramitacao = False if nova_tram_principal.status.indicador == "F" else True tram_anexada.save()
da.save()
da.tramitacao = False if nova_tram_principal.status.indicador == "F" else True
da.save()
return nova_tram_principal return nova_tram_principal
@ -1598,6 +1601,7 @@ class TramitacaoEmLoteAdmForm(ModelForm):
documentos = self.initial['documentos'] documentos = self.initial['documentos']
user = self.initial['user'] if 'user' in self.initial else None user = self.initial['user'] if 'user' in self.initial else None
ip = self.initial['ip'] if 'ip' in self.initial else '' ip = self.initial['ip'] if 'ip' in self.initial else ''
tramitar_anexados = AppConfig.attr('tramitacao_documento')
for doc_id in documentos: for doc_id in documentos:
doc = DocumentoAdministrativo.objects.get(id=doc_id) doc = DocumentoAdministrativo.objects.get(id=doc_id)
tramitacao = TramitacaoAdministrativo.objects.create( tramitacao = TramitacaoAdministrativo.objects.create(
@ -1615,28 +1619,30 @@ class TramitacaoEmLoteAdmForm(ModelForm):
) )
doc.tramitacao = False if tramitacao.status.indicador == "F" else True doc.tramitacao = False if tramitacao.status.indicador == "F" else True
doc.save() doc.save()
lista_tramitacao = []
anexados = lista_anexados(doc, False) if tramitar_anexados:
for da in anexados: lista_tramitacao = []
if not da.tramitacaoadministrativo_set.all() \ anexados = lista_anexados(doc, False)
or da.tramitacaoadministrativo_set.last() \ for da in anexados:
.unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local: if not da.tramitacaoadministrativo_set.all() \
da.tramitacao = False if tramitacao.status.indicador == "F" else True or da.tramitacaoadministrativo_set.last() \
da.save() .unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local:
lista_tramitacao.append(TramitacaoAdministrativo( da.tramitacao = False if tramitacao.status.indicador == "F" else True
status=tramitacao.status, da.save()
documento=da, lista_tramitacao.append(TramitacaoAdministrativo(
data_tramitacao=tramitacao.data_tramitacao, status=tramitacao.status,
unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, documento=da,
data_encaminhamento=tramitacao.data_encaminhamento, data_tramitacao=tramitacao.data_tramitacao,
unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, unidade_tramitacao_local=tramitacao.unidade_tramitacao_local,
urgente=tramitacao.urgente, data_encaminhamento=tramitacao.data_encaminhamento,
texto=tramitacao.texto, unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino,
data_fim_prazo=tramitacao.data_fim_prazo, urgente=tramitacao.urgente,
user=tramitacao.user, texto=tramitacao.texto,
ip=tramitacao.ip data_fim_prazo=tramitacao.data_fim_prazo,
)) user=tramitacao.user,
TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao) ip=tramitacao.ip
))
TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao)
return tramitacao return tramitacao

180
sapl/protocoloadm/tests/test_protocoloadm.py

@ -534,6 +534,9 @@ def make_unidade_tramitacao(descricao):
@pytest.mark.django_db(transaction=False) @pytest.mark.django_db(transaction=False)
def test_tramitacoes_documentos_anexados(admin_client): def test_tramitacoes_documentos_anexados(admin_client):
config = mommy.make(AppConfig, tramitacao_documento=True)
tipo_documento = mommy.make( tipo_documento = mommy.make(
TipoDocumentoAdministrativo, TipoDocumentoAdministrativo,
descricao="Tipo_Teste" 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 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) @pytest.mark.django_db(transaction=False)
def test_tramitacao_lote_documentos_form(admin_client): def test_tramitacao_lote_documentos_form(admin_client):
tipo_documento = mommy.make( tipo_documento = mommy.make(
@ -812,6 +910,8 @@ def test_tramitacao_lote_documentos_form(admin_client):
@pytest.mark.django_db(transaction=False) @pytest.mark.django_db(transaction=False)
def test_tramitacao_lote_documentos_views(admin_client): def test_tramitacao_lote_documentos_views(admin_client):
config = mommy.make(AppConfig, tramitacao_documento=True)
tipo_documento = mommy.make( tipo_documento = mommy.make(
TipoDocumentoAdministrativo, TipoDocumentoAdministrativo,
descricao="Tipo_Teste" 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_principal.tramitacaoadministrativo_set.all().count() == 3
assert documento_anexado.tramitacaoadministrativo_set.all().count() == 3 assert documento_anexado.tramitacaoadministrativo_set.all().count() == 3
assert documento_anexado_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

38
sapl/protocoloadm/views.py

@ -24,7 +24,7 @@ from django_filters.views import FilterView
import sapl import sapl
from sapl.base.email_utils import do_envia_email_confirmacao 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.base.signals import tramitacao_signal
from sapl.comissoes.models import Comissao from sapl.comissoes.models import Comissao
from sapl.crud.base import (Crud, CrudAux, MasterDetailCrud, make_pagination, from sapl.crud.base import (Crud, CrudAux, MasterDetailCrud, make_pagination,
@ -94,7 +94,7 @@ def doc_texto_integral(request, pk):
can_see = True can_see = True
if not request.user.is_authenticated(): 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': if app_config and app_config.documentos_administrativos == 'R':
can_see = False can_see = False
@ -316,7 +316,7 @@ class AcompanhamentoDocumentoView(CreateView):
class DocumentoAdministrativoMixin: class DocumentoAdministrativoMixin:
def has_permission(self): 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': if app_config and app_config.documentos_administrativos == 'O':
return True return True
@ -545,7 +545,7 @@ class ProtocoloDocumentoView(PermissionRequiredMixin,
self.logger.debug("user=" + username + self.logger.debug("user=" + username +
". Tentando obter sequência de numeração.") ". Tentando obter sequência de numeração.")
numeracao = sapl.base.models.AppConfig.objects.last( numeracao = AppConfig.objects.last(
).sequencia_numeracao_protocolo ).sequencia_numeracao_protocolo
if not numeracao: if not numeracao:
self.logger.error("user=" + username + ". É preciso definir a sequencia de " self.logger.error("user=" + username + ". É preciso definir a sequencia de "
@ -731,7 +731,7 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView):
username = self.request.user.username username = self.request.user.username
self.logger.debug("user=" + username + self.logger.debug("user=" + username +
". Tentando obter sequência de numeração.") ". Tentando obter sequência de numeração.")
numeracao = sapl.base.models.AppConfig.objects.last( numeracao = AppConfig.objects.last(
).sequencia_numeracao_protocolo ).sequencia_numeracao_protocolo
if not numeracao: if not numeracao:
self.logger.error("user=" + username + ". É preciso definir a sequencia de " self.logger.error("user=" + username + ". É preciso definir a sequencia de "
@ -1258,14 +1258,16 @@ class TramitacaoAdmCrud(MasterDetailCrud):
if documento.tramitacaoadministrativo_set.count() == 0: if documento.tramitacaoadministrativo_set.count() == 0:
documento.tramitacao = False documento.tramitacao = False
documento.save() documento.save()
docs_anexados = lista_anexados(documento, False) tramitar_anexados = AppConfig.attr('tramitacao_documento')
for da in docs_anexados: if tramitar_anexados:
tram_anexada = da.tramitacaoadministrativo_set.last() docs_anexados = lista_anexados(documento, False)
if compara_tramitacoes_doc(tram_anexada, tramitacao): for da in docs_anexados:
tramitacoes_deletar.append(tram_anexada.id) tram_anexada = da.tramitacaoadministrativo_set.last()
if da.tramitacaoadministrativo_set.count() == 0: if compara_tramitacoes_doc(tram_anexada, tramitacao):
da.tramitacao = False tramitacoes_deletar.append(tram_anexada.id)
da.save() if da.tramitacaoadministrativo_set.count() == 0:
da.tramitacao = False
da.save()
TramitacaoAdministrativo.objects.filter(id__in=tramitacoes_deletar).delete() TramitacaoAdministrativo.objects.filter(id__in=tramitacoes_deletar).delete()
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@ -1504,12 +1506,11 @@ class PrimeiraTramitacaoEmLoteAdmView(PermissionRequiredMixin, FilterView):
messages.add_message(request, messages.ERROR, msg) messages.add_message(request, messages.ERROR, msg)
return self.get(request, self.kwargs) return self.get(request, self.kwargs)
form = TramitacaoEmLoteAdmForm(request.POST, initial= form = TramitacaoEmLoteAdmForm(request.POST,
{'documentos': documentos_ids, initial= {'documentos': documentos_ids,
'user': user, 'ip':ip}) 'user': user, 'ip':ip})
if form.is_valid(): if form.is_valid():
# cd = form.clean()
form.save() form.save()
msg = _('Tramitação completa.') msg = _('Tramitação completa.')
@ -1564,6 +1565,7 @@ class TramitacaoEmLoteAdmView(PrimeiraTramitacaoEmLoteAdmView):
'documento_id').annotate(data_encaminhamento=Max( 'documento_id').annotate(data_encaminhamento=Max(
'data_encaminhamento'), 'data_encaminhamento'),
id=Max('id')).values_list('id', flat=True) id=Max('id')).values_list('id', flat=True)
def filtra_tramitacao_status(self, status): def filtra_tramitacao_status(self, status):
lista = self.pega_ultima_tramitacao() lista = self.pega_ultima_tramitacao()
@ -1586,4 +1588,4 @@ class TramitacaoEmLoteAdmView(PrimeiraTramitacaoEmLoteAdmView):
id__in=lista, id__in=lista,
status=status, status=status,
unidade_tramitacao_destino=destino).distinct().values_list( unidade_tramitacao_destino=destino).distinct().values_list(
'documento_id', flat=True) 'documento_id', flat=True)

3
sapl/templates/base/layouts.yaml

@ -22,6 +22,9 @@ AppConfig:
- protocolo_manual receber_recibo_proposicao - protocolo_manual receber_recibo_proposicao
- proposicao_incorporacao_obrigatoria escolher_numero_materia_proposicao - proposicao_incorporacao_obrigatoria escolher_numero_materia_proposicao
{% trans 'Tramitações' %}:
- tramitacao_materia tramitacao_documento
{% trans 'Textos Articulados' %}: {% trans 'Textos Articulados' %}:
- texto_articulado_proposicao texto_articulado_materia texto_articulado_norma - texto_articulado_proposicao texto_articulado_materia texto_articulado_norma

Loading…
Cancel
Save