Browse Source

feita a tela de votacao em bloco

pull/2416/head
Cesar Carvalho 7 years ago
parent
commit
bf308cec5a
  1. 76
      sapl/sessao/forms.py
  2. 12
      sapl/sessao/urls.py
  3. 168
      sapl/sessao/views.py
  4. 4
      sapl/templates/sessao/subnav.yaml
  5. 115
      sapl/templates/sessao/votacao/votacao_bloco_expediente.html
  6. 19
      sapl/templates/sessao/votacao/votacao_bloco_ordem.html

76
sapl/sessao/forms.py

@ -786,3 +786,79 @@ class JustificativaAusenciaForm(ModelForm):
justificativa.materias_do_expediente.clear() justificativa.materias_do_expediente.clear()
justificativa.materias_da_ordem_do_dia.clear() justificativa.materias_da_ordem_do_dia.clear()
return justificativa return justificativa
class VotacaoEmBlocoFilterSet(MateriaLegislativaFilterSet):
o = MateriaPesquisaOrderingFilter()
tramitacao__status = django_filters.ModelChoiceFilter(
required=True,
queryset=StatusTramitacao.objects.all(),
label=_('Status da Matéria'))
class Meta:
model = MateriaLegislativa
fields = ['tramitacao__status',
'numero',
'numero_protocolo',
'ano',
'tipo',
'data_apresentacao',
'data_publicacao',
'autoria__autor__tipo',
# FIXME 'autoria__autor__partido',
'relatoria__parlamentar_id',
'local_origem_externa',
'em_tramitacao',
]
def __init__(self, *args, **kwargs):
super(MateriaLegislativaFilterSet, self).__init__(*args, **kwargs)
self.filters['tipo'].label = 'Tipo de Matéria'
self.filters['autoria__autor__tipo'].label = 'Tipo de Autor'
# self.filters['autoria__autor__partido'].label = 'Partido do Autor'
self.filters['relatoria__parlamentar_id'].label = 'Relatoria'
row1 = to_row(
[('tramitacao__status', 12)])
row2 = to_row(
[('tipo', 12)])
row3 = to_row(
[('numero', 4),
('ano', 4),
('numero_protocolo', 4)])
row4 = to_row(
[('data_apresentacao', 6),
('data_publicacao', 6)])
row5 = to_row(
[('autoria__autor', 0),
(Button('pesquisar',
'Pesquisar Autor',
css_class='btn btn-primary btn-sm'), 2),
(Button('limpar',
'limpar Autor',
css_class='btn btn-primary btn-sm'), 10)])
row6 = to_row(
[('autoria__autor__tipo', 6),
# ('autoria__autor__partido', 6)
])
row7 = to_row(
[('relatoria__parlamentar_id', 6),
('local_origem_externa', 6)])
row8 = to_row(
[('em_tramitacao', 6),
('o', 6)])
row9 = to_row(
[('ementa', 12)])
self.form.helper = FormHelper()
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Pesquisa de Matéria'),
row1, row2, row3,
HTML(autor_label),
HTML(autor_modal),
row4, row5, row6, row7, row8, row9,
form_actions(label='Pesquisar'))
)

