diff --git a/sapl/painel/views.py b/sapl/painel/views.py
index d488294b2..aaebfdf33 100644
--- a/sapl/painel/views.py
+++ b/sapl/painel/views.py
@@ -13,6 +13,7 @@ from django.http.response import Http404, HttpResponseRedirect
from django.shortcuts import render
from django.utils import timezone
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 CasaLegislativa
@@ -59,11 +60,11 @@ def votacao_aberta(request):
kwargs={'pk': v.id}),
v.__str__()))
logger.info('user=' + username + '. Existe mais de uma votações aberta. Elas se encontram '
- 'nas seguintes Sessões: ' + ', '.join(msg_abertas) + '. '
- 'Para votar, peça para que o Operador feche-as.')
+ 'nas seguintes Sessões: ' + ', '.join(msg_abertas) + '. '
+ 'Para votar, peça para que o Operador feche-as.')
msg = _('Existe mais de uma votações aberta. Elas se encontram '
'nas seguintes Sessões: ' + ', '.join(msg_abertas) + '. '
- 'Para votar, peça para que o Operador feche-as.')
+ 'Para votar, peça para que o Operador feche-as.')
messages.add_message(request, messages.INFO, msg)
return None, msg
@@ -79,9 +80,9 @@ def votacao_aberta(request):
if numero_materias_abertas > 1:
logger.info('user=' + username + '. Existe mais de uma votação aberta na Sessão: ' +
('''
%s''' % (
- reverse('sapl.sessao:sessaoplenaria_detail',
- kwargs={'pk': votacoes_abertas.first().id}),
- votacoes_abertas.first().__str__())))
+ reverse('sapl.sessao:sessaoplenaria_detail',
+ kwargs={'pk': votacoes_abertas.first().id}),
+ votacoes_abertas.first().__str__())))
msg = _('Existe mais de uma votação aberta na Sessão: ' +
('''%s''' % (
reverse('sapl.sessao:sessaoplenaria_detail',
@@ -103,8 +104,8 @@ def votacao(context, context_vars):
context_vars.update({'parlamentar': parlamentar})
else:
context.update({'error_message':
- 'Não há presentes na Sessão com a '
- 'matéria em votação.'})
+ 'Não há presentes na Sessão com a '
+ 'matéria em votação.'})
if parlamentar_presente:
voto = []
@@ -117,23 +118,41 @@ def votacao(context, context_vars):
if voto:
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'])
context.update({'voto_parlamentar': voto.voto})
except ObjectDoesNotExist:
logger.error("Voto do parlamentar {} não computado.".format(context_vars['parlamentar']))
context.update(
{'voto_parlamentar': 'Voto não '
- 'computado.'})
+ 'computado.'})
else:
logger.error("Parlamentar com id={} não está presente na "
- "Ordem do Dia/Expediente em votação.".format(parlamentar.id))
+ "Ordem do Dia/Expediente em votação.".format(parlamentar.id))
context.update({'error_message':
- 'Você não está presente na '
- 'Ordem do Dia/Expediente em votação.'})
+ 'Você não está presente na '
+ 'Ordem do Dia/Expediente em votação.'})
return context, context_vars
-def sessao_votacao(context,context_vars):
+
+@never_cache
+@user_passes_test(check_permission)
+def painel_view(request, pk):
+ 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)
+
+ 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
context.update({'sessao_id': pk})
context.update({'sessao': context_vars['sessao'],
@@ -144,9 +163,9 @@ def sessao_votacao(context,context_vars):
presentes = []
ordem_dia = get_materia_aberta(pk)
expediente = get_materia_expediente_aberta(pk)
- errors_msgs = {'materia':'Não há nenhuma matéria aberta.',
- 'registro':'A votação para esta matéria já encerrou.',
- 'tipo':'A matéria aberta não é do tipo votação nominal.'}
+ errors_msgs = {'materia': 'Não há nenhuma matéria aberta.',
+ 'registro': 'A votação para esta matéria já encerrou.',
+ 'tipo': 'A matéria aberta não é do tipo votação nominal.'}
materia_aberta = None
if ordem_dia:
@@ -161,8 +180,8 @@ def sessao_votacao(context,context_vars):
'parlamentar_id', flat=True).distinct()
context_vars.update({'ordem_dia': ordem_dia,
- 'expediente':expediente,
- 'presentes': presentes})
+ 'expediente': expediente,
+ 'presentes': presentes})
# Verifica votação aberta
# Se aberta, verifica se é nominal. ID nominal == 2
@@ -189,7 +208,7 @@ def can_vote(context, context_vars, request):
# Pega sessão
sessao, msg = votacao_aberta(request)
- context_vars.update({'sessao':sessao})
+ context_vars.update({'sessao': sessao})
if sessao and not msg:
context, context_vars = sessao_votacao(context, context_vars)
elif not sessao and msg:
@@ -248,14 +267,16 @@ def votante_view(request):
elif context_vars['expediente']:
try:
- logger.info("user=" + username + ". Tentando obter objeto VotoParlamentar para parlamentar={} e expediente={}."
- .format(context_vars['parlamentar'], context_vars['expediente']))
+ logger.info(
+ "user=" + username + ". Tentando obter objeto VotoParlamentar para parlamentar={} e expediente={}."
+ .format(context_vars['parlamentar'], context_vars['expediente']))
voto = VotoParlamentar.objects.get(
parlamentar=context_vars['parlamentar'],
expediente=context_vars['expediente'])
except ObjectDoesNotExist:
- logger.error("user=" + username + ". Erro ao obter VotoParlamentar para parlamentar={} e expediente={}. Criando objeto."
- .format(context_vars['parlamentar'], context_vars['expediente']))
+ logger.error(
+ "user=" + username + ". Erro ao obter VotoParlamentar para parlamentar={} e expediente={}. Criando objeto."
+ .format(context_vars['parlamentar'], context_vars['expediente']))
voto = VotoParlamentar.objects.create(
parlamentar=context_vars['parlamentar'],
voto=request.POST['voto'],
@@ -263,8 +284,9 @@ def votante_view(request):
ip=get_client_ip(request),
expediente=context_vars['expediente'])
else:
- logger.info("user=" + username + ". VotoParlamentar para parlamentar={} e expediente={} obtido com sucesso."
- .format(context_vars['parlamentar'], context_vars['expediente']))
+ logger.info(
+ "user=" + username + ". VotoParlamentar para parlamentar={} e expediente={} obtido com sucesso."
+ .format(context_vars['parlamentar'], context_vars['expediente']))
voto.voto = request.POST['voto']
voto.ip = get_client_ip(request)
voto.user = request.user
@@ -276,15 +298,6 @@ def votante_view(request):
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)
def switch_painel(request):
sessao = SessaoPlenaria.objects.get(id=request.POST['pk_sessao'])
@@ -352,7 +365,7 @@ def get_presentes(pk, response, materia):
else:
presentes = SessaoPlenariaPresenca.objects.filter(
sessao_plenaria_id=pk)
-
+
sessao = SessaoPlenaria.objects.get(id=pk)
num_presentes = len(presentes)
data_sessao = sessao.data_inicio
@@ -361,7 +374,6 @@ def get_presentes(pk, response, materia):
oradores_list = []
for o in oradores:
-
oradores_list.append(
{
'nome': o.parlamentar.nome_parlamentar,
@@ -470,11 +482,11 @@ def get_votos(response, materia, mostrar_voto):
if tipo == 'ordem':
votos_parlamentares = VotoParlamentar.objects.filter(
ordem_id=materia.id).order_by(
- 'parlamentar__nome_parlamentar')
+ 'parlamentar__nome_parlamentar')
else:
votos_parlamentares = VotoParlamentar.objects.filter(
expediente_id=materia.id).order_by(
- 'parlamentar__nome_parlamentar')
+ 'parlamentar__nome_parlamentar')
for i, p in enumerate(response['presentes']):
try:
@@ -507,7 +519,7 @@ def get_votos(response, materia, mostrar_voto):
if materia.tipo_votacao == 2:
votos_parlamentares = VotoParlamentar.objects.filter(
votacao_id=registro.id).order_by(
- 'parlamentar__nome_parlamentar')
+ 'parlamentar__nome_parlamentar')
for i, p in enumerate(response['presentes']):
try:
@@ -515,7 +527,8 @@ def get_votos(response, materia, mostrar_voto):
response['presentes'][i]['voto'] = votos_parlamentares.get(
parlamentar_id=p['parlamentar_id']).voto
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.update({
@@ -542,7 +555,7 @@ def get_dados_painel(request, pk):
if casa and app_config and (bool(casa.logotipo)):
brasao = casa.logotipo.url \
if app_config.mostrar_brasao_painel else None
-
+
response = {
'sessao_plenaria': str(sessao),
'sessao_plenaria_data': sessao.data_inicio.strftime('%d/%m/%Y'),
@@ -592,22 +605,22 @@ def get_dados_painel(request, pk):
ordem_expediente = last_ordem_voto.ordem
ultimo_timestamp = last_ordem_voto.data_hora
if (last_expediente_voto and ultimo_timestamp and last_expediente_voto.data_hora > ultimo_timestamp) or \
- (not ultimo_timestamp and last_expediente_voto):
+ (not ultimo_timestamp and last_expediente_voto):
ordem_expediente = last_expediente_voto.expediente
ultimo_timestamp = last_expediente_voto.data_hora
if (last_ordem_leitura and ultimo_timestamp and last_ordem_leitura.data_hora > ultimo_timestamp) or \
- (not ultimo_timestamp and last_ordem_leitura):
+ (not ultimo_timestamp and last_ordem_leitura):
ordem_expediente = last_ordem_leitura.ordem
ultimo_timestamp = last_ordem_leitura.data_hora
if (last_expediente_leitura and ultimo_timestamp and last_expediente_leitura.data_hora > ultimo_timestamp) or \
- (not ultimo_timestamp and last_expediente_leitura):
+ (not ultimo_timestamp and last_expediente_leitura):
ordem_expediente = last_expediente_leitura.expediente
ultimo_timestamp = last_expediente_leitura.data_hora
-
+
if ordem_expediente:
return JsonResponse(get_votos(
- get_presentes(pk, response, ordem_expediente),
- ordem_expediente, app_config.mostrar_voto))
+ get_presentes(pk, response, ordem_expediente),
+ ordem_expediente, app_config.mostrar_voto))
# Retorna que não há nenhuma matéria já votada ou aberta
return response_nenhuma_materia(get_presentes(pk, response, None))
diff --git a/sapl/templates/painel/index.html b/sapl/templates/painel/index.html
index 523fa2423..2ce7178a2 100644
--- a/sapl/templates/painel/index.html
+++ b/sapl/templates/painel/index.html
@@ -159,22 +159,27 @@
// biblioteca moment.js é recomendada, pois ela trata data e hora
// 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
function checkTime(i) {
if (i<10) {i = "0" + i}; // add zero in front of numbers < 10
return i;
}
- function startTime() {
- var today = moment.utc().utcOffset(offset).format("HH:mm:ss");
- $("#relogio").text(today)
- var t = setTimeout(function(){
- startTime()
- }, 500);
+ const utcOffset = {{ utc_offset }};
+ const serverEpochMs = {{ server_epoch_ms }};
+ const pageLoadedAtMs = performance.now();
+
+ function startTime() {
+ const elapsedMs = performance.now() - pageLoadedAtMs;
+
+ const now = moment
+ .utc(serverEpochMs + elapsedMs)
+ .utcOffset(utcOffset);
+
+ $("#date").text(now.format("DD/MM/YY"));
+ $("#relogio").text(now.format("HH:mm:ss"));
+
+ setTimeout(startTime, 500);
}
startTime();