diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index fec68c766..b3eecfa1c 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -818,3 +818,42 @@ class PrimeiraTramitacaoEmLoteFilterSet(django_filters.FilterSet): self.form.helper.layout = Layout( Fieldset(_('Primeira Tramitação'), row1, row2, form_actions(save_label='Pesquisar'))) + + +class TramitacaoEmLoteFilterSet(django_filters.FilterSet): + + filter_overrides = {models.DateField: { + 'filter_class': django_filters.DateFromToRangeFilter, + 'extra': lambda f: { + 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')), + 'widget': RangeWidgetOverride} + }} + + class Meta: + model = MateriaLegislativa + fields = ['tipo', 'data_apresentacao', + 'tramitacao__unidade_tramitacao_local', 'tramitacao__status'] + + def __init__(self, *args, **kwargs): + super(TramitacaoEmLoteFilterSet, self).__init__( + *args, **kwargs) + + self.filters['tipo'].label = 'Tipo de Matéria' + self.filters['data_apresentacao'].label = 'Data (Inicial - Final)' + self.form.fields['tipo'].required = True + self.form.fields['data_apresentacao'].required = True + self.form.fields['tramitacao__status'].required = True + self.form.fields[ + 'tramitacao__unidade_tramitacao_local'].required = True + + row1 = to_row([ + ('tipo', 4), + ('tramitacao__unidade_tramitacao_local', 4), + ('tramitacao__status', 4)]) + row2 = to_row([('data_apresentacao', 12)]) + + self.form.helper = FormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Tramitação em Lote'), + row1, row2, form_actions(save_label='Pesquisar'))) diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index 039882c22..8ffe63f86 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -18,7 +18,8 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, StatusTramitacaoCrud, TipoAutorCrud, TipoDocumentoCrud, TipoFimRelatoriaCrud, TipoMateriaCrud, TipoProposicaoCrud, - TramitacaoCrud, UnidadeTramitacaoCrud) + TramitacaoCrud, TramitacaoEmLoteView, + UnidadeTramitacaoCrud) from .apps import AppConfig @@ -93,4 +94,6 @@ urlpatterns = [ url(r'^primeira-tramitacao-em-lote', PrimeiraTramitacaoEmLoteView.as_view(), name='primeira_tramitacao_em_lote'), + url(r'^tramitacao-em-lote', TramitacaoEmLoteView.as_view(), + name='tramitacao_em_lote'), ] diff --git a/sapl/materia/views.py b/sapl/materia/views.py index b704a906c..f5f51efeb 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -41,7 +41,8 @@ from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, DocumentoAcessorioForm, LegislacaoCitadaForm, MateriaLegislativaFilterSet, NumeracaoForm, PrimeiraTramitacaoEmLoteFilterSet, ProposicaoForm, - ReceberProposicaoForm, RelatoriaForm, TramitacaoForm, + ReceberProposicaoForm, RelatoriaForm, + TramitacaoEmLoteFilterSet, TramitacaoForm, TramitacaoUpdateForm, UnidadeTramitacaoForm, filtra_tramitacao_destino, filtra_tramitacao_destino_and_status, @@ -1360,3 +1361,68 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): msg = _('Tramitação completa.') messages.add_message(request, messages.SUCCESS, msg) return self.get(request, self.kwargs) + + +class TramitacaoEmLoteView(PermissionRequiredMixin, FilterView): + filterset_class = TramitacaoEmLoteFilterSet + template_name = 'materia/em_lote/tramitacao.html' + permission_required = permissoes_materia() + + def get_context_data(self, **kwargs): + context = super(TramitacaoEmLoteView, self).get_context_data(**kwargs) + + context['title'] = _('Tramitação em Lote') + # Verifica se os campos foram preenchidos + if not self.filterset.form.is_valid(): + return context + + qr = self.request.GET.copy() + context['unidade_tramitacao'] = UnidadeTramitacao.objects.all() + context['status_tramitacao'] = StatusTramitacao.objects.all() + context['turnos_tramitacao'] = TURNO_TRAMITACAO_CHOICES + context['urgente_tramitacao'] = YES_NO_CHOICES + context['unidade_local'] = UnidadeTramitacao.objects.get( + id=qr['tramitacao__unidade_tramitacao_local']) + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + return context + + def post(self, request, *args, **kwargs): + marcadas = request.POST.getlist('materia_id') + + if len(marcadas) == 0: + msg = _('Nenhuma máteria foi selecionada.') + messages.add_message(request, messages.ERROR, msg) + return self.get(request, self.kwargs) + + if request.POST['data_encaminhamento']: + data_encaminhamento = datetime.strptime( + request.POST['data_encaminhamento'], "%d/%m/%Y") + else: + data_encaminhamento = None + + if request.POST['data_fim_prazo']: + data_fim_prazo = datetime.strptime( + request.POST['data_fim_prazo'], "%d/%m/%Y") + else: + data_fim_prazo = None + + import ipdb; ipdb.set_trace() + for materia_id in marcadas: + Tramitacao.objects.create( + materia_id=materia_id, + data_tramitacao=datetime.strptime( + request.POST['data_tramitacao'], "%d/%m/%Y"), + data_encaminhamento=data_encaminhamento, + data_fim_prazo=data_fim_prazo, + unidade_tramitacao_local_id=request.POST[ + 'unidade_tramitacao_local'], + unidade_tramitacao_destino_id=request.POST[ + 'unidade_tramitacao_destino'], + urgente=request.POST['urgente'], + status_id=request.POST['status'], + turno=request.POST['turno'], + texto=request.POST['texto'] + ) + msg = _('Tramitação completa.') + messages.add_message(request, messages.SUCCESS, msg) + return self.get(request, self.kwargs) diff --git a/sapl/templates/materia/em_lote/primeira_tramitacao.html b/sapl/templates/materia/em_lote/primeira_tramitacao.html index f36226aa0..a927e315d 100644 --- a/sapl/templates/materia/em_lote/primeira_tramitacao.html +++ b/sapl/templates/materia/em_lote/primeira_tramitacao.html @@ -4,7 +4,7 @@ {% block sections_nav %}
{% endblock sections_nav %} {% block detail_content %} diff --git a/sapl/templates/materia/em_lote/tramitacao.html b/sapl/templates/materia/em_lote/tramitacao.html new file mode 100644 index 000000000..d4fbdb33a --- /dev/null +++ b/sapl/templates/materia/em_lote/tramitacao.html @@ -0,0 +1,122 @@ +{% extends "crud/detail.html" %} +{% load i18n crispy_forms_tags %} +{% block actions %}{% endblock %} +{% block sections_nav %} + +{% endblock sections_nav %} +{% block detail_content %} + + {% if not filter_url %} + {% crispy filter.form %} + {% endif %} + + {% if filter_url %} + {% if object_list|length > 0 %} + {% if object_list|length == 1 %} +