Browse Source

Merge e11ee90e58 into 8c38e061cd

pull/2241/merge
cristian-longhi 7 years ago
committed by GitHub
parent
commit
8784f45e2a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      sapl/base/templatetags/common_tags.py
  2. 10
      sapl/sessao/urls.py
  3. 114
      sapl/sessao/views.py
  4. 3
      sapl/templates/sessao/expedientemateria_list.html
  5. 3
      sapl/templates/sessao/ordemdia_list.html
  6. 143
      sapl/templates/sessao/votacao/votacao_em_bloco.html

7
sapl/base/templatetags/common_tags.py

@ -39,6 +39,13 @@ def model_verbose_name_plural(class_name):
return model._meta.verbose_name_plural 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 @register.filter
def split(value, arg): def split(value, arg):
return value.split(arg) return value.split(arg)

10
sapl/sessao/urls.py

@ -27,7 +27,8 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
remove_parlamentar_composicao, remove_parlamentar_composicao,
reordernar_materias_expediente, reordernar_materias_expediente,
reordernar_materias_ordem, reordernar_materias_ordem,
sessao_legislativa_legislatura_ajax) sessao_legislativa_legislatura_ajax,
RegistrarVotacaoEmBloco)
from .apps import AppConfig from .apps import AppConfig
@ -89,6 +90,13 @@ urlpatterns = [
AdicionarVariasMateriasOrdemDia.as_view(), AdicionarVariasMateriasOrdemDia.as_view(),
name='adicionar_varias_materias_ordem_dia'), name='adicionar_varias_materias_ordem_dia'),
url(r'^sessao/(?P<pk>\d+)/registrar-votacao-em-bloco-ordem-dia/',
RegistrarVotacaoEmBloco.as_view(),
name='registrar_votacao_em_bloco_ordem_dia'),
url(r'^sessao/(?P<pk>\d+)/registrar-votacao-em-bloco-expediente/',
RegistrarVotacaoEmBloco.as_view(),
name='registrar_votacao_em_bloco_expediente'),
# PAUTA SESSÃO # PAUTA SESSÃO
url(r'^sessao/pauta-sessao$', url(r'^sessao/pauta-sessao$',
PautaSessaoView.as_view(), name='pauta_sessao'), PautaSessaoView.as_view(), name='pauta_sessao'),

114
sapl/sessao/views.py

@ -49,6 +49,7 @@ from .models import (Bancada, Bloco, CargoBancada, CargoMesa,
SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente,
TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar) TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar)
from django.shortcuts import redirect
TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria')
TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente') TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente')
@ -403,6 +404,11 @@ def get_presencas_generic(model, sessao, legislatura):
yield (m.parlamentar, False) yield (m.parlamentar, False)
def presentes(sessao, tabelaPresenca):
qtde = tabelaPresenca.objects.filter(sessao_plenaria_id=sessao).count()
return qtde
class MateriaOrdemDiaCrud(MasterDetailCrud): class MateriaOrdemDiaCrud(MasterDetailCrud):
model = OrdemDia model = OrdemDia
parent_field = 'sessao_plenaria' parent_field = 'sessao_plenaria'
@ -2687,6 +2693,114 @@ def retira_materias_ja_adicionadas(id_sessao, model):
return lista_id_materias 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, class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin,
MateriaLegislativaPesquisaView): MateriaLegislativaPesquisaView):
filterset_class = AdicionarVariasMateriasFilterSet filterset_class = AdicionarVariasMateriasFilterSet

3
sapl/templates/sessao/expedientemateria_list.html

@ -12,6 +12,9 @@
<a href="{% url 'sapl.sessao:adicionar_varias_materias_expediente' root_pk %}" class="btn btn-default"> <a href="{% url 'sapl.sessao:adicionar_varias_materias_expediente' root_pk %}" class="btn btn-default">
{% blocktrans with verbose_name=view.verbose_name %} Adicionar Várias Matérias {% endblocktrans %} {% blocktrans with verbose_name=view.verbose_name %} Adicionar Várias Matérias {% endblocktrans %}
</a> </a>
<a href="{% url 'sapl.sessao:registrar_votacao_em_bloco_expediente' root_pk %}" class="btn btn-default">
{% blocktrans with verbose_name=view.verbose_name %} Votação em Bloco {% endblocktrans %}
</a>
{% endif %} {% endif %}
{% endblock more_buttons %} {% endblock more_buttons %}

3
sapl/templates/sessao/ordemdia_list.html

@ -12,6 +12,9 @@
<a href="{% url 'sapl.sessao:adicionar_varias_materias_ordem_dia' root_pk %}" class="btn btn-default"> <a href="{% url 'sapl.sessao:adicionar_varias_materias_ordem_dia' root_pk %}" class="btn btn-default">
{% blocktrans with verbose_name=view.verbose_name %} Adicionar Várias Matérias {% endblocktrans %} {% blocktrans with verbose_name=view.verbose_name %} Adicionar Várias Matérias {% endblocktrans %}
</a> </a>
<a href="{% url 'sapl.sessao:registrar_votacao_em_bloco_ordem_dia' root_pk %}" class="btn btn-default">
{% blocktrans with verbose_name=view.verbose_name %} Votação em Bloco {% endblocktrans %}
</a>
{% endif %} {% endif %}
{% endblock more_buttons %} {% endblock more_buttons %}

