Browse Source

Merge branch '3.1.x' into ajuste_data_votacoes_nominais

pull/3834/head
Edward 2 days ago
committed by GitHub
parent
commit
4d8a57926e
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      sapl/audiencia/forms.py
  2. 62
      sapl/painel/views.py
  3. 36
      sapl/templates/painel/index.html
  4. 5
      sapl/utils.py

2
sapl/audiencia/forms.py

@ -115,7 +115,7 @@ class AudienciaForm(FileFieldCheckMixin, forms.ModelForm):
numero=materia, numero=materia,
ano=ano_materia, ano=ano_materia,
tipo=tipo_materia) tipo=tipo_materia)
except ObjectDoesNotExist: except (ObjectDoesNotExist, ValueError):
msg = _('A matéria %s%s/%s não existe no cadastro' msg = _('A matéria %s%s/%s não existe no cadastro'
' de matérias legislativas.' % (tipo_materia, materia, ano_materia)) ' de matérias legislativas.' % (tipo_materia, materia, ano_materia))
self.logger.warning( self.logger.warning(

62
sapl/painel/views.py

@ -13,6 +13,7 @@ from django.http.response import Http404, HttpResponseRedirect
from django.shortcuts import render from django.shortcuts import render
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.decorators.cache import never_cache
from sapl.base.models import AppConfig as ConfiguracoesAplicacao from sapl.base.models import AppConfig as ConfiguracoesAplicacao
from sapl.base.models import CasaLegislativa from sapl.base.models import CasaLegislativa
@ -117,7 +118,8 @@ def votacao(context, context_vars):
if voto: if voto:
try: try:
logger.debug("Tentando obter objeto VotoParlamentar com parlamentar={}.".format(context_vars['parlamentar'])) logger.debug(
"Tentando obter objeto VotoParlamentar com parlamentar={}.".format(context_vars['parlamentar']))
voto = voto.get(parlamentar=context_vars['parlamentar']) voto = voto.get(parlamentar=context_vars['parlamentar'])
context.update({'voto_parlamentar': voto.voto}) context.update({'voto_parlamentar': voto.voto})
except ObjectDoesNotExist: except ObjectDoesNotExist:
@ -133,7 +135,31 @@ def votacao(context, context_vars):
'Ordem do Dia/Expediente em votação.'}) 'Ordem do Dia/Expediente em votação.'})
return context, context_vars return context, context_vars
def sessao_votacao(context,context_vars):
@never_cache
@user_passes_test(check_permission)
def painel_view(request, pk):
logger = logging.getLogger(__name__)
utc_now = timezone.now()
local_now = timezone.localtime(utc_now)
utc_offset = int(local_now.utcoffset().total_seconds() / 60)
server_epoch_ms = int(utc_now.timestamp() * 1000)
logger.info(
"painel_view pk=%s utc_now=%s local_now=%s utc_offset=%s server_epoch_ms=%s",
pk, utc_now, local_now, utc_offset, server_epoch_ms
)
context = {'head_title': str(_('Painel Plenário')),
'sessao_id': pk,
'server_epoch_ms': server_epoch_ms,
'utc_offset': utc_offset,
}
return render(request, 'painel/index.html', context)
def sessao_votacao(context, context_vars):
pk = context_vars['sessao'].pk pk = context_vars['sessao'].pk
context.update({'sessao_id': pk}) context.update({'sessao_id': pk})
context.update({'sessao': context_vars['sessao'], context.update({'sessao': context_vars['sessao'],
@ -144,9 +170,9 @@ def sessao_votacao(context,context_vars):
presentes = [] presentes = []
ordem_dia = get_materia_aberta(pk) ordem_dia = get_materia_aberta(pk)
expediente = get_materia_expediente_aberta(pk) expediente = get_materia_expediente_aberta(pk)
errors_msgs = {'materia':'Não há nenhuma matéria aberta.', errors_msgs = {'materia': 'Não há nenhuma matéria aberta.',
'registro':'A votação para esta matéria já encerrou.', 'registro': 'A votação para esta matéria já encerrou.',
'tipo':'A matéria aberta não é do tipo votação nominal.'} 'tipo': 'A matéria aberta não é do tipo votação nominal.'}
materia_aberta = None materia_aberta = None
if ordem_dia: if ordem_dia:
@ -161,7 +187,7 @@ def sessao_votacao(context,context_vars):
'parlamentar_id', flat=True).distinct() 'parlamentar_id', flat=True).distinct()
context_vars.update({'ordem_dia': ordem_dia, context_vars.update({'ordem_dia': ordem_dia,
'expediente':expediente, 'expediente': expediente,
'presentes': presentes}) 'presentes': presentes})
# Verifica votação aberta # Verifica votação aberta
@ -189,7 +215,7 @@ def can_vote(context, context_vars, request):
# Pega sessão # Pega sessão
sessao, msg = votacao_aberta(request) sessao, msg = votacao_aberta(request)
context_vars.update({'sessao':sessao}) context_vars.update({'sessao': sessao})
if sessao and not msg: if sessao and not msg:
context, context_vars = sessao_votacao(context, context_vars) context, context_vars = sessao_votacao(context, context_vars)
elif not sessao and msg: elif not sessao and msg:
@ -248,13 +274,15 @@ def votante_view(request):
elif context_vars['expediente']: elif context_vars['expediente']:
try: try:
logger.info("user=" + username + ". Tentando obter objeto VotoParlamentar para parlamentar={} e expediente={}." logger.info(
"user=" + username + ". Tentando obter objeto VotoParlamentar para parlamentar={} e expediente={}."
.format(context_vars['parlamentar'], context_vars['expediente'])) .format(context_vars['parlamentar'], context_vars['expediente']))
voto = VotoParlamentar.objects.get( voto = VotoParlamentar.objects.get(
parlamentar=context_vars['parlamentar'], parlamentar=context_vars['parlamentar'],
expediente=context_vars['expediente']) expediente=context_vars['expediente'])
except ObjectDoesNotExist: except ObjectDoesNotExist:
logger.error("user=" + username + ". Erro ao obter VotoParlamentar para parlamentar={} e expediente={}. Criando objeto." logger.error(
"user=" + username + ". Erro ao obter VotoParlamentar para parlamentar={} e expediente={}. Criando objeto."
.format(context_vars['parlamentar'], context_vars['expediente'])) .format(context_vars['parlamentar'], context_vars['expediente']))
voto = VotoParlamentar.objects.create( voto = VotoParlamentar.objects.create(
parlamentar=context_vars['parlamentar'], parlamentar=context_vars['parlamentar'],
@ -263,7 +291,8 @@ def votante_view(request):
ip=get_client_ip(request), ip=get_client_ip(request),
expediente=context_vars['expediente']) expediente=context_vars['expediente'])
else: else:
logger.info("user=" + username + ". VotoParlamentar para parlamentar={} e expediente={} obtido com sucesso." logger.info(
"user=" + username + ". VotoParlamentar para parlamentar={} e expediente={} obtido com sucesso."
.format(context_vars['parlamentar'], context_vars['expediente'])) .format(context_vars['parlamentar'], context_vars['expediente']))
voto.voto = request.POST['voto'] voto.voto = request.POST['voto']
voto.ip = get_client_ip(request) voto.ip = get_client_ip(request)
@ -276,15 +305,6 @@ def votante_view(request):
return render(request, template_name, context) return render(request, template_name, context)
@user_passes_test(check_permission)
def painel_view(request, pk):
now = timezone.localtime(timezone.now())
utc_offset = now.utcoffset().total_seconds() / 60
context = {'head_title': str(_('Painel Plenário')), 'sessao_id': pk, 'utc_offset': utc_offset }
return render(request, 'painel/index.html', context)
@user_passes_test(check_permission) @user_passes_test(check_permission)
def switch_painel(request): def switch_painel(request):
sessao = SessaoPlenaria.objects.get(id=request.POST['pk_sessao']) sessao = SessaoPlenaria.objects.get(id=request.POST['pk_sessao'])
@ -361,7 +381,6 @@ def get_presentes(pk, response, materia):
oradores_list = [] oradores_list = []
for o in oradores: for o in oradores:
oradores_list.append( oradores_list.append(
{ {
'nome': o.parlamentar.nome_parlamentar, 'nome': o.parlamentar.nome_parlamentar,
@ -515,7 +534,8 @@ def get_votos(response, materia, mostrar_voto):
response['presentes'][i]['voto'] = votos_parlamentares.get( response['presentes'][i]['voto'] = votos_parlamentares.get(
parlamentar_id=p['parlamentar_id']).voto parlamentar_id=p['parlamentar_id']).voto
except ObjectDoesNotExist: except ObjectDoesNotExist:
logger.error("Votos do parlamentar (id={}) não encontrados. Retornado None.".format(p['parlamentar_id'])) logger.error(
"Votos do parlamentar (id={}) não encontrados. Retornado None.".format(p['parlamentar_id']))
response['presentes'][i]['voto'] = None response['presentes'][i]['voto'] = None
response.update({ response.update({

36
sapl/templates/painel/index.html

@ -159,22 +159,27 @@
// biblioteca moment.js é recomendada, pois ela trata data e hora // biblioteca moment.js é recomendada, pois ela trata data e hora
// melhor que o Date() do JS. // melhor que o Date() do JS.
$("#date").append(moment().format("DD/MM/YY"));
var offset = parseFloat({{ utc_offset }});
//TODO: replace by a fancy jQuery clock //TODO: replace by a fancy jQuery clock
function checkTime(i) { function checkTime(i) {
if (i<10) {i = "0" + i}; // add zero in front of numbers < 10 if (i<10) {i = "0" + i}; // add zero in front of numbers < 10
return i; return i;
} }
const utcOffset = {{ utc_offset }};
const serverEpochMs = {{ server_epoch_ms }};
const pageLoadedAtMs = performance.now();
function startTime() { function startTime() {
var today = moment.utc().utcOffset(offset).format("HH:mm:ss"); const elapsedMs = performance.now() - pageLoadedAtMs;
$("#relogio").text(today)
var t = setTimeout(function(){ const now = moment
startTime() .utc(serverEpochMs + elapsedMs)
}, 500); .utcOffset(utcOffset);
$("#date").text(now.format("DD/MM/YY"));
$("#relogio").text(now.format("HH:mm:ss"));
setTimeout(startTime, 500);
} }
startTime(); startTime();
@ -261,11 +266,19 @@
var aparte_previous; var aparte_previous;
var consideracoes_previous; var consideracoes_previous;
const POLL_INTERVAL_MS =
window.location.hostname === "localhost" ? 2000 : 500;
var counter = 1; var counter = 1;
(function poll() { (function poll() {
$.ajax({ $.ajax({
url: "{% url 'sapl.painel:dados_painel' sessao_id %}", url: "{% url 'sapl.painel:dados_painel' sessao_id %}",
type: "GET", type: "GET",
dataType: "json",
complete: function() {
setTimeout(poll, POLL_INTERVAL_MS);
},
timeout: 20000, // TODO: decrease
success: function(data) { success: function(data) {
$("#sessao_plenaria").text(data["sessao_plenaria"]) $("#sessao_plenaria").text(data["sessao_plenaria"])
$("#sessao_plenaria_data").text("Data Início: " + data["sessao_plenaria_data"]) $("#sessao_plenaria_data").text("Data Início: " + data["sessao_plenaria_data"])
@ -486,10 +499,7 @@
}, },
error: function(err) { error: function(err) {
console.error(err); console.error(err);
}, }
dataType: "json",
complete: setTimeout(function() {poll()}, 500),
timeout: 20000 // TODO: decrease
}) })
})(); })();
}); });

5
sapl/utils.py

@ -1395,8 +1395,9 @@ class MultiFormatOutputMixin:
return {fmt: fields for fmt in self.formats_impl} return {fmt: fields for fmt in self.formats_impl}
def render_to_response(self, context, **response_kwargs): def render_to_response(self, context, **response_kwargs):
format_result = getattr(self.request, self.request.method).get( # HEAD shares query params with GET; Django has no request.HEAD attribute.
'format', None) _method = 'GET' if self.request.method == 'HEAD' else self.request.method
format_result = getattr(self.request, _method).get('format', None)
if format_result: if format_result:
if format_result not in self.formats_impl: if format_result not in self.formats_impl:

Loading…
Cancel
Save