12
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,
VotacaoEmBlocoOrdemDia, VotacaoEmBlocoExpediente)
from .apps import AppConfig from .apps import AppConfig
@ -112,9 +113,12 @@ urlpatterns = [
url(r'^sessao/(?P<pk>\d+)/presencaordemdia$', url(r'^sessao/(?P<pk>\d+)/presencaordemdia$',
PresencaOrdemDiaView.as_view(), PresencaOrdemDiaView.as_view(),
name='presencaordemdia'), name='presencaordemdia'),
url(r'^sessao/(?P<pk>\d+)/votacao-bloco$', url(r'^sessao/(?P<pk>\d+)/votacao_bloco_ordem_dia$',
AdicionarVariasMateriasOrdemDia.as_view(), VotacaoEmBlocoOrdemDia.as_view(),
name='votacao-bloco'), name='votacao_bloco_ordemdia'),
url(r'^sessao/(?P<pk>\d+)/votacao_bloco_expediente$',
VotacaoEmBlocoExpediente.as_view(),
name='votacao_bloco_expediente'),
url(r'^sessao/(?P<pk>\d+)/resumo$', url(r'^sessao/(?P<pk>\d+)/resumo$',
ResumoView.as_view(), name='resumo'), ResumoView.as_view(), name='resumo'),
url(r'^sessao/(?P<pk>\d+)/resumo_ata$', url(r'^sessao/(?P<pk>\d+)/resumo_ata$',

168
sapl/sessao/views.py

@ -42,7 +42,7 @@ from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm,
MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet,
PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet, PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet,
SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm,
VotacaoNominalForm) VotacaoNominalForm, VotacaoEmBlocoFilterSet)
from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria,
ExpedienteSessao, JustificativaAusencia, OcorrenciaSessao, IntegranteMesa, ExpedienteSessao, JustificativaAusencia, OcorrenciaSessao, IntegranteMesa,
MateriaLegislativa, Orador, OradorExpediente, OrdemDia, MateriaLegislativa, Orador, OradorExpediente, OrdemDia,
@ -3217,6 +3217,168 @@ class JustificativaAusenciaCrud(MasterDetailCrud):
pass pass
class VotacaoEmBloco(PermissionRequiredForAppCrudMixin, class VotacaoEmBlocoExpediente(PermissionRequiredForAppCrudMixin,
MateriaLegislativaPesquisaView): MateriaLegislativaPesquisaView):
pass
filterset_class = VotacaoEmBlocoFilterSet
template_name = 'sessao/votacao/votacao_bloco_expediente.html'
app_label = AppConfig.label
logger = logging.getLogger(__name__)
def get_filterset_kwargs(self, filterset_class):
super(VotacaoEmBlocoExpediente,
self).get_filterset_kwargs(filterset_class)
kwargs = {'data': self.request.GET or None}
qs = self.get_queryset()
if 'tramitacao__status' in self.request.GET:
if self.request.GET['tramitacao__status']:
lista_status = filtra_tramitacao_status(
self.request.GET['tramitacao__status'])
lista_materias_adicionadas = retira_materias_ja_adicionadas(
self.kwargs['pk'], ExpedienteMateria)
qs = qs.filter(id__in=lista_status).exclude(
id__in=lista_materias_adicionadas).distinct()
kwargs.update({
'queryset': qs,
})
return kwargs
def get_context_data(self, **kwargs):
context = super(MateriaLegislativaPesquisaView,
self).get_context_data(**kwargs)
context['title'] = _('Pesquisar Matéria Legislativa')
self.filterset.form.fields['o'].label = _('Ordenação')
qr = self.request.GET.copy()
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
context['pk_sessao'] = self.kwargs['pk']
return context
def post(self, request, *args, **kwargs):
marcadas = request.POST.getlist('materia_id')
username = request.user.username
for m in marcadas:
try:
tipo_votacao = request.POST['tipo_votacao_%s' % m]
msg = _('%s adicionado(a) com sucesso!'
% MateriaLegislativa.objects.get(id=m))
messages.add_message(request, messages.SUCCESS, msg)
self.logger.info("user=" + username + ". MateriaLegislativa de id={} adicionado(a) com sucesso!".format(m))
except MultiValueDictKeyError:
msg = _('Formulário Inválido. Você esqueceu de selecionar ' +
'%s' %
MateriaLegislativa.objects.get(id=m))
messages.add_message(request, messages.ERROR, msg)
self.logger.error("user=" + username + '. Formulário Inválido. Você esqueceu de ' +
'selecionar o tipo de votação de MateriaLegislativa de id={}.'.format(m))
return self.get(request, self.kwargs)
if tipo_votacao:
lista_materias_expediente = ExpedienteMateria.objects.filter(
sessao_plenaria_id=self.kwargs[
'pk'])
materia = MateriaLegislativa.objects.get(id=m)
expediente = ExpedienteMateria()
expediente.sessao_plenaria_id = self.kwargs['pk']
expediente.materia_id = materia.id
if lista_materias_expediente:
posicao = lista_materias_expediente.last().numero_ordem + 1
expediente.numero_ordem = posicao
else:
expediente.numero_ordem = 1
expediente.data_ordem = timezone.now()
expediente.tipo_votacao = request.POST['tipo_votacao_%s' % m]
expediente.save()
pk = self.kwargs['pk']
return HttpResponseRedirect(
reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': pk}))
class VotacaoEmBlocoOrdemDia(VotacaoEmBlocoExpediente):
filterset_class = VotacaoEmBlocoFilterSet
template_name = 'sessao/votacao/votacao_bloco_ordem.html'
app_label = AppConfig.label
logger = logging.getLogger(__name__)
def get_filterset_kwargs(self, filterset_class):
super(VotacaoEmBlocoExpediente,
self).get_filterset_kwargs(filterset_class)
kwargs = {'data': self.request.GET or None}
qs = self.get_queryset()
if 'tramitacao__status' in self.request.GET:
if self.request.GET['tramitacao__status']:
lista_status = filtra_tramitacao_status(
self.request.GET['tramitacao__status'])
lista_materias_adicionadas = retira_materias_ja_adicionadas(
self.kwargs['pk'], OrdemDia)
qs = qs.filter(id__in=lista_status).exclude(
id__in=lista_materias_adicionadas).distinct()
kwargs.update({
'queryset': qs,
})
return kwargs
def post(self, request, *args, **kwargs):
marcadas = request.POST.getlist('materia_id')
username = request.user.username
for m in marcadas:
try:
tipo_votacao = request.POST['tipo_votacao_%s' % m]
msg = _('%s adicionado(a) com sucesso!'
% MateriaLegislativa.objects.get(id=m))
messages.add_message(request, messages.SUCCESS, msg)
self.logger.debug('user=' + username + '. MateriaLegislativa de id={} adicionado(a) com sucesso!'.format(m))
except MultiValueDictKeyError:
msg = _('Formulário Inválido. Você esqueceu de selecionar ' +
'o tipo de votação de %s' %
MateriaLegislativa.objects.get(id=m))
messages.add_message(request, messages.ERROR, msg)
self.logger.error('user=' + username + '. Formulário Inválido. Você esqueceu de selecionar '
'o tipo de votação de MateriaLegislativa com id={}'.format(m))
return self.get(request, self.kwargs)
if tipo_votacao:
lista_materias_ordem_dia = OrdemDia.objects.filter(
sessao_plenaria_id=self.kwargs[
'pk'])
materia = MateriaLegislativa.objects.get(id=m)
ordem_dia = OrdemDia()
ordem_dia.sessao_plenaria_id = self.kwargs['pk']
ordem_dia.materia_id = materia.id
if lista_materias_ordem_dia:
posicao = lista_materias_ordem_dia.last().numero_ordem + 1
ordem_dia.numero_ordem = posicao
else:
ordem_dia.numero_ordem = 1
ordem_dia.data_ordem = timezone.now()
ordem_dia.tipo_votacao = tipo_votacao
ordem_dia.save()
return HttpResponseRedirect(
reverse('sapl.sessao:ordemdia_list', kwargs=self.kwargs))

4
sapl/templates/sessao/subnav.yaml

@ -23,6 +23,8 @@
url: expedientemateria_list url: expedientemateria_list
- title: {% trans 'Oradores do Expediente' %} - title: {% trans 'Oradores do Expediente' %}
url: oradorexpediente_list url: oradorexpediente_list
- title: {% trans 'Votação em Bloco' %}
url: votacao_bloco_expediente
- title: {% trans 'Ordem do Dia' %} - title: {% trans 'Ordem do Dia' %}
children: children:
@ -31,7 +33,7 @@
- title: {% trans 'Presença Ordem do Dia' %} - title: {% trans 'Presença Ordem do Dia' %}
url: presencaordemdia url: presencaordemdia
- title: {% trans 'Votação em Bloco' %} - title: {% trans 'Votação em Bloco' %}
url: votacao-bloco url: votacao_bloco_ordemdia
- title: {% trans 'Painel Eletrônico' %} - title: {% trans 'Painel Eletrônico' %}
url: painel url: painel

115
sapl/templates/sessao/votacao/votacao_bloco_expediente.html

@ -0,0 +1,115 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %}{% endblock %}
{% block sections_nav %}
{% endblock %}
{% block detail_content %}
{% block buttons %}
{% if filter_url and not filter.form.errors %}
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'sapl.sessao:votacao_bloco_expediente' pk_sessao %}" class="btn btn-default">{% trans 'Fazer nova pesquisa' %}</a>
</div>
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'sapl.sessao:expedientemateria_list' pk_sessao %}" class="btn btn-default">{% trans 'Matérias do Expediente' %}</a>
</div>
{% endif %}
{% endblock %}
{% if filter.form.errors %}
{% crispy filter.form %}
{% else %}
{% if not filter_url %}
{% crispy filter.form %}
{% endif %}
{% endif %}
<p></p>
{% if filter_url and not filter.form.errors %}
{% if paginator.count %}
<form method="POST" enctype="application/x-www-form-urlencoded">
{% csrf_token %}
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<td><h3>{% trans "Tipo de Votação" %}</h3></td>
</tr>
</thead>
<tr>
<td class="col-md-12">
<input type="radio" name="tipo_votacao_{{m.id}}" id="tipo_votacao_{{m.id}}" value="1"> <label for="tipo">Simbólica</label>
</br>
<input type="radio" name="tipo_votacao_{{m.id}}" id="tipo_votacao_{{m.id}}" value="2"> <label for="tipo">Nominal</label>
</br>
<input type="radio" name="tipo_votacao_{{m.id}}" id="tipo_votacao_{{m.id}}" value="3"> <label for="tipo">Secreta</label>
</td>
</tr>
</table>
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<td><h3>{% trans "Matérias" %}</h3></td>
</tr>
</thead>
{% if paginator.count > 1 %}
<h3>{% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}</h3>
{% elif paginator.count == 1 %}
<h3>{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}</h3>
{% endif %}
<br>
<h3>Selecione a(s) matéria(s) desejada(s).</h3>
{% for m in page_obj %}
<tr>
<td>
<input type="checkbox" name="materia_id" id="{{m.id}}" value="{{m.id}}" {% if check %} checked {% endif %}>
<strong><a href="{% url 'sapl.materia:materialegislativa_detail' m.id %}">{{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}</strong></a></br>
<strong>Autores:</strong>
{% for a in m.autoria_set.all %}
{% if not forloop.first %}
, &nbsp;&nbsp; {{a.autor|default_if_none:""}}
{% else %}
&nbsp;{{a.autor|default_if_none:""}}
{% endif %}
{% endfor %}
</br>
<strong>Localização Atual:</strong> &nbsp;{{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não informado"}}</br>
<strong>Status:</strong> &nbsp;{{m.tramitacao_set.last.status|default_if_none:"Não informado"}}</br>
<strong>Data da última Tramitação:</strong> &nbsp;{{m.tramitacao_set.last.data_tramitacao|default_if_none:"Não informado"}}</br>
<strong>Ementa:</strong>&nbsp;{{ m.ementa|safe }}</br>
<p></p>
</td>
</tr>
{% endfor %}
</table>
<input type="submit" value="Registrar votação" class="btn btn-primary"S>
</form>
{% else %}
<table class="table table-striped table-bordered">
<tr>
<td>
<h3>Nenhuma matéria encontrada com essas especificações</h3>
</td>
</tr>
</table>
{% endif %}
{% endif %}
{% endblock detail_content %}
{% block extra_js %}
<script>
$(window).on('beforeunload', function () {
$("input[type=submit], input[type=button]").prop("disabled", "disabled");
});
</script>
{% endblock extra_js%}

19
sapl/templates/sessao/votacao/votacao_bloco_ordem.html

@ -0,0 +1,19 @@
{% extends "sessao/votacao/votacao_bloco_expediente.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block buttons %}
{% if filter_url and not filter.form.errors %}
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'sapl.sessao:votacao_bloco_ordemdia' pk_sessao %}" class="btn btn-default">{% trans 'Fazer nova pesquisa' %}</a>
</div>
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'sapl.sessao:ordemdia_list' pk_sessao %}" class="btn btn-default">{% trans 'Matérias da Ordem do Dia' %}</a>
</div>
{% endif %}
{% endblock %}
Loading…
Cancel
Save