143
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 %}
<form id="form-votacao" method="post">
{% csrf_token %}
<fieldset class="form-group">
<legend>Detalhes do Voto:</legend>
<div>
<br />
<b>Total presentes:</b> {{total_presentes}} (com presidente)
<input type="hidden" id="total_votos" name="total_votos">
</div>
<br />
<div class="row">
<div class="col-md-4">Sim: <input type="text" id="votos_sim" name="votos_sim" value="0" class="form-control"/></div>
<div class="col-md-4">Não: <input type="text" id="votos_nao" name="votos_nao" value="0" class="form-control"/></div>
<div class="col-md-4">Abstenções: <input type="text" id="abstencoes" name="abstencoes" value="0" class="form-control"/></div>
</div>
<div class="row">
<div class="col-md-6">
A totalização inclui o voto do Presidente?
<select id="voto_presidente" name="voto_presidente" class="form-control">
<option value="1">Sim</option>
<option value="0" selected>Não</option>
</select>
</div>
<div class="col-md-6">
Resultado da Votação
<select id="resultado_votacao" name="resultado_votacao" class="form-control">
{% for tipo in view.get_tipos_votacao %}
<option value="{{tipo.id}}">{{tipo.nome}}</option>
{% endfor %}
</select>
</div>
</div>
<div class="row">
<div class="col-md-12">
Observações
<textarea id="observacao" name="observacao" cols="10" rows="10" class="form-control"></textarea>
</div>
</div>
</fieldset>
<br /><br />
<fieldset>
<legend>Tipos de Matéria a Exibir:</legend>
<div class="controls">
{% for tipo in tipos_materia %}
<div class="checkbox">
<label for="id_tipo_{{forloop.counter}}">
<input type="checkbox" id="id_tipo_{{forloop.counter}}" onchange="escondeMateria('{{ tipo.id }}')" name="tipo_materia" value="{{ tipo }}" checked />
{{ tipo.descricao }}
</label>
</div>
{% endfor %}
</div>
<br />
<div class="controls">
<div class="checkbox">
<label for="id_check_all">
<input type="checkbox" id="id_check_all" onchange="checkAll(event)" /> Marcar/Desmarcar Todas as Matérias para Votação
</label>
</div>
</div>
<br />
<div class="controls">
{% for ordem in object_list %}
{% if forloop.counter|par_ou_impar == 'P' %}
<div class="checkbox tipo{{ ordem.materia.tipo.id }}" style="background: #ececec;" name= "checkbox_materia">
{% else %}
<div class="checkbox tipo{{ ordem.materia.tipo.id }}" style="background: white;" name= "checkbox_materia">
{% endif %}
<label for="id_materia_{{forloop.counter}}">
<input type="checkbox" class="tipo{{ ordem.materia.tipo.id }}" id="id_materia_{{forloop.counter}}" name="materias_ordem_exp" value="{{ ordem.id }}" />
<b>{{ ordem.materia }}</b> - {{ ordem.materia.ementa }}
</label>
</div>
{% endfor %}
</div>
</fieldset>
<br />
<input type="submit" value="Salvar" class="btn btn-primary"S>
</form>
{% else %}
<tr><td><h3 style="text-align: right;">Nenhuma matéria encontrada.</h3></td></tr>
{% endif %}
{% endblock detail_content %}
{% block extra_js %}
<script language="JavaScript">
function checkAll(event) {
// $('[name=materias_ordem_exp]').each(function() {
// alert($(this).attr("class"));
// if ($(this).css("display") != "none") {
// $(this).prop('checked', event.target.checked ? 'checked': null);
// $(this).trigger('click');
// if ($(this).css("display") != "none") {
// $(this).trigger('click');
//
// $("." + $(this).attr("class")).removeClass("checked");
// alert("Display none");
// }
// }
// });
$('[name=materias_ordem_exp]').each(function() {
$(this).prop('checked', event.target.checked ? 'checked': null);
$(this).trigger('click');
});
}
function escondeMateria(tipo) {
$(".tipo" + tipo).removeClass("checked");
$('[name=materias_ordem_exp]').each(function() {
if ($(this).hasClass("tipo" + tipo)) {
$(this).prop('checked', false);
// $(this).prop('checked', event.target.checked ? 'checked': null);
// $(this).trigger('click');
}
});
$(".tipo" + tipo).toggle();
// if ($(".tipo" + tipo).css("display") == "none") {
// if ($(".tipo" + tipo).is( ":hidden" );) {
// $(".tipo" + tipo).removeClass("checked");
// }
}
// $('input[type=submit]').click(function() {
// $('[name=checkbox_materia]').each(function() {
// $(this).show()
// });
// alert ('submit');
// });
</script>
{% endblock %}
Loading…
Cancel
Save