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();