Browse Source

Alterações solicitadas - Relatório de Votações Nominais

pull/3785/head
root 2 months ago
parent
commit
d27dc5ad0e
  1. 64
      sapl/relatorios/forms.py
  2. 1
      sapl/relatorios/urls.py
  3. 67
      sapl/relatorios/views.py
  4. 2
      sapl/sessao/models.py
  5. 26
      sapl/templates/materia/materialegislativa_filter.html
  6. 45
      sapl/templates/relatorios/RelatorioVotacoesNominais_filter.html
  7. 32
      sapl/templates/relatorios/relatorio_votacao_nominal.html

64
sapl/relatorios/forms.py

@ -5,6 +5,7 @@ from crispy_forms.layout import (HTML, Button, Fieldset,
from django import forms
from django.forms import ModelChoiceField
from django.utils.translation import ugettext_lazy as _
from django.db.models import Q
from sapl.audiencia.models import AudienciaPublica
from sapl.base.models import Autor
@ -14,7 +15,7 @@ from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, MateriaE
StatusTramitacao, TipoMateriaLegislativa
from sapl.norma.models import NormaJuridica
from sapl.protocoloadm.models import DocumentoAdministrativo
from sapl.sessao.models import SessaoPlenaria, VotoParlamentar
from sapl.sessao.models import SessaoPlenaria, VotoParlamentar, RegistroVotacao
from sapl.utils import FilterOverridesMetaMixin, choice_anos_com_normas, qs_override_django_filter, \
choice_anos_com_materias, choice_tipos_normas, autor_label, autor_modal
@ -71,51 +72,56 @@ class RelatorioDocumentosAcessoriosFilterSet(django_filters.FilterSet):
class RelatorioVotacoesNominaisFilterSet(django_filters.FilterSet):
@property
def qs(self):
parent = super(RelatorioVotacoesNominaisFilterSet, self).qs
return parent.distinct().order_by('-votacao_id', 'parlamentar')
tipo_id = django_filters.ModelChoiceFilter(
queryset=TipoMateriaLegislativa.objects.all(),
method='ordem_or_expediente',
label='Tipo de Matéria',
empty_label="---------"
)
numero = django_filters.NumberFilter(
widget=forms.NumberInput(attrs={'class': 'form-control', 'step': 'any'}),
method='ordem_or_expediente',
label='Número'
)
ano = django_filters.ChoiceFilter(
choices=list(choice_anos_com_materias()),
widget=forms.Select(attrs={'class': 'form-control'}),
method='ordem_or_expediente',
label='Ano da Matéria'
)
def ordem_or_expediente(self, queryset, name, value):
if value:
try:
val = value.id
except AttributeError:
val = value
return queryset.filter(
eval(f'Q(ordem__materia__{name}={val}) | Q(expediente__materia__{name}={val})')
)
return queryset
class Meta(FilterOverridesMetaMixin):
model = VotoParlamentar
model = RegistroVotacao
fields = ['data_hora']
def __init__(self, *args, **kwargs):
super(
RelatorioVotacoesNominaisFilterSet, self
).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
self.filters['data_hora'].label = 'Período (Data Inicial - Data Final)'
tipo_materia = '''<div class="col-md-6"><div id="div_id_tipo_materia" class="form-group"><label for="id_tipo_materia" class="col-form-label ">
Tipo de Matéria Legislativa
</label><div class=""><select name="tipo_materia" class="select form-control" id="id_tipo_materia"><option value="" selected="">---------</option>'''
for tipo in TipoMateriaLegislativa.objects.all():
tipo_materia += '<option value="' + str(tipo.id) + '">' + tipo.descricao + '</option>'
tipo_materia += '</select></div></div></div>'
numero = '''<div id="div_id_numero" class="col-md-3"><label for="id_numero" class="col-form-label ">Número</label>
<div class=""><input type="number" name="numero" step="any" class="numberinput form-control" id="id_numero"></div></div>'''
ano = '''<div id="div_id_ano" class="col-md-3"><label for="id_ano" class="col-form-label ">Ano da Matéria</label>
<div class=""><select name="ano" class="select form-control" id="id_ano"><option value="" selected="">---------</option>'''
for ano_materia in choice_anos_com_materias():
ano += '<option value="' + str(ano_materia[0]) + '">' + str(ano_materia[1]) + '</option>'
ano += '</select></div></div>'
row0= HTML('<div class="row">' + tipo_materia + numero + ano + '</div>')
row0= to_row([('tipo_id', 6), ('numero', 3), ('ano', 3)])
row1 = to_row([('data_hora', 12)])
buttons = FormActions(
*[
HTML('''
HTML("""
<div class="form-check">
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio">
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label>
</div>
''')
""")
],
Submit('pesquisar', _('Pesquisar'), css_class='float-right',
onclick='return true;'),

1
sapl/relatorios/urls.py

@ -101,3 +101,4 @@ urlpatterns = [
url(r'^sistema/relatorios/normas-por-autor$',
RelatorioNormasPorAutorView.as_view(), name='normas_por_autor'),
]

67
sapl/relatorios/views.py

@ -1886,10 +1886,10 @@ class RelatorioDocumentosAcessoriosView(RelatorioMixin, FilterView):
class RelatorioVotacoesNominaisView(RelatorioMixin, VotacoesMultiFormatOutputMixin, FilterView):
model = VotoParlamentar
filterset_class = RelatorioVotacoesNominaisFilterSet
template_name = 'relatorios/RelatorioVotacoesNominais_filter.html'
relatorio = relatorio_votacao_nominal
paginate_by = 20
fields_base_report = [
'votacao_id', 'votacao', 'parlamentar__nome_parlamentar', 'voto'
@ -1901,10 +1901,18 @@ class RelatorioVotacoesNominaisView(RelatorioMixin, VotacoesMultiFormatOutputMix
'json': fields_base_report,
}
def get_queryset(self):
if 'format' in self.request.GET:
self.model = VotoParlamentar
order_fields = ['-votacao_id', 'parlamentar']
else:
self.model = RegistroVotacao
order_fields = ['-id']
qs = self.model.objects.filter(Q(ordem__tipo_votacao=2)|Q(expediente__tipo_votacao=2)).order_by(*order_fields)
return qs
def get_context_data(self, **kwargs):
context = super(
RelatorioVotacoesNominaisView, self
).get_context_data(**kwargs)
context = super().get_context_data(**kwargs)
context['title'] = _('Votações Nominais')
@ -1912,44 +1920,41 @@ class RelatorioVotacoesNominaisView(RelatorioMixin, VotacoesMultiFormatOutputMix
return context
query_dict = self.request.GET.copy()
context['filter_url'] = ('&' + query_dict.urlencode()) if len(query_dict) > 0 else ''
if 'page' in query_dict:
del query_dict['page']
context['filter_url'] = f"&{query_dict.urlencode()}" if query_dict else ''
context['show_results'] = show_results_filter_set(query_dict)
data_inicial = self.request.GET['data_hora_0']
data_final = self.request.GET['data_hora_1']
data_inicial = self.request.GET.get('data_hora_0', '')
data_final = self.request.GET.get('data_hora_1', '')
if not data_inicial:
data_inicial = "Data Inicial não definida"
if not data_final:
data_final = "Data Final não definida"
context['periodo'] = (
data_inicial + ' - ' + data_final
)
context['periodo'] = f"{data_inicial} - {data_final}"
tipo_id = self.request.GET.get('tipo_id')
numero = self.request.GET.get('numero')
ano = self.request.GET.get('ano')
if self.request.GET['tipo_materia'] or self.request.GET['numero'] or self.request.GET['ano']:
object_list = context['object_list']
if self.request.GET['tipo_materia']:
tipo_id = self.request.GET['tipo_materia']
if tipo_id:
context['tipo_materia'] = TipoMateriaLegislativa.objects.get(id=tipo_id)
object_list = object_list.filter(
Q(ordem__materia__tipo_id=tipo_id) |
Q(expediente__materia__tipo_id=tipo_id))
if self.request.GET['numero']:
numero = self.request.GET['numero']
context['numero'] = numero
object_list = object_list.filter(
Q(ordem__materia__numero=numero) |
Q(expediente__materia__numero=numero))
if self.request.GET['ano']:
ano = self.request.GET['ano']
if numero:
context['numero'] = int(numero)
if ano:
context['ano'] = ano
object_list = object_list.filter(
Q(ordem__materia__ano=ano) |
Q(expediente__materia__ano=ano))
context['object_list'] = object_list
if 'relatorio' not in self.request.GET:
paginator = context['paginator']
page_obj = context['page_obj']
context['page_range'] = make_pagination(
page_obj.number, paginator.num_pages)
if not 'format' in query_dict:
context['qtde_votacoes'] = context['object_list'].distinct('votacao_id').count()
context['qtde_votacoes'] = paginator.count
else:
self.paginate_by = None
context['qtde_votacoes'] = len(context['object_list'])
return context

2
sapl/sessao/models.py

@ -699,7 +699,7 @@ class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar
class Meta:
verbose_name = _('Registro de Votação de Parlamentar')
verbose_name_plural = _('Registros de Votações de Parlamentares')
ordering = ('parlamentar',)
ordering = ('id',)
def __str__(self):
return _('Votação: %(votacao)s - Parlamentar: %(parlamentar)s') % {

26
sapl/templates/materia/materialegislativa_filter.html

@ -116,14 +116,14 @@
{% for rv in m.registrovotacao_set.all %}
{% if rv.ordem %}
<a href="{% url 'sapl.sessao:ordemdia_list' rv.ordem.sessao_plenaria_id %}">{{ rv.ordem.sessao_plenaria.data_inicio }}</a>
{% if rv.ordem.get_tipo_votacao_display == 'Nominal' %}
{% if rv.ordem.tipo_votacao == 2 %}
- <a id="link_votacao_nominal_{{ rv.id }}" class="link_votacao_nominal" href="#" onclick="votacaoNominal({{ rv.id }})">
Votação Nominal >>>
</a>
<div id="div_{{ rv.id }}" style="display:none">
<b>{{ rv.ordem.resultado }}</b><br />
<ul id="ul_{{ rv.id }}"style="columns: 2; list-style-type: none;">
{% for voto in rv.ordem.votoparlamentar_set.all %}
{% for voto in rv.ordem.votoparlamentar_set.all|dictsort:"parlamentar.nome_parlamentar" %}
<li>{{ voto.parlamentar }} - <b>{{ voto.voto }}</b></li>
{% endfor %}
</ul>
@ -131,14 +131,14 @@
{% endif %}
{% elif rv.expediente %}
<a href="{% url 'sapl.sessao:expedientemateria_list' rv.expediente.sessao_plenaria_id %}">{{ rv.expediente.sessao_plenaria.data_inicio }}</a>
{% if rv.expediente.get_tipo_votacao_display == 'Nominal' %}
{% if rv.expediente.tipo_votacao == 2 %}
- <a id="link_votacao_nominal_{{ rv.id }}" class="link_votacao_nominal" href="#" onclick="votacaoNominal({{ rv.id }})">
Votação Nominal >>>
</a>
<div id="div_{{ rv.id }}" style="display:none">
<b>{{ rv.expediente.resultado }}</b><br />
<ul id="ul_{{ rv.id }}"style="columns: 2; list-style-type: none;">
{% for voto in rv.expediente.votoparlamentar_set.all %}
{% for voto in rv.expediente.votoparlamentar_set.all|dictsort:"parlamentar.nome_parlamentar" %}
<li>{{ voto.parlamentar }} - <b>{{ voto.voto }}</b></li>
{% endfor %}
</ul>
@ -263,16 +263,16 @@
}
};
function votacaoNominal(id){
$('#div_' + id).toggle();
function votacaoNominal(id){
$('#div_' + id).toggle();
var id_link = "#link_votacao_nominal_" + id;
if ($(id_link).text().indexOf('>>>') > -1){
$(id_link).text($(id_link).text().replace('>>>', '<<<'))
}else{
$(id_link).text($(id_link).text().replace('<<<', '>>>'))
}
};
var id_link = "#link_votacao_nominal_" + id;
if ($(id_link).text().indexOf('>>>') > -1){
$(id_link).text($(id_link).text().replace('>>>', '<<<'))
}else{
$(id_link).text($(id_link).text().replace('<<<', '>>>'))
}
};
</script>
{% endblock extra_js %}

45
sapl/templates/relatorios/RelatorioVotacoesNominais_filter.html

@ -42,38 +42,41 @@
<th>Dados da Votação / Matéria</th>
<th>Parlamentar - Voto</th>
</tr>
</thead> <tbody>
{% for voto in object_list %}
{% ifchanged voto.votacao_id %}
{% if not forloop.first %}
</td></tr>
{% endif %}
<tr><td class="materia" {% comment %}style="max-width: 50%"{% endcomment %}>
{% if voto.ordem %}
<b><a href="{% url 'sapl.materia:materialegislativa_detail' voto.ordem.materia_id %}">{{ voto.ordem.materia }}</a></b> - {{ voto.ordem.materia.ementa }}<br />
<b>Momento da Votação: </b><a href="{% url 'sapl.sessao:ordemdia_list' voto.ordem.sessao_plenaria_id %}">Ordem do Dia</a> -
<a href="{% url 'sapl.sessao:sessaoplenaria_detail' voto.ordem.sessao_plenaria_id %}">{{ voto.ordem.sessao_plenaria }}</a><br />
<b>Data da Votação: </b>{{ voto.data_hora|date:"d/m/Y" }}<br />
<b>Resultado: </b>{{ voto.ordem.resultado }}
</thead>
<tbody>
{% for rv in object_list %}
<tr>
<td class="materia">
{% if rv.ordem %}
<b><a href="{% url 'sapl.materia:materialegislativa_detail' rv.ordem.materia_id %}">{{ rv.ordem.materia }}</a></b> - {{ rv.ordem.materia.ementa }}<br />
<b>Momento da Votação: </b><a href="{% url 'sapl.sessao:ordemdia_list' rv.ordem.sessao_plenaria_id %}">Ordem do Dia</a> -
<a href="{% url 'sapl.sessao:sessaoplenaria_detail' rv.ordem.sessao_plenaria_id %}">{{ rv.ordem.sessao_plenaria }}</a><br />
<b>Data da Votação: </b>{{ rv.data_hora|date:"d/m/Y" }}<br />
<b>Resultado: </b>{{ rv.ordem.resultado }}
{% else %}
<b><a href="{% url 'sapl.materia:materialegislativa_detail' voto.expediente.materia_id %}">{{ voto.expediente.materia }}</a></b> - {{ voto.expediente.materia.ementa }}<br />
<b>Momento da Votação: </b><a href="{% url 'sapl.sessao:expedientemateria_list' voto.expediente.sessao_plenaria_id %}">Expediente</a> -
<a href="{% url 'sapl.sessao:sessaoplenaria_detail' voto.expediente.sessao_plenaria_id %}">{{ voto.expediente.sessao_plenaria }}</a><br />
<b>Data da Votação: </b>{{ voto.data_hora|date:"d/m/Y" }}<br />
<b>Resultado: </b>{{ voto.expediente.resultado }}
<b><a href="{% url 'sapl.materia:materialegislativa_detail' rv.expediente.materia_id %}">{{ rv.expediente.materia }}</a></b> - {{ rv.expediente.materia.ementa }}<br />
<b>Momento da Votação: </b><a href="{% url 'sapl.sessao:expedientemateria_list' rv.expediente.sessao_plenaria_id %}">Expediente</a> -
<a href="{% url 'sapl.sessao:sessaoplenaria_detail' rv.expediente.sessao_plenaria_id %}">{{ rv.expediente.sessao_plenaria }}</a><br />
<b>Data da Votação: </b>{{ rv.data_hora|date:"d/m/Y" }}<br />
<b>Resultado: </b>{{ rv.expediente.resultado }}
{% endif %}
</td><td class="votos" {% comment %}style="width: 50%"{% endcomment %}>
{% endifchanged %}
</td>
<td class="votos">
{% for voto in rv.votoparlamentar_set.all|dictsort:"parlamentar.nome_parlamentar" %}
<span style="white-space: nowrap;">
{{ voto.parlamentar }} - <b>{{ voto.voto }}</b>
</span><br />
{% endfor %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<tr><td><h3 style="text-align: left;">Nenhuma votação encontrada com esses parâmetros.</h3></td></tr><br><br>
{% endif %}
{% endif %}
{% if filter_url %}
{% include "paginacao.html" %}
{% endif %}
{% endblock base_content %}

32
sapl/templates/relatorios/relatorio_votacao_nominal.html

@ -10,38 +10,42 @@
{% if tipo_materia %}
Tipo de matéria: {{ tipo_materia }}<br />
{% endif %}
{% if numero %}
Número: {{ numero }}<br />
{% endif %}
{% if ano %}
Ano: {{ ano }}<br />
{% endif %}
Período: {{ periodo }}<br />
</span>
{% if object_list %}
{% if qtde_votacoes > 1 %}
<h3>Foram encontradas {{qtde_votacoes}} votações.</h3>
{% elif qtde_votacoes == 1 %}
<h3>Foi encontrada {{qtde_votacoes}} votação.</h3>
{% endif %}
{% for voto in object_list %}
{% ifchanged voto.votacao_id %}
{% if not forloop.first %}</ul>{% endif %}
{% for rv in object_list %}
<div style="border-top: 1px solid black;margin-top:0.3cm;font-size:small">
{% if voto.ordem %}
<b>Matéria: {{ voto.ordem.materia }}</b> - {{ voto.ordem.materia.ementa }}<br />
<b>Momento da Votação: </b>Ordem do Dia - {{ voto.ordem.sessao_plenaria }}<br />
<b>Data da Votação: </b>{{ voto.data_hora|date:"d/m/Y" }}<br />
<b>Resultado: </b>{{ voto.ordem.resultado }}<br /><br />
{% if rv.ordem %}
<b>Matéria: {{ rv.ordem.materia }}</b> - {{ rv.ordem.materia.ementa }}<br />
<b>Momento da Votação: </b>Ordem do Dia - {{ rv.ordem.sessao_plenaria }}<br />
<b>Data da Votação: </b>{{ rv.data_hora|date:"d/m/Y" }}<br />
<b>Resultado: </b>{{ rv.ordem.resultado }}<br /><br />
{% else %}
<b>Matéria: {{ voto.expediente.materia }}</b> - {{ voto.expediente.materia.ementa }}<br />
<b>Momento da Votação: </b>Expediente - {{ voto.expediente.sessao_plenaria }}<br />
<b>Data da Votação: </b>{{ voto.data_hora|date:"d/m/Y" }}<br />
<b>Resultado: </b>{{ voto.expediente.resultado }}<br /><br />
<b>Matéria: {{ rv.expediente.materia }}</b> - {{ rv.expediente.materia.ementa }}<br />
<b>Momento da Votação: </b>Expediente - {{ rv.expediente.sessao_plenaria }}<br />
<b>Data da Votação: </b>{{ rv.data_hora|date:"d/m/Y" }}<br />
<b>Resultado: </b>{{ rv.expediente.resultado }}<br /><br />
{% endif %}
</div>
<ul style="columns: 2; list-style-type: none;font-size:small">
{% endifchanged %}
{% for voto in rv.votoparlamentar_set.all|dictsort:"parlamentar.nome_parlamentar" %}
<li>{{ voto.parlamentar }} - <b>{{ voto.voto }}</b></li>
{% endfor %}
</ul>
{% endfor %}
{% else %}
<tr><td><h3 style="text-align: left;">Nenhuma votação encontrada com esses parâmetros.</h3></td></tr><br><br>
{% endif %}

Loading…
Cancel
Save