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 @@ + diff --git a/sapl/templates/materia/acessorio_lote.html b/sapl/templates/materia/em_lote/acessorio.html similarity index 100% rename from sapl/templates/materia/acessorio_lote.html rename to sapl/templates/materia/em_lote/acessorio.html diff --git a/sapl/templates/materia/em_lote/subnav.html b/sapl/templates/materia/em_lote/subnav.html new file mode 100644 index 000000000..1ba0fe431 --- /dev/null +++ b/sapl/templates/materia/em_lote/subnav.html @@ -0,0 +1,4 @@ + diff --git a/sapl/templates/materia/em_lote/tramitacao.html b/sapl/templates/materia/em_lote/tramitacao.html new file mode 100644 index 000000000..6e4235c28 --- /dev/null +++ b/sapl/templates/materia/em_lote/tramitacao.html @@ -0,0 +1,118 @@ +{% extends "crud/detail.html" %} +{% load i18n crispy_forms_tags %} +{% block actions %}{% endblock %} +{% block sections_nav %} {% include 'materia/em_lote/subnav.html'%} {% 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 %} +

{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}

+ {% else %} +

Foram encontradas {{object_list|length}} matérias.

+ {% endif %} + {% else %} +

Nenhuma matéria encontrada.

+ {% endif %} +
+ {% csrf_token %} +
+ 1. Detalhes da tramitação: + +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+
+ + {% if unidade_local|length > 1 %}{% endif %} + +
+ +
+ + + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+
+ + +
+
+
+ +


+ +
+ 2. Selecione as matérias para primeira tramitação: + + + + + + {% for materia in object_list %} + + + + {% endfor %} + +
Matéria
+ + {{materia.tipo.sigla}} {{materia.tipo.descricao}} {{materia.numero}}/{{materia.ano}} +
+
+ +
+ {% endif %} +{% endblock detail_content %} diff --git a/sapl/templates/mesa_diretora/mesa_diretora.html b/sapl/templates/menus/mesa_diretora/mesa_diretora.html similarity index 100% rename from sapl/templates/mesa_diretora/mesa_diretora.html rename to sapl/templates/menus/mesa_diretora/mesa_diretora.html diff --git a/sapl/utils.py b/sapl/utils.py index d2c16063f..3f63c30df 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -100,6 +100,17 @@ def create_barcode(value): YES_NO_CHOICES = [(True, _('Sim')), (False, _('Não'))] +TURNO_TRAMITACAO_CHOICES = [ + ('P', _('Primeiro')), + ('S', _('Segundo')), + ('U', _('Único')), + ('L', _('Suplementar')), + ('F', _('Final')), + ('A', _('Votação única em Regime de Urgência')), + ('B', _('1ª Votação')), + ('C', _('2ª e 3ª Votação')), +] + def listify(function): @wraps(function)