Sistema de Apoio ao Processo Legislativo
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

1195 lines
48 KiB

from datetime import date, timedelta
from django.urls import reverse
from django.utils import timezone
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
from model_bakery import baker
from urllib.parse import urlencode
import pytest
from sapl.base.models import AppConfig
from sapl.comissoes.models import Comissao, TipoComissao
from sapl.materia.models import UnidadeTramitacao
from sapl.protocoloadm.forms import (AnularProtocoloAdmForm,
DocumentoAdministrativoForm,
MateriaLegislativa, ProtocoloDocumentoForm,
ProtocoloMateriaForm, TramitacaoAdmForm,
TramitacaoAdmEditForm,
compara_tramitacoes_doc,
TramitacaoEmLoteAdmForm)
from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo,
StatusTramitacaoAdministrativo,
TipoDocumentoAdministrativo,
TipoMateriaLegislativa, Anexado,
TramitacaoAdministrativo)
from sapl.utils import lista_anexados
@pytest.mark.django_db(transaction=False)
def test_anular_protocolo_acessivel(admin_client):
response = admin_client.get(reverse('sapl.protocoloadm:anular_protocolo'))
assert response.status_code == 200
@pytest.mark.django_db(transaction=False)
def test_anular_protocolo_submit(admin_client):
baker.make(Protocolo, numero='76', ano='2016', anulado=False)
# TODO: setar usuario e IP
response = admin_client.post(reverse('sapl.protocoloadm:anular_protocolo'),
{'numero': '76',
'ano': '2016',
'justificativa_anulacao': 'TESTE',
'salvar': 'Anular'},
follow=True)
assert response.status_code == 200
protocolo = Protocolo.objects.first()
assert protocolo.numero == 76
assert protocolo.ano == 2016
if not protocolo.anulado:
pytest.fail(_("Protocolo deveria estar anulado"))
assert protocolo.justificativa_anulacao == 'TESTE'
@pytest.mark.django_db(transaction=False)
def test_form_anular_protocolo_inexistente():
form = AnularProtocoloAdmForm({'numero': '1',
'ano': '2016',
'justificativa_anulacao': 'TESTE'})
# Não usa o assert form.is_valid() == False por causa do PEP8
if form.is_valid():
pytest.fail(_("Form deve ser inválido"))
assert form.errors['__all__'] == [_("Protocolo 1/2016 não existe")]
@pytest.mark.django_db(transaction=False)
def test_form_anular_protocolo_valido():
baker.make(Protocolo, numero='1', ano='2016', anulado=False)
form = AnularProtocoloAdmForm({'numero': '1',
'ano': '2016',
'justificativa_anulacao': 'TESTE'})
if not form.is_valid():
pytest.fail(_("Form deve ser válido"))
@pytest.mark.django_db(transaction=False)
def test_form_anular_protocolo_anulado():
baker.make(Protocolo, numero='1', ano='2016', anulado=True)
form = AnularProtocoloAdmForm({'numero': '1',
'ano': '2016',
'justificativa_anulacao': 'TESTE'})
assert form.errors['__all__'] == \
[_("Protocolo 1/2016 já encontra-se anulado")]
@pytest.mark.django_db(transaction=False)
def test_form_anular_protocolo_campos_obrigatorios():
baker.make(Protocolo, numero='1', ano='2016', anulado=False)
# TODO: generalizar para diminuir o tamanho deste método
# numero ausente
form = AnularProtocoloAdmForm({'numero': '',
'ano': '2016',
'justificativa_anulacao': 'TESTE'})
if form.is_valid():
pytest.fail(_("Form deve ser inválido"))
assert len(form.errors) == 1
assert form.errors['numero'] == [_('Este campo é obrigatório.')]
# ano ausente
form = AnularProtocoloAdmForm({'numero': '1',
'ano': '',
'justificativa_anulacao': 'TESTE'})
if form.is_valid():
pytest.fail(_("Form deve ser inválido"))
assert len(form.errors) == 1
assert form.errors['ano'] == [_('Este campo é obrigatório.')]
# justificativa_anulacao ausente
form = AnularProtocoloAdmForm({'numero': '1',
'ano': '2016',
'justificativa_anulacao': ''})
if form.is_valid():
pytest.fail(_("Form deve ser inválido"))
assert len(form.errors) == 1
assert form.errors['justificativa_anulacao'] == \
[_('Este campo é obrigatório.')]
@pytest.mark.django_db(transaction=False)
def test_create_tramitacao(admin_client):
tipo_doc = baker.make(
TipoDocumentoAdministrativo,
descricao='Teste Tipo_DocAdm')
documento_adm = baker.make(
DocumentoAdministrativo,
tipo=tipo_doc)
unidade_tramitacao_local_1 = baker.make(
UnidadeTramitacao, pk=1)
unidade_tramitacao_destino_1 = baker.make(
UnidadeTramitacao, pk=2)
unidade_tramitacao_destino_2 = baker.make(
UnidadeTramitacao, pk=3)
status = baker.make(
StatusTramitacaoAdministrativo)
tramitacao = baker.make(
TramitacaoAdministrativo,
unidade_tramitacao_local=unidade_tramitacao_local_1,
unidade_tramitacao_destino=unidade_tramitacao_destino_1,
status=status,
documento=documento_adm,
data_tramitacao=date(2016, 8, 21))
response = admin_client.post(
reverse(
'sapl.protocoloadm:tramitacaoadministrativo_create',
kwargs={'pk': documento_adm.pk}),
{'unidade_tramitacao_local': unidade_tramitacao_destino_2.pk,
'unidade_tramitacao_destino': unidade_tramitacao_local_1.pk,
'documento': documento_adm.pk,
'status': status.pk,
'urgente': False,
'texto': 'teste',
'data_tramitacao': date(2016, 8, 21)},
follow=True)
msg = force_text(_('A origem da nova tramitação deve ser igual ao '
'destino da última adicionada!'))
# Verifica se a origem da nova tramitacao é igual ao destino da última
assert msg in response.context_data[
'form'].errors['__all__']
response = admin_client.post(
reverse(
'sapl.protocoloadm:tramitacaoadministrativo_create',
kwargs={'pk': documento_adm.pk}),
{'unidade_tramitacao_local': unidade_tramitacao_destino_1.pk,
'unidade_tramitacao_destino': unidade_tramitacao_destino_2.pk,
'documento': documento_adm.pk,
'status': status.pk,
'urgente': False,
'texto': 'teste',
'data_tramitacao': date(2016, 8, 20)},
follow=True)
msg = _('A data da nova tramitação deve ser ' +
'maior que a data da última tramitação!')
# Verifica se a data da nova tramitação é maior do que a última
assert msg in response.context_data[
'form'].errors['__all__']
response = admin_client.post(
reverse(
'sapl.protocoloadm:tramitacaoadministrativo_create',
kwargs={'pk': documento_adm.pk}),
{'unidade_tramitacao_local': unidade_tramitacao_destino_1.pk,
'unidade_tramitacao_destino': unidade_tramitacao_destino_2.pk,
'documento': documento_adm.pk,
'status': status.pk,
'urgente': False,
'texto': 'teste',
'data_tramitacao': timezone.now().date() + timedelta(
days=1)},
follow=True)
msg = force_text(_('A data de tramitação deve ser ' +
'menor ou igual a data de hoje!'))
# Verifica se a data da tramitação é menor do que a data de hoje
assert msg in response.context_data[
'form'].errors['__all__']
response = admin_client.post(
reverse(
'sapl.protocoloadm:tramitacaoadministrativo_create',
kwargs={'pk': documento_adm.pk}),
{'unidade_tramitacao_local': unidade_tramitacao_destino_1.pk,
'unidade_tramitacao_destino': unidade_tramitacao_destino_2.pk,
'documento': documento_adm.pk,
'status': status.pk,
'urgente': False,
'texto': 'teste',
'data_tramitacao': date(2016, 8, 21),
'data_encaminhamento': date(2016, 8, 20)},
follow=True)
msg = force_text(_('A data de encaminhamento deve ser ' +
'maior que a data de tramitação!'))
# Verifica se a data da encaminhamento é menor do que a data de tramitacao
assert msg in response.context_data[
'form'].errors['__all__']
response = admin_client.post(
reverse(
'sapl.protocoloadm:tramitacaoadministrativo_create',
kwargs={'pk': documento_adm.pk}),
{'unidade_tramitacao_local': unidade_tramitacao_destino_1.pk,
'unidade_tramitacao_destino': unidade_tramitacao_destino_2.pk,
'documento': documento_adm.pk,
'status': status.pk,
'urgente': False,
'texto': 'teste',
'data_tramitacao': date(2016, 8, 21),
'data_fim_prazo': date(2016, 8, 20)},
follow=True)
msg = _('A data fim de prazo deve ser ' +
'maior que a data de tramitação!')
# Verifica se a data da do fim do prazo é menor do que a data de tramitacao
assert msg in response.context_data[
'form'].errors['__all__']
response = admin_client.post(
reverse(
'sapl.protocoloadm:tramitacaoadministrativo_create',
kwargs={'pk': documento_adm.pk}),
{'unidade_tramitacao_local': unidade_tramitacao_destino_1.pk,
'unidade_tramitacao_destino': unidade_tramitacao_destino_2.pk,
'documento': documento_adm.pk,
'status': status.pk,
'urgente': False,
'texto': 'teste',
'data_tramitacao': date(2016, 8, 21)},
follow=True)
tramitacao = TramitacaoAdministrativo.objects.last()
# Verifica se a tramitacao que obedece as regras de negócios é criada
assert tramitacao.data_tramitacao == date(2016, 8, 21)
@pytest.mark.django_db(transaction=False)
def test_anular_protocolo_dados_invalidos():
form = AnularProtocoloAdmForm(data={})
assert not form.is_valid()
errors = form.errors
assert errors['numero'] == [_('Este campo é obrigatório.')]
assert errors['ano'] == [_('Este campo é obrigatório.')]
assert errors['justificativa_anulacao'] == [_('Este campo é obrigatório.')]
assert len(errors) == 3
@pytest.mark.django_db(transaction=False)
def test_anular_protocolo_form_anula_protocolo_inexistente():
form = AnularProtocoloAdmForm(data={'numero': '1',
'ano': '2017',
'justificativa_anulacao': 'teste'
})
assert not form.is_valid()
assert form.errors['__all__'] == [_(
'Protocolo 1/2017 não existe')]
@pytest.mark.django_db(transaction=False)
def test_anular_protocolo_form_anula_protocolo_anulado():
baker.make(Protocolo, numero=1, ano=2017, anulado=True)
form = AnularProtocoloAdmForm(data={'numero': '1',
'ano': '2017',
'justificativa_anulacao': 'teste'
})
assert not form.is_valid()
assert form.errors['__all__'] == [_(
'Protocolo 1/2017 já encontra-se anulado')]
@pytest.mark.django_db(transaction=False)
def test_anular_protocolo_form_anula_protocolo_com_doc_vinculado():
tipo_materia = baker.make(TipoMateriaLegislativa)
baker.make(Protocolo,
numero=1,
ano=2017,
tipo_materia=tipo_materia,
anulado=False)
baker.make(MateriaLegislativa,
ano=2017,
numero_protocolo=1)
form = AnularProtocoloAdmForm(data={'numero': '1',
'ano': '2017',
'justificativa_anulacao': 'teste'
})
assert not form.is_valid()
assert form.errors['__all__'] == \
[_("Protocolo 1/2017 não pode ser removido pois existem "
"documentos vinculados a ele.")]
tipo_documento = baker.make(TipoDocumentoAdministrativo)
protocolo_documento = baker.make(Protocolo,
numero=2,
ano=2017,
tipo_documento=tipo_documento,
anulado=False)
baker.make(DocumentoAdministrativo,
protocolo=protocolo_documento)
form = AnularProtocoloAdmForm(data={'numero': '2',
'ano': '2017',
'justificativa_anulacao': 'teste'
})
assert not form.is_valid()
assert form.errors['__all__'] == \
[_("Protocolo 2/2017 não pode ser removido pois existem "
"documentos vinculados a ele.")]
def test_documento_administrativo_invalido():
form = DocumentoAdministrativoForm(data={})
assert not form.is_valid()
errors = form.errors
assert errors['ano'] == [_('Este campo é obrigatório.')]
assert errors['tipo'] == [_('Este campo é obrigatório.')]
assert errors['assunto'] == [_('Este campo é obrigatório.')]
assert errors['numero'] == [_('Este campo é obrigatório.')]
assert errors['data'] == [_('Este campo é obrigatório.')]
assert errors['restrito'] == [_('Este campo é obrigatório.')]
assert errors['tramitacao'] == [_('Este campo é obrigatório.')]
assert len(errors) == 7
@pytest.mark.django_db(transaction=False)
def test_documento_administrativo_protocolo_inexistente():
tipo = baker.make(TipoDocumentoAdministrativo)
protocolo = baker.make(Protocolo,
ano=2017,
numero=10,
anulado=False,
tipo_documento=tipo)
form = DocumentoAdministrativoForm(data={'ano': '2017',
'tipo': str(tipo.pk),
'assunto': 'teste',
'numero': '1',
'complemento':'',
'data': '2017-10-10',
'numero_protocolo': '11',
'ano_protocolo': '2017',
'restrito': False,
'tramitacao': False
})
assert not form.is_valid()
assert form.errors['__all__'] == [_('Protocolo 11/2017 inexistente.')]
@pytest.mark.django_db(transaction=False)
def test_protocolo_documento_form_invalido():
config = baker.make(AppConfig)
form = ProtocoloDocumentoForm(
data={},
initial={
'user_data_hora_manual': '',
'ip_data_hora_manual': '',
'data': timezone.localdate(timezone.now()),
'hora': timezone.localtime(timezone.now())})
assert not form.is_valid()
errors = form.errors
assert errors['data_hora_manual'] == [_('Este campo é obrigatório.')]
assert errors['tipo_protocolo'] == [_('Este campo é obrigatório.')]
assert errors['interessado'] == [_('Este campo é obrigatório.')]
assert errors['tipo_documento'] == [_('Este campo é obrigatório.')]
assert errors['numero_paginas'] == [_('Este campo é obrigatório.')]
assert errors['assunto'] == [_('Este campo é obrigatório.')]
assert len(errors) == 6
@pytest.mark.django_db(transaction=False)
def test_protocolo_materia_invalido():
config = baker.make(AppConfig)
form = ProtocoloMateriaForm(data={},
initial={
'user_data_hora_manual': '',
'ip_data_hora_manual': '',
'data': timezone.localdate(timezone.now()),
'hora': timezone.localtime(timezone.now())})
assert not form.is_valid()
errors = form.errors
assert errors['data_hora_manual'] == [_('Este campo é obrigatório.')]
assert errors['assunto_ementa'] == [_('Este campo é obrigatório.')]
assert errors['tipo_autor'] == [_('Este campo é obrigatório.')]
assert errors['tipo_materia'] == [_('Este campo é obrigatório.')]
assert errors['numero_paginas'] == [_('Este campo é obrigatório.')]
assert errors['autor'] == [_('Este campo é obrigatório.')]
assert errors['vincular_materia'] == [_('Este campo é obrigatório.')]
assert len(errors) == 7
@pytest.mark.django_db(transaction=False)
def test_lista_documentos_anexados():
tipo_documento = baker.make(
TipoDocumentoAdministrativo,
descricao="Tipo_Teste"
)
documento_principal = baker.make(
DocumentoAdministrativo,
numero=20,
ano=2018,
data="2018-01-04",
tipo=tipo_documento
)
documento_anexado = baker.make(
DocumentoAdministrativo,
numero=21,
ano=2019,
data="2019-05-04",
tipo=tipo_documento
)
documento_anexado_anexado = baker.make(
DocumentoAdministrativo,
numero=22,
ano=2020,
data="2020-01-05",
tipo=tipo_documento
)
baker.make(
Anexado,
documento_principal=documento_principal,
documento_anexado=documento_anexado,
data_anexacao="2019-05-11"
)
baker.make(
Anexado,
documento_principal=documento_anexado,
documento_anexado=documento_anexado_anexado,
data_anexacao="2020-11-05"
)
lista = lista_anexados(documento_principal)
assert len(lista) == 2
assert lista[0] == documento_anexado
assert lista[1] == documento_anexado_anexado
@pytest.mark.django_db(transaction=False)
def make_unidade_tramitacao(descricao):
# Cria uma comissão para ser a unidade de tramitação
tipo_comissao = baker.make(TipoComissao)
comissao = baker.make(Comissao,
tipo=tipo_comissao,
nome=descricao,
sigla='T',
data_criacao='2016-03-21')
# Testa a comissão
assert comissao.tipo == tipo_comissao
assert comissao.nome == descricao
# Cria a unidade
unidade = baker.make(UnidadeTramitacao, comissao=comissao)
assert unidade.comissao == comissao
return unidade
@pytest.mark.django_db(transaction=False)
def test_tramitacoes_documentos_anexados(admin_client):
config = baker.make(AppConfig, tramitacao_documento=True)
tipo_documento = baker.make(
TipoDocumentoAdministrativo,
descricao="Tipo_Teste"
)
documento_principal = baker.make(
DocumentoAdministrativo,
numero=20,
ano=2018,
data="2018-01-04",
tipo=tipo_documento
)
documento_anexado = baker.make(
DocumentoAdministrativo,
numero=21,
ano=2019,
data="2019-05-04",
tipo=tipo_documento
)
documento_anexado_anexado = baker.make(
DocumentoAdministrativo,
numero=22,
ano=2020,
data="2020-01-05",
tipo=tipo_documento
)
baker.make(
Anexado,
documento_principal=documento_principal,
documento_anexado=documento_anexado,
data_anexacao="2019-05-11"
)
baker.make(
Anexado,
documento_principal=documento_anexado,
documento_anexado=documento_anexado_anexado,
data_anexacao="2020-11-05"
)
unidade_tramitacao_local_1 = make_unidade_tramitacao(descricao="Teste 1")
unidade_tramitacao_destino_1 = make_unidade_tramitacao(descricao="Teste 2")
unidade_tramitacao_destino_2 = make_unidade_tramitacao(descricao="Teste 3")
status = baker.make(
StatusTramitacaoAdministrativo,
indicador='R')
# 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 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 compara_tramitacoes_doc(tramitacao_principal, tramitacao_anexada)
assert DocumentoAdministrativo.objects.get(id=documento_anexado.pk).tramitacao \
== (tramitacao_anexada.status.indicador != "F")
assert compara_tramitacoes_doc(tramitacao_anexada_anexada, tramitacao_principal)
assert DocumentoAdministrativo.objects.get(id=documento_anexado_anexado.pk).tramitacao \
== (tramitacao_anexada_anexada.status.indicador != "F")
# Teste Edição de Tramitacao
form = TramitacaoAdmEditForm(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 = 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_2
assert tramitacao_anexada_anexada.unidade_tramitacao_destino == unidade_tramitacao_destino_2
# Teste Remoção de Tramitacao
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() == 0
assert TramitacaoAdministrativo.objects.filter(id=tramitacao_anexada_anexada.pk).count() == 0
# Testes para quando as tramitações das anexadas divergem
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()
form = TramitacaoAdmEditForm(data={})
# Alterando unidade_tramitacao_destino
form.data = {'data_tramitacao':tramitacao_anexada.data_tramitacao,
'unidade_tramitacao_local':tramitacao_anexada.unidade_tramitacao_local.pk,
'unidade_tramitacao_destino':unidade_tramitacao_destino_2.pk,
'status':tramitacao_anexada.status.pk,
'urgente': tramitacao_anexada.urgente,
'texto': tramitacao_anexada.texto}
form.instance = tramitacao_anexada
assert form.is_valid()
tramitacao_anexada = form.save()
tramitacao_anexada_anexada = documento_anexado_anexado.tramitacaoadministrativo_set.last()
assert tramitacao_principal.unidade_tramitacao_destino == unidade_tramitacao_destino_1
assert tramitacao_anexada.unidade_tramitacao_destino == unidade_tramitacao_destino_2
assert tramitacao_anexada_anexada.unidade_tramitacao_destino == unidade_tramitacao_destino_2
# Editando a tramitação principal, as tramitações anexadas não devem ser editadas
form = TramitacaoAdmEditForm(data={})
# Alterando o texto
form.data = {'data_tramitacao':tramitacao_principal.data_tramitacao,
'unidade_tramitacao_local':tramitacao_principal.unidade_tramitacao_local.pk,
'unidade_tramitacao_destino':tramitacao_principal.unidade_tramitacao_destino.pk,
'status':tramitacao_principal.status.pk,
'urgente': tramitacao_principal.urgente,
'texto': "Testando a alteração"}
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.texto == "Testando a alteração"
assert not tramitacao_anexada.texto == "Testando a alteração"
assert not tramitacao_anexada_anexada.texto == "Testando a alteração"
# Removendo a tramitação pricipal, as tramitações anexadas não devem ser removidas, pois divergiram
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
assert TramitacaoAdministrativo.objects.filter(id=tramitacao_anexada_anexada.pk).count() == 1
# Removendo a tramitação anexada, a tramitação anexada à anexada deve ser removida
url = reverse('sapl.protocoloadm:tramitacaoadministrativo_delete',
kwargs={'pk': tramitacao_anexada.pk})
response = admin_client.post(url, {'confirmar':'confirmar'} ,follow=True)
assert TramitacaoAdministrativo.objects.filter(id=tramitacao_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)
def test_tramitacao_lote_documentos_form(admin_client):
tipo_documento = baker.make(
TipoDocumentoAdministrativo,
descricao="Tipo_Teste"
)
documento = baker.make(
DocumentoAdministrativo,
numero=20,
ano=2018,
data="2019-05-16",
tipo=tipo_documento
)
unidade_tramitacao_local_1 = make_unidade_tramitacao(descricao="Teste 1")
unidade_tramitacao_destino_1 = make_unidade_tramitacao(descricao="Teste 2")
status = baker.make(
StatusTramitacaoAdministrativo,
indicador='R')
# Form sem campos obrigatórios
documentos = []
form = TramitacaoEmLoteAdmForm(initial={'documentos': documentos}, data={})
errors = form.errors
assert errors['data_tramitacao'] == ['Este campo é obrigatório.']
assert errors['unidade_tramitacao_local'] == ['Este campo é obrigatório.']
assert errors['status'] == ['Este campo é obrigatório.']
assert errors['unidade_tramitacao_destino'] == ['Este campo é obrigatório.']
assert errors['texto'] == ['Este campo é obrigatório.']
assert not form.is_valid()
# Tramitar apenas um documento sem anexados
documentos = [documento.id]
now = timezone.now().date()
form = TramitacaoEmLoteAdmForm(initial={'documentos': documentos}, data={})
form.data = {'data_tramitacao': now + timedelta(days=5),
'unidade_tramitacao_local': unidade_tramitacao_local_1.id,
'unidade_tramitacao_destino': unidade_tramitacao_destino_1.id,
'status': status.id,
'urgente': False,
'texto': 'aaaa'}
assert form.errors['__all__'] == \
["A data de tramitação deve ser menor ou igual a data de hoje!"]
assert not form.is_valid()
form = TramitacaoEmLoteAdmForm(initial={'documentos': documentos}, data={})
form.data = {'data_tramitacao': '2019-05-14',
'data_encaminhamento' : '2019-05-09',
'unidade_tramitacao_local': unidade_tramitacao_local_1.id,
'unidade_tramitacao_destino': unidade_tramitacao_destino_1.id,
'status': status.id,
'urgente': False,
'texto': 'aaaa'}
assert form.errors['__all__'] == \
["A data de encaminhamento deve ser maior que a data de tramitação!"]
assert not form.is_valid()
form = TramitacaoEmLoteAdmForm(initial={'documentos': documentos}, data={})
form.data = {'data_tramitacao': '2019-05-14',
'data_encaminhamento' : '2019-05-15',
'data_fim_prazo': '2019-05-09',
'unidade_tramitacao_local': unidade_tramitacao_local_1.id,
'unidade_tramitacao_destino': unidade_tramitacao_destino_1.id,
'status': status.id,
'urgente': False,
'texto': 'aaaa'}
assert form.errors['__all__'] == \
["A data fim de prazo deve ser maior que a data de tramitação!"]
assert not form.is_valid()
form = TramitacaoEmLoteAdmForm(initial={'documentos': documentos}, data={})
form.data = {'data_tramitacao': '2019-05-14',
'data_encaminhamento' : '2019-05-15',
'data_fim_prazo': '2019-05-18',
'unidade_tramitacao_local': unidade_tramitacao_local_1.id,
'unidade_tramitacao_destino': unidade_tramitacao_destino_1.id,
'status': status.id,
'urgente': False,
'texto': 'aaaa'}
assert form.is_valid()
@pytest.mark.django_db(transaction=False)
def test_tramitacao_lote_documentos_views(admin_client):
config = baker.make(AppConfig, tramitacao_documento=True)
tipo_documento = baker.make(
TipoDocumentoAdministrativo,
descricao="Tipo_Teste"
)
documento_principal = baker.make(
DocumentoAdministrativo,
numero=20,
ano=2018,
data="2018-01-04",
tipo=tipo_documento
)
documento_anexado = baker.make(
DocumentoAdministrativo,
numero=21,
ano=2019,
data="2019-05-04",
tipo=tipo_documento
)
documento_anexado_anexado = baker.make(
DocumentoAdministrativo,
numero=22,
ano=2020,
data="2020-01-05",
tipo=tipo_documento
)
documento_sem_anexados = baker.make(
DocumentoAdministrativo,
numero=23,
ano=2020,
data="2021-01-05",
tipo=tipo_documento
)
baker.make(
Anexado,
documento_principal=documento_principal,
documento_anexado=documento_anexado,
data_anexacao="2019-05-11"
)
baker.make(
Anexado,
documento_principal=documento_anexado,
documento_anexado=documento_anexado_anexado,
data_anexacao="2020-11-05"
)
unidade_tramitacao_local_1 = make_unidade_tramitacao(descricao="Teste 1")
unidade_tramitacao_destino_1 = make_unidade_tramitacao(descricao="Teste 2")
unidade_tramitacao_destino_2 = make_unidade_tramitacao(descricao="Teste 3")
unidade_tramitacao_destino_3 = make_unidade_tramitacao(descricao="Teste 4")
status = baker.make(
StatusTramitacaoAdministrativo,
indicador='R')
url = reverse('sapl.protocoloadm:primeira_tramitacao_em_lote_docadm')
url = url + '?' + urlencode({'tipo':tipo_documento.id, 'data_0':'', 'data_1':''})
response = admin_client.post(url, {'salvar':'salvar'}, follow=True)
assert response.status_code == 200
msgs = [m.message for m in response.context['messages']]
assert len(msgs) == 1
assert msgs[0] == 'Escolha algum Documento para ser tramitado.'
documentos = [documento_sem_anexados.id, documento_anexado_anexado.id]
response = admin_client.post(url, {'documentos': documentos,'salvar':'salvar'}, follow=True)
msgs = [m.message for m in response.context['messages']]
assert 'Data Tramitação: Este campo é obrigatório.' in msgs
assert 'Unidade Local: Este campo é obrigatório.' in msgs
assert 'Status: Este campo é obrigatório.' in msgs
assert 'Unidade Destino: Este campo é obrigatório.' in msgs
assert 'Texto da Ação: Este campo é obrigatório.' in msgs
# Primeira tramitação em lote
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_sem_anexados.tramitacaoadministrativo_set.all().count() == 1
assert documento_anexado_anexado.tramitacaoadministrativo_set.all().count() == 1
# Segunda tramitação em lote
url_lote = reverse('sapl.protocoloadm:tramitacao_em_lote_docadm')
url_lote = url_lote + '?' + urlencode(
{'tipo':tipo_documento.id,
'tramitacaoadministrativo__unidade_tramitacao_destino':unidade_tramitacao_destino_1.id,
'tramitacaoadministrativo__status': status.id,
'data_0':'',
'data_1':''})
response = admin_client.post(url_lote, {'salvar':'salvar'}, follow=True)
assert response.status_code == 200
assert response.context_data['object_list'].count() == 2
msgs = [m.message for m in response.context['messages']]
assert len(msgs) == 1
assert msgs[0] == 'Escolha algum Documento para ser tramitado.'
response = admin_client.post(url_lote, {'documentos':documentos, 'salvar':'salvar'}, follow=True)
assert response.status_code == 200
msgs = [m.message for m in response.context['messages']]
assert 'Data Tramitação: Este campo é obrigatório.' in msgs
assert 'Unidade Local: Este campo é obrigatório.' in msgs
assert 'Status: Este campo é obrigatório.' in msgs
assert 'Unidade Destino: Este campo é obrigatório.' in msgs
assert 'Texto da Ação: Este campo é obrigatório.' in msgs
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() == 4
assert documento_sem_anexados.tramitacaoadministrativo_set.all().count() == 2
assert documento_anexado_anexado.tramitacaoadministrativo_set.all().count() == 2
# Tramitar documentos com anexados
# O documento anexado ao anexado não deve tramitar junto porque já está com tramitação diferente
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() == 6
assert documento_principal.tramitacaoadministrativo_set.all().count() == 1
assert documento_anexado.tramitacaoadministrativo_set.all().count() == 1
# Segunda tramitação com documentos anexados
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() == 8
assert documento_principal.tramitacaoadministrativo_set.all().count() == 2
assert documento_anexado.tramitacaoadministrativo_set.all().count() == 2
# Terceira tramitação em lote
# Agora, o documento anexado ao anexado deve tramitar junto com o documento principal,
# pois suas tramitações convergiram
response = admin_client.post(url_lote,
{'documentos': documentos,
'data_tramitacao': date(2019, 5, 15),
'unidade_tramitacao_local': unidade_tramitacao_destino_2.id,
'unidade_tramitacao_destino': unidade_tramitacao_destino_3.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() == 11
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