diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 4ef42e922..fec68c766 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -786,3 +786,35 @@ 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'))) diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index 10bbbe08d..039882c22 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -10,15 +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, - UnidadeTramitacaoCrud) + PrimeiraTramitacaoEmLoteView, ProposicaoCrud, + ProposicaoDevolvida, ProposicaoPendente, + ProposicaoRecebida, ProposicaoTaView, + ReceberProposicao, ReciboProposicaoView, + RegimeTramitacaoCrud, RelatoriaCrud, + StatusTramitacaoCrud, TipoAutorCrud, + TipoDocumentoCrud, TipoFimRelatoriaCrud, + TipoMateriaCrud, TipoProposicaoCrud, + TramitacaoCrud, UnidadeTramitacaoCrud) from .apps import AppConfig @@ -90,4 +90,7 @@ 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'), ] diff --git a/sapl/materia/views.py b/sapl/materia/views.py index d396e6545..7eeaab44e 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -30,15 +30,17 @@ 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, + MateriaLegislativaFilterSet, NumeracaoForm, + PrimeiraTramitacaoEmLoteFilterSet, ProposicaoForm, ReceberProposicaoForm, RelatoriaForm, TramitacaoForm, TramitacaoUpdateForm, UnidadeTramitacaoForm, filtra_tramitacao_destino, @@ -1251,7 +1253,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 +1293,50 @@ 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/primeira_tramitacao.html' + permission_required = permissoes_materia() + + def get_context_data(self, **kwargs): + context = super(PrimeiraTramitacaoEmLoteView, + self).get_context_data(**kwargs) + + context['title'] = _('Primeira 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['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) + + tipo = TipoDocumento.objects.get(descricao=request.POST['tipo']) + + for materia_id in marcadas: + DocumentoAcessorio.objects.create( + materia_id=materia_id, + tipo=tipo, + arquivo=request.POST['arquivo'], + nome=request.POST['nome'], + data=datetime.strptime(request.POST['data'], "%d/%m/%Y"), + autor=Autor.objects.get(id=request.POST['autor']), + ementa=request.POST['ementa'] + ) + msg = _('Documento(s) criado(s).') + messages.add_message(request, messages.SUCCESS, msg) + return self.get(request, self.kwargs) 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/primeira_tramitacao.html b/sapl/templates/materia/em_lote/primeira_tramitacao.html new file mode 100644 index 000000000..cc97eff3c --- /dev/null +++ b/sapl/templates/materia/em_lote/primeira_tramitacao.html @@ -0,0 +1,113 @@ +{% extends "crud/detail.html" %} +{% load i18n crispy_forms_tags %} +{% block actions %}{% endblock %} +{% block sections_nav %}{% endblock %} +{% block detail_content %} + + {% if not filter_url %} + {% crispy filter.form %} + {% endif %} + + {% if filter_url %} + {% if object_list.count > 0 %} + {% if object_list.count == 1 %} +

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

+ {% else %} +

{% blocktrans with object_list.count as total_materias %}Foram encontradas {{total_materias}} matérias.{% endblocktrans %}

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

Nenhuma matéria encontrada.

+ {% endif %} +
+ {% csrf_token %} +
+ Detalhes da tramitação + +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+
+ + +
+
+
+ +


+ +
+ 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/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)