diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index a91567a7f..53549e822 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -216,22 +216,87 @@ class TramitacaoForm(ModelForm): 'texto'] def clean(self): + data_enc_form = self.cleaned_data['data_encaminhamento'] + data_prazo_form = self.cleaned_data['data_fim_prazo'] + data_tram_form = self.cleaned_data['data_tramitacao'] + if self.errors: return self.errors ultima_tramitacao = Tramitacao.objects.filter( - materia_id=self.instance.materia.id).last() + materia_id=self.instance.materia_id).exclude( + id=self.instance.id).last() + + if not self.instance.data_tramitacao: + + if ultima_tramitacao: + destino = ultima_tramitacao.unidade_tramitacao_destino + if (destino != self.cleaned_data['unidade_tramitacao_local']): + msg = _('A origem da nova tramitação deve ser igual ao ' + 'destino da última adicionada!') + raise ValidationError(msg) + + if self.cleaned_data['data_tramitacao'] > datetime.now().date(): + msg = _( + 'A data de tramitação deve ser ' + + 'menor ou igual a data de hoje!') + raise ValidationError(msg) + + if (ultima_tramitacao and + data_tram_form < ultima_tramitacao.data_tramitacao): + msg = _('A data da nova tramitação deve ser ' + + 'maior que a data da última tramitação!') + raise ValidationError(msg) - if ultima_tramitacao: - destino = ultima_tramitacao.unidade_tramitacao_destino - if (destino != self.cleaned_data['unidade_tramitacao_local']): - msg = _('A origem da nova tramitação deve ser igual ao ' - 'destino da última adicionada!') + if data_enc_form: + if data_enc_form < data_tram_form: + msg = _('A data de encaminhamento deve ser ' + + 'maior que a data de tramitação!') + raise ValidationError(msg) + + if data_prazo_form: + if data_prazo_form < data_tram_form: + msg = _('A data fim de prazo deve ser ' + + 'maior que a data de tramitação!') raise ValidationError(msg) return self.cleaned_data +class TramitacaoUpdateForm(TramitacaoForm): + unidade_tramitacao_local = forms.ModelChoiceField( + queryset=UnidadeTramitacao.objects.all(), + widget=forms.HiddenInput()) + + data_tramitacao = forms.DateField(widget=forms.HiddenInput()) + + class Meta: + model = Tramitacao + fields = ['data_tramitacao', + 'unidade_tramitacao_local', + 'status', + 'turno', + 'urgente', + 'unidade_tramitacao_destino', + 'data_encaminhamento', + 'data_fim_prazo', + 'texto', + ] + + widgets = { + 'data_encaminhamento': forms.DateInput(format='%d/%m/%Y'), + 'data_fim_prazo': forms.DateInput(format='%d/%m/%Y'), + } + + def clean(self): + local = self.instance.unidade_tramitacao_local + data_tram = self.instance.data_tramitacao + + self.cleaned_data['data_tramitacao'] = data_tram + self.cleaned_data['unidade_tramitacao_local'] = local + return super(TramitacaoUpdateForm, self).clean() + + class LegislacaoCitadaForm(ModelForm): tipo = forms.ModelChoiceField( diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 35f4eef50..52c2711c5 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -37,7 +37,8 @@ from .forms import (AcompanhamentoMateriaForm, AnexadaForm, AutorForm, AutoriaForm, ConfirmarProposicaoForm, DespachoInicialForm, DocumentoAcessorioForm, LegislacaoCitadaForm, MateriaLegislativaFilterSet, NumeracaoForm, ProposicaoForm, - ReceberProposicaoForm, RelatoriaForm, TramitacaoForm, + ReceberProposicaoForm, RelatoriaForm, + TramitacaoForm, TramitacaoUpdateForm, UnidadeTramitacaoForm, filtra_tramitacao_destino, filtra_tramitacao_destino_and_status, filtra_tramitacao_status) @@ -573,14 +574,19 @@ class TramitacaoCrud(MasterDetailCrud): return super(CreateView, self).post(request, *args, **kwargs) class UpdateView(PermissionRequiredMixin, MasterDetailCrud.UpdateView): - form_class = TramitacaoForm + form_class = TramitacaoUpdateForm permission_required = permissoes_materia() def post(self, request, *args, **kwargs): - materia = MateriaLegislativa.objects.get(id=kwargs['pk']) + materia = MateriaLegislativa.objects.get( + tramitacao__id=kwargs['pk']) do_envia_email_tramitacao(request, materia) return super(UpdateView, self).post(request, *args, **kwargs) + @property + def layout_key(self): + return 'TramitacaoUpdate' + class ListView(MasterDetailCrud.ListView): def get_queryset(self): @@ -598,7 +604,7 @@ class TramitacaoCrud(MasterDetailCrud): kwargs={'pk': tramitacao.materia.id}) if tramitacao.pk != materia.tramitacao_set.last().pk: - msg = _('Somente a útlima tramitação pode ser deletada!') + msg = _('Somente a última tramitação pode ser deletada!') messages.add_message(request, messages.ERROR, msg) return HttpResponseRedirect(url) else: diff --git a/sapl/templates/materia/layouts.yaml b/sapl/templates/materia/layouts.yaml index 19c5fcdbd..d5ade5b8c 100644 --- a/sapl/templates/materia/layouts.yaml +++ b/sapl/templates/materia/layouts.yaml @@ -129,6 +129,12 @@ Tramitacao: - status turno urgente - texto +TramitacaoUpdate: + {% trans 'Tramitação' %}: + - unidade_tramitacao_destino data_encaminhamento data_fim_prazo + - status turno urgente + - texto + DespachoInicial: {% trans 'Despacho Inicial' %}: - comissao diff --git a/sapl/utils.py b/sapl/utils.py index 34aa2ce8c..8ae38f863 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -225,8 +225,8 @@ def intervalos_tem_intersecao(a_inicio, a_fim, b_inicio, b_fim): def permissoes_materia(): lista_permissoes = [] try: - cts = ContentType.objects.filter(app_label='materia') - perms_materia = list(Permission.objects.filter(content_type__in=cts)) + perms_materia = Permission.objects.filter( + group__name='Operador de Matéria') for p in perms_materia: lista_permissoes.append('materia.' + p.codename) except: