From 9b9938facd158b16a60f0ffff47b011322ef8db1 Mon Sep 17 00:00:00 2001 From: cristian-longhi Date: Fri, 21 Sep 2018 09:56:05 -0300 Subject: [PATCH] =?UTF-8?q?Vota=C3=A7=C3=A3o=20em=20Bloco?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/templatetags/common_tags.py | 7 + sapl/sessao/urls.py | 10 +- sapl/sessao/views.py | 115 ++++++++++++++ .../sessao/expedientemateria_list.html | 3 + sapl/templates/sessao/ordemdia_list.html | 3 + .../sessao/votacao/votacao_em_bloco.html | 143 ++++++++++++++++++ 6 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 sapl/templates/sessao/votacao/votacao_em_bloco.html diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index 71f63e130..8392e25a4 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -39,6 +39,13 @@ def model_verbose_name_plural(class_name): return model._meta.verbose_name_plural +@register.filter +def par_ou_impar(arg): + if int(arg) % 2 == 0: + return 'P' + else: + return 'I' + @register.filter def split(value, arg): return value.split(arg) diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index df358d42d..c42485282 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -27,7 +27,8 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, remove_parlamentar_composicao, reordernar_materias_expediente, reordernar_materias_ordem, - sessao_legislativa_legislatura_ajax) + sessao_legislativa_legislatura_ajax, + RegistrarVotacaoEmBloco) from .apps import AppConfig @@ -89,6 +90,13 @@ urlpatterns = [ AdicionarVariasMateriasOrdemDia.as_view(), name='adicionar_varias_materias_ordem_dia'), + url(r'^sessao/(?P\d+)/registrar-votacao-em-bloco-ordem-dia/', + RegistrarVotacaoEmBloco.as_view(), + name='registrar_votacao_em_bloco_ordem_dia'), + url(r'^sessao/(?P\d+)/registrar-votacao-em-bloco-expediente/', + RegistrarVotacaoEmBloco.as_view(), + name='registrar_votacao_em_bloco_expediente'), + # PAUTA SESSÃO url(r'^sessao/pauta-sessao$', PautaSessaoView.as_view(), name='pauta_sessao'), diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 5a2b0785a..a43fc4021 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -49,6 +49,8 @@ from .models import (Bancada, Bloco, CargoBancada, CargoMesa, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar) +from django.shortcuts import redirect + TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente') CargoBancadaCrud = CrudAux.build(CargoBancada, '') @@ -401,6 +403,11 @@ def get_presencas_generic(model, sessao, legislatura): yield (m.parlamentar, False) +def presentes(sessao, tabelaPresenca): + qtde = tabelaPresenca.objects.filter(sessao_plenaria_id=sessao).count() + return qtde + + class MateriaOrdemDiaCrud(MasterDetailCrud): model = OrdemDia parent_field = 'sessao_plenaria' @@ -2669,6 +2676,114 @@ def retira_materias_ja_adicionadas(id_sessao, model): return lista_id_materias +class RegistrarVotacaoEmBloco(PermissionRequiredMixin, TemplateView): + + template_name = 'sessao/votacao/votacao_em_bloco.html' + permission_required = ('sessao.add_registrovotacao', ) + form_class = VotacaoForm + + + def dispatch(self, request, *args, **kwargs): + + sessao = SessaoPlenaria.objects.get(id=int(self.kwargs['pk'])) + if not sessao.iniciada or sessao.finalizada: + msg = _('Não é possível registrar votação em bloco. ' + 'Esta Sessão Plenária não foi iniciada ou está finalizada.') + messages.add_message(self.request, messages.INFO, msg) + if 'expediente' in str(self.request): + return redirect(reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': self.kwargs['pk']})) + else: + return redirect(reverse('sapl.sessao:ordemdia_list', kwargs={'pk': self.kwargs['pk']})) + return super(RegistrarVotacaoEmBloco, self).dispatch( + request, *args, **kwargs) + + def get_context_data(self, **kwargs): + + context = super(RegistrarVotacaoEmBloco, self).get_context_data(**kwargs) + if 'registrar-votacao-em-bloco-ordem-dia' in str(self.request): + tabelaPresenca = PresencaOrdemDia + tabela = OrdemDia + titulo = 'Votação em Bloco - Matérias da Ordem do Dia' + else: + tabelaPresenca = SessaoPlenariaPresenca + tabela = ExpedienteMateria + titulo = 'Votação em Bloco - Matérias do Expediente' + qs = tabela.objects.filter(sessao_plenaria_id=int(self.kwargs['pk']), resultado='').order_by('numero_ordem') + tipos_materia = [{'descricao': ordem.materia.tipo.descricao, 'id': str(ordem.materia.tipo.id)} for ordem in qs.order_by('materia__tipo__descricao').distinct('materia__tipo__descricao')] + context['object_list'] = qs + context['tipos_materia'] = tipos_materia + context['total_presentes'] = presentes(int(self.kwargs['pk']), tabelaPresenca) + context['title'] = titulo + context['is_paginated'] = False + return context + + def post(self, request, *args, **kwargs): + + if 'registrar-votacao-em-bloco-ordem-dia' in str(self.request): + tabelaPresenca = PresencaOrdemDia + tabela = OrdemDia + view_reverse = 'sapl.sessao:ordemdia_list' + else: + tabelaPresenca = SessaoPlenariaPresenca + tabela = ExpedienteMateria + view_reverse = 'sapl.sessao:expedientemateria_list' + qtde_presentes = tabelaPresenca.objects.filter( + sessao_plenaria_id=int(self.kwargs['pk'])).count() + qtde_votos = (int(request.POST['votos_sim']) + + int(request.POST['votos_nao']) + + int(request.POST['abstencoes'])) + + alerta = False + if (qtde_presentes == 0): + msg= _('Não há registro de presença de parlamentares!') + alerta = True + else: + if (int(request.POST['voto_presidente']) == 0): + qtde_presentes -= 1 + if (qtde_votos > qtde_presentes or qtde_votos < qtde_presentes): + msg = _('O total de votos não corresponde à quantidade de presentes!') + alerta = True + if alerta: + messages.add_message(request, messages.ERROR, msg) + return self.get(request, self.kwargs) + else: + marcadas = request.POST.getlist('materias_ordem_exp') + if len(marcadas) == 0: + msg = _('Nenhuma matéria selecionadas para registrar votação!') + messages.add_message(request, messages.ERROR, msg) + return self.get(request, self.kwargs) + for materia_id in marcadas: + + ordem = tabela.objects.get(id=materia_id) + resultado = TipoResultadoVotacao.objects.get( + id=request.POST['resultado_votacao']) + ordem.resultado = resultado.nome + ordem.votacao_aberta = False + ordem.save() + + v = RegistroVotacao( + numero_votos_sim=int(request.POST['votos_sim']), + numero_votos_nao=int(request.POST['votos_nao']), + numero_abstencoes=int(request.POST['abstencoes']), + observacao=request.POST['observacao'], + materia_id = ordem.materia_id, + tipo_resultado_votacao_id=int(request.POST['resultado_votacao']) + ) + if tabela == OrdemDia: + v.ordem_id = int(materia_id) + else: + v.expediente_id = int(materia_id) + v.save() + + msg = _('Votação em bloco completa.') + messages.add_message(request, messages.SUCCESS, msg) + return redirect(reverse(view_reverse, kwargs={'pk': self.kwargs['pk']})) + + def get_tipos_votacao(self): + tipo = TipoResultadoVotacao.objects.all() + return tipo + + class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin, MateriaLegislativaPesquisaView): filterset_class = AdicionarVariasMateriasFilterSet diff --git a/sapl/templates/sessao/expedientemateria_list.html b/sapl/templates/sessao/expedientemateria_list.html index 51f2815d5..cf412e9a2 100644 --- a/sapl/templates/sessao/expedientemateria_list.html +++ b/sapl/templates/sessao/expedientemateria_list.html @@ -12,6 +12,9 @@ {% blocktrans with verbose_name=view.verbose_name %} Adicionar Várias Matérias {% endblocktrans %} + + {% blocktrans with verbose_name=view.verbose_name %} Votação em Bloco {% endblocktrans %} + {% endif %} {% endblock more_buttons %} diff --git a/sapl/templates/sessao/ordemdia_list.html b/sapl/templates/sessao/ordemdia_list.html index 3ae16e2e8..9329ac2af 100644 --- a/sapl/templates/sessao/ordemdia_list.html +++ b/sapl/templates/sessao/ordemdia_list.html @@ -12,6 +12,9 @@ {% blocktrans with verbose_name=view.verbose_name %} Adicionar Várias Matérias {% endblocktrans %} + + {% blocktrans with verbose_name=view.verbose_name %} Votação em Bloco {% endblocktrans %} + {% endif %} {% endblock more_buttons %} diff --git a/sapl/templates/sessao/votacao/votacao_em_bloco.html b/sapl/templates/sessao/votacao/votacao_em_bloco.html new file mode 100644 index 000000000..b61b25543 --- /dev/null +++ b/sapl/templates/sessao/votacao/votacao_em_bloco.html @@ -0,0 +1,143 @@ +{% extends "sessao/votacao/votacao.html" %} +{% load i18n %} +{% load common_tags %} + +{% block detail_content %} +{% if object_list|length > 0 %} +
+ {% csrf_token %} + +
+ Detalhes do Voto: +
+
+ Total presentes: {{total_presentes}} (com presidente) + +
+
+ +
+
Sim:
+
Não:
+
Abstenções:
+
+ +
+
+ A totalização inclui o voto do Presidente? + +
+ +
+ Resultado da Votação + +
+
+ +
+
+ Observações + +
+
+
+

+
+ Tipos de Matéria a Exibir: +
+ {% for tipo in tipos_materia %} +
+ +
+ {% endfor %} +
+
+
+
+ +
+
+ +
+
+ {% for ordem in object_list %} + {% if forloop.counter|par_ou_impar == 'P' %} +
+ {% else %} +
+ {% endif %} + +
+ {% endfor %} +
+ +
+
+ +
+{% else %} +

Nenhuma matéria encontrada.

+{% endif %} +{% endblock detail_content %} + +{% block extra_js %} + +{% endblock %}