diff --git a/sapl/materia/views.py b/sapl/materia/views.py index a65746ee0..ec0561838 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1203,6 +1203,7 @@ class TramitacaoCrud(MasterDetailCrud): '-timestamp', '-id').first() + #TODO: Esta checagem foi inserida na issue #2027, mas é mesmo necessária? if ultima_tramitacao: if ultima_tramitacao.unidade_tramitacao_destino: context['form'].fields[ @@ -1216,6 +1217,15 @@ class TramitacaoCrud(MasterDetailCrud): ' da última tramitação não pode ser vazia!') messages.add_message(self.request, messages.ERROR, msg) + primeira_tramitacao = not(Tramitacao.objects.filter( + materia_id=int(kwargs['root_pk'])).exists()) + + # Se não for a primeira tramitação daquela matéria, o campo + # não pode ser modificado + if not primeira_tramitacao: + context['form'].fields[ + 'unidade_tramitacao_local'].widget.attrs['disabled'] = True + return context def form_valid(self, form): @@ -1275,7 +1285,6 @@ class TramitacaoCrud(MasterDetailCrud): post=self.object, request=self.request) except Exception: - # TODO log error msg = _('Tramitação atualizada, mas e-mail de acompanhamento ' 'de matéria não enviado. Há problemas na configuração ' 'do e-mail.') diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 3f237f18f..f833e890f 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -650,6 +650,7 @@ class TramitacaoAdmForm(ModelForm): fields = ['data_tramitacao', 'unidade_tramitacao_local', 'status', + 'urgente', 'unidade_tramitacao_destino', 'data_encaminhamento', 'data_fim_prazo', @@ -660,6 +661,19 @@ class TramitacaoAdmForm(ModelForm): 'ip': forms.HiddenInput()} + def __init__(self, *args, **kwargs): + super(TramitacaoAdmForm, self).__init__(*args, **kwargs) + self.fields['data_tramitacao'].initial = timezone.now().date() + ust = UnidadeTramitacao.objects.select_related().all() + unidade_tramitacao_destino = [('', '---------')] + [(ut.pk, ut) + for ut in ust if ut.comissao and ut.comissao.ativa] + unidade_tramitacao_destino.extend( + [(ut.pk, ut) for ut in ust if ut.orgao]) + unidade_tramitacao_destino.extend( + [(ut.pk, ut) for ut in ust if ut.parlamentar]) + self.fields['unidade_tramitacao_destino'].choices = unidade_tramitacao_destino + self.fields['urgente'].label = "Urgente? *" + def clean(self): cleaned_data = super(TramitacaoAdmForm, self).clean() @@ -746,7 +760,8 @@ class TramitacaoAdmEditForm(TramitacaoAdmForm): model = TramitacaoAdministrativo fields = ['data_tramitacao', 'unidade_tramitacao_local', - 'status', + 'status', + 'urgente', 'unidade_tramitacao_destino', 'data_encaminhamento', 'data_fim_prazo', diff --git a/sapl/protocoloadm/migrations/0019_auto_20190429_0828.py b/sapl/protocoloadm/migrations/0019_auto_20190429_0828.py new file mode 100644 index 000000000..204db8598 --- /dev/null +++ b/sapl/protocoloadm/migrations/0019_auto_20190429_0828.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-04-29 11:28 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0018_auto_20190314_1532'), + ] + + operations = [ + migrations.AddField( + model_name='tramitacaoadministrativo', + name='urgente', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Urgente ?'), + ), + migrations.AlterField( + model_name='tramitacaoadministrativo', + name='texto', + field=models.TextField(verbose_name='Texto da Ação'), + ), + ] diff --git a/sapl/protocoloadm/migrations/0020_tramitacaoadministrativo_timestamp.py b/sapl/protocoloadm/migrations/0020_tramitacaoadministrativo_timestamp.py new file mode 100644 index 000000000..0e367b306 --- /dev/null +++ b/sapl/protocoloadm/migrations/0020_tramitacaoadministrativo_timestamp.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-04-29 12:15 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0019_auto_20190429_0828'), + ] + + operations = [ + migrations.AddField( + model_name='tramitacaoadministrativo', + name='timestamp', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + ] diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py index 28b11f2cc..8396349a8 100644 --- a/sapl/protocoloadm/models.py +++ b/sapl/protocoloadm/models.py @@ -301,6 +301,7 @@ class TramitacaoAdministrativo(models.Model): verbose_name=_('Status')) documento = models.ForeignKey(DocumentoAdministrativo, on_delete=models.PROTECT) + timestamp = models.DateTimeField(default=timezone.now) data_tramitacao = models.DateField( verbose_name=_('Data Tramitação')) unidade_tramitacao_local = models.ForeignKey( @@ -315,8 +316,10 @@ class TramitacaoAdministrativo(models.Model): related_name='adm_tramitacoes_destino', on_delete=models.PROTECT, verbose_name=_('Unidade Destino')) - texto = models.TextField( - blank=True, verbose_name=_('Texto da Ação')) + urgente = models.BooleanField(verbose_name=_('Urgente ?'), + choices=YES_NO_CHOICES, + default=False) + texto = models.TextField(verbose_name=_('Texto da Ação')) data_fim_prazo = models.DateField( blank=True, null=True, verbose_name=_('Data Fim do Prazo')) user = models.ForeignKey(get_settings_auth_user_model(), diff --git a/sapl/protocoloadm/tests/test_protocoloadm.py b/sapl/protocoloadm/tests/test_protocoloadm.py index cfe68fcd1..f5b3dae52 100644 --- a/sapl/protocoloadm/tests/test_protocoloadm.py +++ b/sapl/protocoloadm/tests/test_protocoloadm.py @@ -157,6 +157,8 @@ def test_create_tramitacao(admin_client): '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) @@ -175,6 +177,8 @@ def test_create_tramitacao(admin_client): '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) @@ -193,6 +197,8 @@ def test_create_tramitacao(admin_client): '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) @@ -212,6 +218,8 @@ def test_create_tramitacao(admin_client): '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) @@ -231,6 +239,8 @@ def test_create_tramitacao(admin_client): '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) @@ -250,6 +260,8 @@ def test_create_tramitacao(admin_client): '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) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index ff4852dde..bc8ae0bd4 100755 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -1122,6 +1122,27 @@ class TramitacaoAdmCrud(MasterDetailCrud): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) + username = self.request.user.username + + ultima_tramitacao = TramitacaoAdministrativo.objects.filter( + documento_id=self.kwargs['pk']).order_by( + '-data_tramitacao', + '-timestamp', + '-id').first() + + #TODO: Esta checagem foi inserida na issue #2027, mas é mesmo necessária? + if ultima_tramitacao: + if ultima_tramitacao.unidade_tramitacao_destino: + context['form'].fields[ + 'unidade_tramitacao_local'].choices = [ + (ultima_tramitacao.unidade_tramitacao_destino.pk, + ultima_tramitacao.unidade_tramitacao_destino)] + else: + self.logger.error('user=' + username + '. Unidade de tramitação destino ' + 'da última tramitação não pode ser vazia!') + msg = _('Unidade de tramitação destino ' + ' da última tramitação não pode ser vazia!') + messages.add_message(self.request, messages.ERROR, msg) primeira_tramitacao = not(TramitacaoAdministrativo.objects.filter( documento_id=int(kwargs['root_pk'])).exists()) @@ -1141,7 +1162,6 @@ class TramitacaoAdmCrud(MasterDetailCrud): post=self.object, request=self.request) except Exception as e: - # TODO log error self.logger.error('user=' + username + '. Tramitação criada, mas e-mail de acompanhamento de documento ' 'não enviado. A não configuração do servidor de e-mail ' 'impede o envio de aviso de tramitação. ' + str(e)) diff --git a/sapl/templates/protocoloadm/layouts.yaml b/sapl/templates/protocoloadm/layouts.yaml index 2ada51382..d87a99b56 100644 --- a/sapl/templates/protocoloadm/layouts.yaml +++ b/sapl/templates/protocoloadm/layouts.yaml @@ -30,9 +30,9 @@ StatusTramitacaoAdministrativo: TramitacaoAdministrativo: {% trans 'Tramitação' %}: - - data_tramitacao:4 unidade_tramitacao_local - - status:4 unidade_tramitacao_destino - - data_encaminhamento data_fim_prazo + - data_tramitacao unidade_tramitacao_local + - unidade_tramitacao_destino data_encaminhamento data_fim_prazo + - status urgente - texto Anexado: