Browse Source

fix: não exibe 'Não votou' no painel para matérias sem voto individual

O painel só deve marcar "Não votou" quando a matéria tem voto nominal
de fato. Para Leitura, Simbólica, Secreta ou quando não há matéria
aberta (ex.: sessão solene), tipo_votacao chega como 'Leitura' ou fica
ausente na resposta, e o parlamentar nunca recebe um voto — o que
antes caía no fallback de show_voto() e rotulava incorretamente todos
os presentes como "Não votou".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
fix/painel-registro-votacao-trava
Edward Ribeiro 8 hours ago
parent
commit
c87922660b
  1. 45
      sapl/painel/tests/tests.py
  2. 12
      sapl/templates/painel/index.html

45
sapl/painel/tests/tests.py

@ -14,6 +14,7 @@ from sapl.sessao.models import (OrdemDia, PresencaOrdemDia, SessaoPlenaria,
VotoParlamentar)
NOMINAL = 2
LEITURA = 4
def _sessao_plenaria():
@ -38,6 +39,14 @@ def _ordem_nominal_aberta(registro_aberto=False):
return sessao, ordem
def _ordem_leitura_aberta():
sessao = _sessao_plenaria()
materia = _materia()
ordem = baker.make(OrdemDia, sessao_plenaria=sessao, materia=materia,
tipo_votacao=LEITURA, votacao_aberta=True)
return sessao, ordem
def _votante(sessao, admin_user):
parlamentar = baker.make(Parlamentar, ativo=True)
baker.make(PresencaOrdemDia, sessao_plenaria=sessao, parlamentar=parlamentar)
@ -261,6 +270,42 @@ def test_painel_exibe_nao_votou_para_parlamentar_sem_voto(admin_client):
assert 'Não votou'.encode() in painel.content
@pytest.mark.django_db(transaction=False)
def test_dados_painel_leitura_nao_tem_voto_individual(admin_client, admin_user):
"""
Contrato consumido pelo JS do painel (sapl/templates/painel/index.html):
para uma matéria em Leitura, tipo_votacao chega como a string 'Leitura'
(não o código inteiro) e nenhum parlamentar presente recebe um voto
é isso que permite ao JS distinguir "não há voto individual nesta
matéria" de "ainda não votou".
"""
baker.make(ConfiguracoesAplicacao, mostrar_voto=True, mostrar_brasao_painel=False)
sessao, ordem = _ordem_leitura_aberta()
_votante(sessao, admin_user)
dados = admin_client.get(reverse(
'sapl.painel:dados_painel', kwargs={'pk': sessao.pk})).json()
assert dados['tipo_votacao'] == 'Leitura'
assert all(p['voto'] == '' for p in dados['presentes'])
@pytest.mark.django_db(transaction=False)
def test_dados_painel_sem_materia_nao_envia_tipo_votacao(admin_client, admin_user):
"""
Sem nenhuma matéria aberta ou votada/lida (ex.: sessão solene), a
chave tipo_votacao não é enviada o JS trata isso como "sem voto
individual" da mesma forma que trata 'Leitura'.
"""
baker.make(ConfiguracoesAplicacao, mostrar_voto=True, mostrar_brasao_painel=False)
sessao = _sessao_plenaria()
dados = admin_client.get(reverse(
'sapl.painel:dados_painel', kwargs={'pk': sessao.pk})).json()
assert 'tipo_votacao' not in dados
@pytest.mark.django_db(transaction=False)
def test_votante_status_reflete_estado_e_nao_exige_permissao_do_painel():
"""

12
sapl/templates/painel/index.html

@ -313,11 +313,17 @@
if (data["status_painel"] == true) {
mostrar_voto = data["mostrar_voto"];
var tem_voto_individual = data['tipo_votacao'] == 'Nominal';
presentes.append('<table id="parlamentares_list">');
$.each(presentes_list, function (index, parlamentar) {
if (parlamentar.voto == 'Voto Informado' && mostrar_voto == false){
if (!tem_voto_individual){
$('#parlamentares_list').append('<tr><td style="padding-right:20px" >' +
parlamentar.nome +
'</td> <td style="padding-right:20px">' +
parlamentar.partido + '</td> <td style="padding-right:20px">'
+ '</td></tr>')
}
else if (parlamentar.voto == 'Voto Informado' && mostrar_voto == false){
$('#parlamentares_list').append('<tr><td style="padding-right:20px; color:yellow" >' +
parlamentar.nome +
'</td> <td style="padding-right:20px; color:yellow">' +

Loading…
Cancel
Save