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. 8
      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 import forms
from django.forms import ModelChoiceField from django.forms import ModelChoiceField
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.db.models import Q
from sapl.audiencia.models import AudienciaPublica from sapl.audiencia.models import AudienciaPublica
from sapl.base.models import Autor from sapl.base.models import Autor
@ -14,7 +15,7 @@ from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, MateriaE
StatusTramitacao, TipoMateriaLegislativa StatusTramitacao, TipoMateriaLegislativa
from sapl.norma.models import NormaJuridica from sapl.norma.models import NormaJuridica
from sapl.protocoloadm.models import DocumentoAdministrativo 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, \ from sapl.utils import FilterOverridesMetaMixin, choice_anos_com_normas, qs_override_django_filter, \
choice_anos_com_materias, choice_tipos_normas, autor_label, autor_modal 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): class RelatorioVotacoesNominaisFilterSet(django_filters.FilterSet):
@property tipo_id = django_filters.ModelChoiceFilter(
def qs(self): queryset=TipoMateriaLegislativa.objects.all(),
parent = super(RelatorioVotacoesNominaisFilterSet, self).qs method='ordem_or_expediente',
return parent.distinct().order_by('-votacao_id', 'parlamentar') 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): class Meta(FilterOverridesMetaMixin):
model = VotoParlamentar model = RegistroVotacao
fields = ['data_hora'] fields = ['data_hora']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super( super().__init__(*args, **kwargs)
RelatorioVotacoesNominaisFilterSet, self
).__init__(*args, **kwargs)
self.filters['data_hora'].label = 'Período (Data Inicial - Data Final)' 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 "> row0= to_row([('tipo_id', 6), ('numero', 3), ('ano', 3)])
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>')
row1 = to_row([('data_hora', 12)]) row1 = to_row([('data_hora', 12)])
buttons = FormActions( buttons = FormActions(
*[ *[
HTML(''' HTML("""
<div class="form-check"> <div class="form-check">
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio"> <input name="relatorio" type="checkbox" class="form-check-input" id="relatorio">
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label> <label class="form-check-label" for="relatorio">Gerar relatório PDF</label>
</div> </div>
''') """)
], ],
Submit('pesquisar', _('Pesquisar'), css_class='float-right', Submit('pesquisar', _('Pesquisar'), css_class='float-right',
onclick='return true;'), onclick='return true;'),

1
sapl/relatorios/urls.py

@ -101,3 +101,4 @@ urlpatterns = [
url(r'^sistema/relatorios/normas-por-autor$', url(r'^sistema/relatorios/normas-por-autor$',
RelatorioNormasPorAutorView.as_view(), name='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): class RelatorioVotacoesNominaisView(RelatorioMixin, VotacoesMultiFormatOutputMixin, FilterView):
model = VotoParlamentar
filterset_class = RelatorioVotacoesNominaisFilterSet filterset_class = RelatorioVotacoesNominaisFilterSet
template_name = 'relatorios/RelatorioVotacoesNominais_filter.html' template_name = 'relatorios/RelatorioVotacoesNominais_filter.html'
relatorio = relatorio_votacao_nominal relatorio = relatorio_votacao_nominal
paginate_by = 20
fields_base_report = [ fields_base_report = [
'votacao_id', 'votacao', 'parlamentar__nome_parlamentar', 'voto' 'votacao_id', 'votacao', 'parlamentar__nome_parlamentar', 'voto'
@ -1901,10 +1901,18 @@ class RelatorioVotacoesNominaisView(RelatorioMixin, VotacoesMultiFormatOutputMix
'json': fields_base_report, '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): def get_context_data(self, **kwargs):
context = super( context = super().get_context_data(**kwargs)
RelatorioVotacoesNominaisView, self
).get_context_data(**kwargs)
context['title'] = _('Votações Nominais') context['title'] = _('Votações Nominais')
@ -1912,44 +1920,41 @@ class RelatorioVotacoesNominaisView(RelatorioMixin, VotacoesMultiFormatOutputMix
return context return context
query_dict = self.request.GET.copy() 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) context['show_results'] = show_results_filter_set(query_dict)
data_inicial = self.request.GET['data_hora_0'] data_inicial = self.request.GET.get('data_hora_0', '')
data_final = self.request.GET['data_hora_1'] data_final = self.request.GET.get('data_hora_1', '')
if not data_inicial: if not data_inicial:
data_inicial = "Data Inicial não definida" data_inicial = "Data Inicial não definida"
if not data_final: if not data_final:
data_final = "Data Final não definida" data_final = "Data Final não definida"
context['periodo'] = ( context['periodo'] = f"{data_inicial} - {data_final}"
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']: if tipo_id:
object_list = context['object_list']
if self.request.GET['tipo_materia']:
tipo_id = self.request.GET['tipo_materia']
context['tipo_materia'] = TipoMateriaLegislativa.objects.get(id=tipo_id) context['tipo_materia'] = TipoMateriaLegislativa.objects.get(id=tipo_id)
object_list = object_list.filter( if numero:
Q(ordem__materia__tipo_id=tipo_id) | context['numero'] = int(numero)
Q(expediente__materia__tipo_id=tipo_id)) if ano:
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']
context['ano'] = 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'] = paginator.count
context['qtde_votacoes'] = context['object_list'].distinct('votacao_id').count() else:
self.paginate_by = None
context['qtde_votacoes'] = len(context['object_list'])
return context return context

2
sapl/sessao/models.py

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

8
sapl/templates/materia/materialegislativa_filter.html

@ -116,14 +116,14 @@
{% for rv in m.registrovotacao_set.all %} {% for rv in m.registrovotacao_set.all %}
{% if rv.ordem %} {% if rv.ordem %}
<a href="{% url 'sapl.sessao:ordemdia_list' rv.ordem.sessao_plenaria_id %}">{{ rv.ordem.sessao_plenaria.data_inicio }}</a> <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 }})"> - <a id="link_votacao_nominal_{{ rv.id }}" class="link_votacao_nominal" href="#" onclick="votacaoNominal({{ rv.id }})">
Votação Nominal >>> Votação Nominal >>>
</a> </a>
<div id="div_{{ rv.id }}" style="display:none"> <div id="div_{{ rv.id }}" style="display:none">
<b>{{ rv.ordem.resultado }}</b><br /> <b>{{ rv.ordem.resultado }}</b><br />
<ul id="ul_{{ rv.id }}"style="columns: 2; list-style-type: none;"> <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> <li>{{ voto.parlamentar }} - <b>{{ voto.voto }}</b></li>
{% endfor %} {% endfor %}
</ul> </ul>
@ -131,14 +131,14 @@
{% endif %} {% endif %}
{% elif rv.expediente %} {% elif rv.expediente %}
<a href="{% url 'sapl.sessao:expedientemateria_list' rv.expediente.sessao_plenaria_id %}">{{ rv.expediente.sessao_plenaria.data_inicio }}</a> <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 }})"> - <a id="link_votacao_nominal_{{ rv.id }}" class="link_votacao_nominal" href="#" onclick="votacaoNominal({{ rv.id }})">
Votação Nominal >>> Votação Nominal >>>
</a> </a>
<div id="div_{{ rv.id }}" style="display:none"> <div id="div_{{ rv.id }}" style="display:none">
<b>{{ rv.expediente.resultado }}</b><br /> <b>{{ rv.expediente.resultado }}</b><br />
<ul id="ul_{{ rv.id }}"style="columns: 2; list-style-type: none;"> <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> <li>{{ voto.parlamentar }} - <b>{{ voto.voto }}</b></li>
{% endfor %} {% endfor %}
</ul> </ul>

45
sapl/templates/relatorios/RelatorioVotacoesNominais_filter.html

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

32
sapl/templates/relatorios/relatorio_votacao_nominal.html

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

Loading…
Cancel
Save