From 1e9a027132a46f91a36435dc6d92880d9732147e Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 30 May 2016 09:59:13 -0300 Subject: [PATCH] Finaliza as regras de tramitacao para Documentos Administrativos --- base/forms.py | 1 + compilacao/views.py | 3 +- norma/migrations/0014_merge.py | 16 ++++ protocoloadm/forms.py | 127 ++++++++++++++++++-------- protocoloadm/migrations/0014_merge.py | 16 ++++ protocoloadm/models.py | 6 +- protocoloadm/urls.py | 3 +- protocoloadm/views.py | 7 +- 8 files changed, 128 insertions(+), 51 deletions(-) create mode 100644 norma/migrations/0014_merge.py create mode 100644 protocoloadm/migrations/0014_merge.py diff --git a/base/forms.py b/base/forms.py index 9201aa666..e0f097096 100644 --- a/base/forms.py +++ b/base/forms.py @@ -2,6 +2,7 @@ from django import forms from django.contrib.auth.forms import AuthenticationForm from django.core.exceptions import ValidationError from django.forms import ModelForm + import sapl from sapl.settings import MAX_IMAGE_UPLOAD_SIZE diff --git a/compilacao/views.py b/compilacao/views.py index 13136e191..6ff059075 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,6 +1,6 @@ +import sys from collections import OrderedDict from datetime import datetime, timedelta -import sys from braces.views import FormMessagesMixin from django import forms @@ -37,7 +37,6 @@ from compilacao.models import (Dispositivo, Nota, from compilacao.utils import DISPOSITIVO_SELECT_RELATED from crud.base import Crud, CrudListView, make_pagination - TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota') TipoVideCrud = Crud.build(TipoVide, 'tipo_vide') TipoPublicacaoCrud = Crud.build(TipoPublicacao, 'tipo_publicacao') diff --git a/norma/migrations/0014_merge.py b/norma/migrations/0014_merge.py new file mode 100644 index 000000000..771cc3808 --- /dev/null +++ b/norma/migrations/0014_merge.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.5 on 2016-05-30 12:00 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0013_auto_20160503_0926'), + ('norma', '0013_auto_20160510_1404'), + ] + + operations = [ + ] diff --git a/protocoloadm/forms.py b/protocoloadm/forms.py index efce6c224..ed48d1621 100644 --- a/protocoloadm/forms.py +++ b/protocoloadm/forms.py @@ -1,3 +1,5 @@ +from datetime import datetime + import django_filters from crispy_forms.bootstrap import InlineRadios from crispy_forms.helper import FormHelper @@ -5,7 +7,6 @@ from crispy_forms.layout import HTML, Button, Fieldset, Layout, Submit from django import forms from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.db import models -from django.db.models import Max from django.forms import ModelForm from django.utils.translation import ugettext_lazy as _ @@ -13,7 +14,7 @@ import crispy_layout_mixin import sapl from crispy_layout_mixin import form_actions from materia.forms import RangeWidgetOverride -from materia.models import Autor +from materia.models import Autor, UnidadeTramitacao from sapl.utils import RANGE_ANOS from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo, @@ -53,16 +54,18 @@ class ProtocoloFilterSet(django_filters.FilterSet): autor = django_filters.CharFilter(widget=forms.HiddenInput()) - tipo_protocolo = django_filters.ChoiceFilter(required=False, - label='Tipo de Protocolo', - choices=TIPOS_PROTOCOLO, - widget=forms.Select( - attrs={'class': 'selector'})) - tipo_processo = django_filters.ChoiceFilter(required=False, - label='Natureza do Processo', - choices=NATUREZA_PROCESSO, - widget=forms.Select( - attrs={'class': 'selector'})) + tipo_protocolo = django_filters.ChoiceFilter( + required=False, + label='Tipo de Protocolo', + choices=TIPOS_PROTOCOLO, + widget=forms.Select( + attrs={'class': 'selector'})) + tipo_processo = django_filters.ChoiceFilter( + required=False, + label='Natureza do Processo', + choices=NATUREZA_PROCESSO, + widget=forms.Select( + attrs={'class': 'selector'})) class Meta: model = Protocolo @@ -112,13 +115,13 @@ class ProtocoloFilterSet(django_filters.FilterSet): ('assunto_ementa', 6)]) row4 = crispy_layout_mixin.to_row( - [('autor', 0), - (Button('pesquisar', - 'Pesquisar Autor', - css_class='btn btn-primary btn-sm'), 2), - (Button('limpar', - 'Limpar Autor', - css_class='btn btn-primary btn-sm'), 10)]) + [('autor', 0), + (Button('pesquisar', + 'Pesquisar Autor', + css_class='btn btn-primary btn-sm'), 2), + (Button('limpar', + 'Limpar Autor', + css_class='btn btn-primary btn-sm'), 10)]) row5 = crispy_layout_mixin.to_row( [('tipo_processo', 12)]) row6 = crispy_layout_mixin.to_row( @@ -134,7 +137,7 @@ class ProtocoloFilterSet(django_filters.FilterSet): HTML(sapl.utils.autor_modal), row4, row5, row6, form_actions(save_label='Pesquisar')) - ) + ) class DocumentoAdministrativoFilterSet(django_filters.FilterSet): @@ -222,7 +225,7 @@ class DocumentoAdministrativoFilterSet(django_filters.FilterSet): row1, row2, row3, row4, row5, form_actions(save_label='Pesquisar')) - ) + ) class AnularProcoloAdmForm(ModelForm): @@ -533,33 +536,79 @@ class TramitacaoAdmForm(ModelForm): } 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 - if (not self.cleaned_data['data_tramitacao'] or - not self.cleaned_data['status'] or - not self.cleaned_data['unidade_tramitacao_local']): - msg = _('Você deixou campos obrigatórios em branco!') - raise ValidationError(msg) - - ultima_data_tram = TramitacaoAdministrativo.objects.filter( - documento_id=5).aggregate(Max('data_tramitacao')) - data = ultima_data_tram.get('data_encaminhamento__max') - ultima_tramitacao = TramitacaoAdministrativo.objects.filter( - documento_id=5, data_encaminhamento=data).order_by( - 'data_encaminhamento').first() - - 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!') + documento_id=self.instance.documento_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 data_enc_form < data_tram_form or data_prazo_form < data_tram_form: + msg = _('A data fim de prazo e encaminhamento devem ser\ + maiores que a data de tramitação!') + raise ValidationError(msg) + return self.cleaned_data +class TramitacaoAdmEditForm(TramitacaoAdmForm): + + unidade_tramitacao_local = forms.ModelChoiceField( + queryset=UnidadeTramitacao.objects.all(), + widget=forms.HiddenInput()) + + data_tramitacao = forms.DateField(widget=forms.HiddenInput()) + + class Meta: + model = TramitacaoAdministrativo + fields = ['data_tramitacao', + 'unidade_tramitacao_local', + 'status', + '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(TramitacaoAdmEditForm, self).clean() + + class DocumentoAdministrativoForm(ModelForm): class Meta: diff --git a/protocoloadm/migrations/0014_merge.py b/protocoloadm/migrations/0014_merge.py new file mode 100644 index 000000000..5713e996b --- /dev/null +++ b/protocoloadm/migrations/0014_merge.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.5 on 2016-05-30 12:01 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0013_remove_tramitacaoadministrativo_ultima'), + ('protocoloadm', '0013_merge'), + ] + + operations = [ + ] diff --git a/protocoloadm/models.py b/protocoloadm/models.py index 547909fba..d2f48476c 100644 --- a/protocoloadm/models.py +++ b/protocoloadm/models.py @@ -166,16 +166,12 @@ class StatusTramitacaoAdministrativo(models.Model): class TramitacaoAdministrativo(models.Model): status = models.ForeignKey( StatusTramitacaoAdministrativo, - blank=True, - null=True, verbose_name=_('Status')) documento = models.ForeignKey(DocumentoAdministrativo) data_tramitacao = models.DateField( - blank=True, null=True, verbose_name=_('Data Tramitação')) + verbose_name=_('Data Tramitação')) unidade_tramitacao_local = models.ForeignKey( UnidadeTramitacao, - blank=True, - null=True, related_name='adm_tramitacoes_origem', verbose_name=_('Unidade Local')) data_encaminhamento = models.DateField( diff --git a/protocoloadm/urls.py b/protocoloadm/urls.py index 1fa8cc7a7..392d9402e 100644 --- a/protocoloadm/urls.py +++ b/protocoloadm/urls.py @@ -19,8 +19,7 @@ from protocoloadm.views import (AnularProtocoloAdmView, ProtocoloPesquisaView, StatusTramitacaoAdministrativoCrud, TipoDocumentoAdministrativoCrud, - TipoInstituicaoCrud, - TramitacaoAdmCrud, + TipoInstituicaoCrud, TramitacaoAdmCrud, get_nome_autor, pesquisa_autores) from .apps import AppConfig diff --git a/protocoloadm/views.py b/protocoloadm/views.py index 1c08edf26..4b5c76d15 100644 --- a/protocoloadm/views.py +++ b/protocoloadm/views.py @@ -22,7 +22,8 @@ from .forms import (AnularProcoloAdmForm, DocumentoAcessorioAdministrativoForm, DocumentoAdministrativoFilterSet, DocumentoAdministrativoForm, ProposicaoSimpleForm, ProtocoloDocumentForm, ProtocoloFilterSet, - ProtocoloMateriaForm, TramitacaoAdmForm) + ProtocoloMateriaForm, TramitacaoAdmEditForm, + TramitacaoAdmForm) from .models import (Autor, DocumentoAcessorioAdministrativo, DocumentoAdministrativo, Protocolo, StatusTramitacaoAdministrativo, @@ -579,13 +580,13 @@ class TramitacaoAdmCrud(MasterDetailCrud): form_class = TramitacaoAdmForm class UpdateView(MasterDetailCrud.UpdateView): - form_class = TramitacaoAdmForm + form_class = TramitacaoAdmEditForm class ListView(MasterDetailCrud.ListView): def get_queryset(self): qs = super(MasterDetailCrud.ListView, self).get_queryset() kwargs = {self.crud.parent_field: self.kwargs['pk']} - return qs.filter(**kwargs).order_by('-data_tramitacao') + return qs.filter(**kwargs).order_by('-id') def get_nome_autor(request):