diff --git a/sapl/base/views.py b/sapl/base/views.py index d813d4aff..c0c228c39 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -1,5 +1,3 @@ -from itertools import chain - from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.urlresolvers import reverse from django.db.models import Count, Q @@ -12,8 +10,7 @@ from sapl.crud.base import (Crud, CrudBaseMixin, CrudCreateView, CrudDetailView, CrudUpdateView) from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.parlamentares.models import Parlamentar -from sapl.sessao.models import (OrdemDia, PresencaOrdemDia, SessaoPlenaria, - SessaoPlenariaPresenca) +from sapl.sessao.models import OrdemDia, SessaoPlenaria from sapl.utils import permissao_tb_aux from .forms import (CasaLegislativaForm, RelatorioAtasFilterSet, diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 4ef42e922..b3eecfa1c 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -786,3 +786,74 @@ class AcessorioEmLoteFilterSet(django_filters.FilterSet): self.form.helper.layout = Layout( Fieldset(_('Documentos Acessórios em Lote'), row1, row2, form_actions(save_label='Pesquisar'))) + + +class PrimeiraTramitacaoEmLoteFilterSet(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'] + + def __init__(self, *args, **kwargs): + super(PrimeiraTramitacaoEmLoteFilterSet, 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 + + row1 = to_row([('tipo', 12)]) + row2 = to_row([('data_apresentacao', 12)]) + + self.form.helper = FormHelper() + self.form.helper.form_method = 'GET' + 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 10bbbe08d..8ffe63f86 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -10,14 +10,15 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, LegislacaoCitadaCrud, MateriaLegislativaCrud, MateriaLegislativaPesquisaView, MateriaTaView, NumeracaoCrud, OrgaoCrud, OrigemCrud, - ProposicaoCrud, ProposicaoDevolvida, - ProposicaoPendente, ProposicaoRecebida, - ProposicaoTaView, ReceberProposicao, - ReciboProposicaoView, RegimeTramitacaoCrud, - RelatoriaCrud, StatusTramitacaoCrud, - TipoAutorCrud, TipoDocumentoCrud, - TipoFimRelatoriaCrud, TipoMateriaCrud, - TipoProposicaoCrud, TramitacaoCrud, + PrimeiraTramitacaoEmLoteView, ProposicaoCrud, + ProposicaoDevolvida, ProposicaoPendente, + ProposicaoRecebida, ProposicaoTaView, + ReceberProposicao, ReciboProposicaoView, + RegimeTramitacaoCrud, RelatoriaCrud, + StatusTramitacaoCrud, TipoAutorCrud, + TipoDocumentoCrud, TipoFimRelatoriaCrud, + TipoMateriaCrud, TipoProposicaoCrud, + TramitacaoCrud, TramitacaoEmLoteView, UnidadeTramitacaoCrud) from .apps import AppConfig @@ -90,4 +91,9 @@ urlpatterns = [ url(r'^acessorio-em-lote', DocumentoAcessorioEmLoteView.as_view(), name='acessorio_em_lote'), + 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 d396e6545..2468d5186 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -30,16 +30,19 @@ from sapl.crud.base import (Crud, CrudBaseMixin, CrudCreateView, CrudUpdateView, make_pagination) from sapl.crud.masterdetail import MasterDetailCrud from sapl.norma.models import LegislacaoCitada -from sapl.utils import (autor_label, autor_modal, gerar_hash_arquivo, - get_base_url, permissao_tb_aux, permissoes_autor, - permissoes_materia, permissoes_protocoloadm) +from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, + autor_modal, gerar_hash_arquivo, get_base_url, + permissao_tb_aux, permissoes_autor, permissoes_materia, + permissoes_protocoloadm) from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, AnexadaForm, AutorForm, AutoriaForm, ConfirmarProposicaoForm, DespachoInicialForm, DocumentoAcessorioForm, LegislacaoCitadaForm, - MateriaLegislativaFilterSet, NumeracaoForm, ProposicaoForm, - ReceberProposicaoForm, RelatoriaForm, TramitacaoForm, + MateriaLegislativaFilterSet, NumeracaoForm, + PrimeiraTramitacaoEmLoteFilterSet, ProposicaoForm, + ReceberProposicaoForm, RelatoriaForm, + TramitacaoEmLoteFilterSet, TramitacaoForm, TramitacaoUpdateForm, UnidadeTramitacaoForm, filtra_tramitacao_destino, filtra_tramitacao_destino_and_status, @@ -1251,7 +1254,7 @@ def do_envia_email_tramitacao(request, materia): class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): filterset_class = AcessorioEmLoteFilterSet - template_name = 'materia/acessorio_lote.html' + template_name = 'materia/em_lote/acessorio.html' permission_required = permissoes_materia() def get_context_data(self, **kwargs): @@ -1291,3 +1294,84 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): msg = _('Documento(s) criado(s).') messages.add_message(request, messages.SUCCESS, msg) return self.get(request, self.kwargs) + + +class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): + filterset_class = PrimeiraTramitacaoEmLoteFilterSet + template_name = 'materia/em_lote/tramitacao.html' + permission_required = permissoes_materia() + + def get_context_data(self, **kwargs): + context = super(PrimeiraTramitacaoEmLoteView, + self).get_context_data(**kwargs) + + # Verifica se os campos foram preenchidos + if not self.filterset.form.is_valid(): + return context + + context['title'] = _('Primeira Tramitação em Lote') + + qr = self.request.GET.copy() + context['unidade_destino'] = 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.all() + + # Pega somente matéria que não possuem tramitação + if (type(self.__dict__['filterset']).__name__ == + 'PrimeiraTramitacaoEmLoteFilterSet'): + context['object_list'] = context['object_list'].filter( + tramitacao__isnull=True) + else: + context['title'] = _('Tramitação em Lote') + 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) + + +class TramitacaoEmLoteView(PrimeiraTramitacaoEmLoteView): + filterset_class = TramitacaoEmLoteFilterSet diff --git a/sapl/templates/base.html b/sapl/templates/base.html index f1c78437d..03617f5ac 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -84,10 +84,10 @@