From 69dc68ed51fb28c0107d5129d2116117b500306f Mon Sep 17 00:00:00 2001 From: eduardocalil Date: Thu, 17 Nov 2016 17:42:51 -0200 Subject: [PATCH] Fix #758 refatora painel (#792) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Merge * Conserta a logica de painel * Transfere para o painel o audio de termino do discurso" * Conserta bug * Conserta alguns bugs no painel * Conserta bugs na ordem das materias no paineil * Bug fix * Melhorias no front-end do painel * Remove ipdb * Conserta bug quando finaliza cronômetro" --- sapl/painel/views.py | 283 ++++++++++++++++-------------- sapl/sessao/views.py | 24 ++- sapl/templates/painel/index.html | 232 ++++++++++++++---------- sapl/templates/sessao/painel.html | 41 ++++- 4 files changed, 345 insertions(+), 235 deletions(-) diff --git a/sapl/painel/views.py b/sapl/painel/views.py index 6c43708a4..d285137a0 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -84,21 +84,8 @@ def get_cronometro_status(request, name): def get_materia_aberta(pk): - try: - materia = OrdemDia.objects.filter( - sessao_plenaria_id=pk, votacao_aberta=True).last() - return materia - except ObjectDoesNotExist: - return False - - -def get_last_materia(pk): - try: - materia = OrdemDia.objects.filter( - sessao_plenaria_id=pk).last() - return materia - except ObjectDoesNotExist: - return None + return OrdemDia.objects.filter( + sessao_plenaria_id=pk, votacao_aberta=True).last() def get_presentes(pk, response, materia): @@ -138,11 +125,14 @@ def get_presentes(pk, response, materia): num_presentes_ordem_dia = len(presentes_ordem_dia) if materia.tipo_votacao == 1: - tipo_votacao = 'Simbólica' + tipo_votacao = str(_('Simbólica')) + response = get_votos(response, materia) elif materia.tipo_votacao == 2: tipo_votacao = 'Nominal' + response = get_votos_nominal(response, materia) elif materia.tipo_votacao == 3: tipo_votacao = 'Secreta' + response = get_votos(response, materia) response.update({ 'presentes_ordem_dia': presentes_ordem_dia, @@ -151,10 +141,6 @@ def get_presentes(pk, response, materia): 'num_presentes_sessao_plenaria': num_presentes_sessao_plen, 'status_painel': 'ABERTO', 'msg_painel': str(_('Votação aberta!')), - 'numero_votos_sim': 0, - 'numero_votos_nao': 0, - 'numero_abstencoes': 0, - 'total_votos': 0, 'tipo_resultado': tipo_votacao, 'observacao_materia': materia.observacao, 'materia_legislativa_texto': str(materia.materia)}) @@ -166,21 +152,8 @@ def get_presentes(pk, response, materia): def get_materia_expediente_aberta(pk): - try: - materia = ExpedienteMateria.objects.filter( - sessao_plenaria_id=pk, votacao_aberta=True).last() - return materia - except ObjectDoesNotExist: - return False - - -def get_last_materia_expediente(pk): - try: - materia = ExpedienteMateria.objects.filter( - sessao_plenaria_id=pk).last() - return materia - except ObjectDoesNotExist: - return None + return ExpedienteMateria.objects.filter( + sessao_plenaria_id=pk, votacao_aberta=True).last() def get_presentes_expediente(pk, response, materia): @@ -221,10 +194,14 @@ def get_presentes_expediente(pk, response, materia): if materia.tipo_votacao == 1: tipo_votacao = 'Simbólica' + response = get_votos(response, materia) elif materia.tipo_votacao == 2: tipo_votacao = 'Nominal' + response = get_votos_nominal(response, materia) elif materia.tipo_votacao == 3: tipo_votacao = 'Secreta' + response = get_votos(response, materia) + response.update({ 'presentes_expediente': presentes_expediente, 'num_presentes_expediente': num_presentes_expediente, @@ -232,10 +209,6 @@ def get_presentes_expediente(pk, response, materia): 'num_presentes_sessao_plenaria': num_presentes_sessao_plen, 'status_painel': str(_('ABERTO')), 'msg_painel': str(_('Votação aberta!')), - 'numero_votos_sim': 0, - 'numero_votos_nao': 0, - 'numero_abstencoes': 0, - 'total_votos': 0, 'tipo_resultado': tipo_votacao, 'observacao_materia': materia.observacao, 'materia_legislativa_texto': str(materia.materia)}) @@ -245,16 +218,14 @@ def get_presentes_expediente(pk, response, materia): # ##########################GENERAL FUNCTIONS############################# -def response_null_materia(response): +def response_nenhuma_materia(response): response.update({ 'status_painel': 'FECHADO', - 'msg_painel': str(_('Nenhuma matéria disponivel para votação.')) - }) + 'msg_painel': str(_('Nenhuma matéria disponivel para votação.'))}) return JsonResponse(response) def get_votos(response, materia): - if materia.tipo_votacao == 1: tipo_votacao = 'Simbólica' elif materia.tipo_votacao == 2: @@ -262,19 +233,34 @@ def get_votos(response, materia): elif materia.tipo_votacao == 3: tipo_votacao = 'Secreta' - registro = RegistroVotacao.objects.filter( - ordem=materia, materia=materia.materia).last() - total = (registro.numero_votos_sim + - registro.numero_votos_nao + - registro.numero_abstencoes) - response.update({ - 'numero_votos_sim': registro.numero_votos_sim, - 'numero_votos_nao': registro.numero_votos_nao, - 'numero_abstencoes': registro.numero_abstencoes, - 'total_votos': total, - 'tipo_votacao': tipo_votacao, - 'tipo_resultado': registro.tipo_resultado_votacao.nome, - }) + if type(materia) == OrdemDia: + registro = RegistroVotacao.objects.filter( + ordem=materia, materia=materia.materia).last() + else: + registro = RegistroVotacao.objects.filter( + expediente=materia, materia=materia.materia).last() + + if registro: + total = (registro.numero_votos_sim + + registro.numero_votos_nao + + registro.numero_abstencoes) + response.update({ + 'numero_votos_sim': registro.numero_votos_sim, + 'numero_votos_nao': registro.numero_votos_nao, + 'numero_abstencoes': registro.numero_abstencoes, + 'total_votos': total, + 'tipo_votacao': tipo_votacao, + 'tipo_resultado': registro.tipo_resultado_votacao.nome, + }) + else: + response.update({ + 'numero_votos_sim': 0, + 'numero_votos_nao': 0, + 'numero_abstencoes': 0, + 'total_votos': 0, + 'tipo_votacao': tipo_votacao, + 'tipo_resultado': 'Ainda não foi votada.', + }) return response @@ -288,48 +274,65 @@ def get_votos_nominal(response, materia): elif materia.tipo_votacao == 3: tipo_votacao = 'Secreta' - registro = RegistroVotacao.objects.get( - ordem=materia, materia=materia.materia) - - votos_parlamentares = VotoParlamentar.objects.filter( - votacao_id=registro.id) - - filiacao = Filiacao.objects.filter( - data_desfiliacao__isnull=True, parlamentar__ativo=True) - parlamentar_partido = {} - for f in filiacao: - parlamentar_partido[ - f.parlamentar.nome_parlamentar] = f.partido.sigla - - for v in votos_parlamentares: - try: - parlamentar_partido[v.parlamentar.nome_parlamentar] - except KeyError: - votos.update({v.parlamentar.id: { - 'parlamentar': v.parlamentar.nome_parlamentar, - 'voto': str(v.voto), - 'partido': str(_('Sem Registro')) - }}) - else: - votos.update({v.parlamentar.id: { - 'parlamentar': v.parlamentar.nome_parlamentar, - 'voto': str(v.voto), - 'partido': parlamentar_partido[v.parlamentar.nome_parlamentar] - }}) - - total = (registro.numero_votos_sim + - registro.numero_votos_nao + - registro.numero_abstencoes) + if type(materia) == OrdemDia: + registro = RegistroVotacao.objects.filter( + ordem=materia, materia=materia.materia).last() + else: + registro = RegistroVotacao.objects.filter( + expediente=materia, materia=materia.materia).last() + + if not registro: + response.update({ + 'numero_votos_sim': 0, + 'numero_votos_nao': 0, + 'numero_abstencoes': 0, + 'total_votos': 0, + 'tipo_votacao': tipo_votacao, + 'tipo_resultado': 'Não foi votado ainda', + 'votos': None + }) - response.update({ - 'numero_votos_sim': registro.numero_votos_sim, - 'numero_votos_nao': registro.numero_votos_nao, - 'numero_abstencoes': registro.numero_abstencoes, - 'total_votos': total, - 'tipo_votacao': tipo_votacao, - 'tipo_resultado': registro.tipo_resultado_votacao.nome, - 'votos': votos - }) + else: + votos_parlamentares = VotoParlamentar.objects.filter( + votacao_id=registro.id) + + filiacao = Filiacao.objects.filter( + data_desfiliacao__isnull=True, parlamentar__ativo=True) + parlamentar_partido = {} + for f in filiacao: + parlamentar_partido[ + f.parlamentar.nome_parlamentar] = f.partido.sigla + + for v in votos_parlamentares: + try: + parlamentar_partido[v.parlamentar.nome_parlamentar] + except KeyError: + votos.update({v.parlamentar.id: { + 'parlamentar': v.parlamentar.nome_parlamentar, + 'voto': str(v.voto), + 'partido': str(_('Sem Registro')) + }}) + else: + votos.update({v.parlamentar.id: { + 'parlamentar': v.parlamentar.nome_parlamentar, + 'voto': str(v.voto), + 'partido': parlamentar_partido[ + v.parlamentar.nome_parlamentar] + }}) + + total = (registro.numero_votos_sim + + registro.numero_votos_nao + + registro.numero_abstencoes) + + response.update({ + 'numero_votos_sim': registro.numero_votos_sim, + 'numero_votos_nao': registro.numero_votos_nao, + 'numero_abstencoes': registro.numero_abstencoes, + 'total_votos': total, + 'tipo_votacao': tipo_votacao, + 'tipo_resultado': registro.tipo_resultado_votacao.nome, + 'votos': votos + }) return response @@ -358,37 +361,57 @@ def get_dados_painel(request, pk): elif expediente: return JsonResponse(get_presentes_expediente(pk, response, expediente)) - ultima_ordem = get_last_materia(pk) - - if ultima_ordem: - if ultima_ordem.resultado: - if ultima_ordem.tipo_votacao in [1, 3]: - return JsonResponse( - get_votos(get_presentes( - pk, response, ultima_ordem), ultima_ordem)) - elif ultima_ordem.tipo_votacao == 2: - return JsonResponse( - get_votos_nominal(get_presentes( - pk, response, ultima_ordem), ultima_ordem)) - else: - return JsonResponse(get_presentes(pk, response, ultima_ordem)) - - ultimo_expediente = get_last_materia_expediente(pk) - - if ultimo_expediente: - if ultimo_expediente.resultado: - if ultimo_expediente.tipo_votacao in [1, 3]: - return JsonResponse( - get_votos(get_presentes( - pk, response, ultimo_expediente), - ultimo_expediente)) - elif ultimo_expediente.tipo_votacao == 2: - return JsonResponse( - get_votos_nominal(get_presentes( - pk, response, ultimo_expediente), - ultimo_expediente)) - else: + # Ultimo voto em ordem e ultimo voto em expediente + last_ordem_voto = RegistroVotacao.objects.filter( + ordem__sessao_plenaria=sessao).last() + last_expediente_voto = RegistroVotacao.objects.filter( + expediente__sessao_plenaria=sessao).last() + + # Ultimas materias votadas + if last_ordem_voto: + ultima_ordem_votada = last_ordem_voto.ordem + if last_expediente_voto: + ultimo_expediente_votado = last_expediente_voto.expediente + + # Caso não tenha nenhuma votação aberta + if last_ordem_voto or last_expediente_voto: + + # Se alguma ordem E algum expediente já tiver sido votado... + if last_ordem_voto and last_expediente_voto: + # Verifica se o último resultado é um uma ordem do dia + if last_ordem_voto.pk >= last_expediente_voto.pk: + if ultima_ordem_votada.tipo_votacao in [1, 3]: + return JsonResponse( + get_votos(get_presentes( + pk, response, ultima_ordem_votada), + ultima_ordem_votada)) + elif ultima_ordem_votada.tipo_votacao == 2: + return JsonResponse( + get_votos_nominal(get_presentes( + pk, response, ultima_ordem_votada), + ultima_ordem_votada)) + # Caso não seja, verifica se é um expediente + else: + if ultimo_expediente_votado.tipo_votacao in [1, 3]: + return JsonResponse( + get_votos(get_presentes( + pk, response, ultimo_expediente_votado), + ultimo_expediente_votado)) + elif ultimo_expediente_votado.tipo_votacao == 2: + return JsonResponse( + get_votos_nominal(get_presentes( + pk, response, + ultimo_expediente_votado), + ultimo_expediente_votado)) + + # Caso somente um deles tenha resultado, prioriza a Ordem do Dia + if last_ordem_voto: + return JsonResponse(get_presentes( + pk, response, ultima_ordem_votada)) + # Caso a Ordem do dia não tenha resultado, mostra o último expediente + if last_expediente_voto: return JsonResponse(get_presentes(pk, response, - ultimo_expediente)) - else: - return response_null_materia(response) + ultimo_expediente_votado)) + + # Retorna que não há nenhuma matéria já votada ou aberta + return response_nenhuma_materia(response) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index d5ce1bdad..9c377b713 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -3,7 +3,7 @@ from re import sub from django.contrib import messages from django.contrib.auth.decorators import permission_required -from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.core.urlresolvers import reverse from django.forms.utils import ErrorList from django.http import JsonResponse @@ -1854,9 +1854,14 @@ class VotacaoExpedienteEditView(SessaoPermissionMixin): 'ementa': expediente.observacao} context.update({'materia': materia}) - votacao = RegistroVotacao.objects.get( - materia_id=materia_id, - expediente_id=expediente_id) + try: + votacao = RegistroVotacao.objects.get( + materia_id=materia_id, + expediente_id=expediente_id) + except MultipleObjectsReturned: + votacao = RegistroVotacao.objects.filter( + materia_id=materia_id, + expediente_id=expediente_id).last() votacao_existente = {'observacao': sub( ' ', ' ', strip_tags(votacao.observacao)), 'tipo_resultado': @@ -1875,9 +1880,14 @@ class VotacaoExpedienteEditView(SessaoPermissionMixin): expediente_id = kwargs['mid'] if(int(request.POST['anular_votacao']) == 1): - RegistroVotacao.objects.get( - materia_id=materia_id, - expediente_id=expediente_id).delete() + try: + RegistroVotacao.objects.get( + materia_id=materia_id, + expediente_id=expediente_id).delete() + except MultipleObjectsReturned: + RegistroVotacao.objects.filter( + materia_id=materia_id, + expediente_id=expediente_id).last().delete() expediente = ExpedienteMateria.objects.get( sessao_plenaria_id=self.object.id, diff --git a/sapl/templates/painel/index.html b/sapl/templates/painel/index.html index 692c3c65b..2b668564e 100644 --- a/sapl/templates/painel/index.html +++ b/sapl/templates/painel/index.html @@ -1,5 +1,5 @@ {% load i18n %} -{% load staticfiles %} +{% load staticfiles sass_tags %} @@ -8,6 +8,7 @@ + {% block head_title %}{% trans 'SAPL - Sistema de Apoio ao Processo Legislativo' %}{% endblock %} @@ -16,12 +17,11 @@ + +

-

+

- - + +

-

________________________________________________

-

-

________________________________________________

- -

Cronômetros

- - - - - - - - - - -
Discurso:
Aparte:
Questão de Ordem:
- -

________________________________________________

- -

Parlamentares e Votos

- - - - - -
- -

________________________________________________

- -

Matéria em Votação

+

+ +
+
+
+

Parlamentares

+ + + + +

+
+ +
+

Cronômetros

+ + + + + + + + + + +
Discurso:
Aparte:
Questão de Ordem:
+
+ +
+

Resultado

+ + + + +

+
+
+
+ +
+

Matéria em Votação

- - + +

- + \ No newline at end of file diff --git a/sapl/templates/sessao/painel.html b/sapl/templates/sessao/painel.html index f4e95163a..cd6f80f3f 100644 --- a/sapl/templates/sessao/painel.html +++ b/sapl/templates/sessao/painel.html @@ -11,7 +11,6 @@ {% block detail_content %} -
@@ -95,8 +94,6 @@ $(function() { startTime(); - var audioAlertFinish = document.getElementById("audio"); - $('#discurso').prop('disabled', true); $('#aparte').prop('disabled', true); $('#ordem').prop('disabled', true); @@ -108,8 +105,17 @@ $(function() { stopAt: 0, milliseconds: false }).on('runnerFinish', function(eventObject, info){ - audioAlertFinish.play(); - }); + $.get('/painel/cronometro', { tipo: 'discurso', action: 'stop' } ); + + $('#discursoReset').show(); + $('#discurso').runner('stop'); + $('#discursoStart').text('Iniciar'); + $('#aparteStart').prop('disabled', false); + $('#aparteReset').prop('disabled', false); + $('#ordemStart').prop('disabled', false); + $('#ordemReset').prop('disabled', false); + + }); $('#discursoStart').click(function() { @@ -154,8 +160,17 @@ $(function() { stopAt: 0, milliseconds: false }).on('runnerFinish', function(eventObject, info){ - audioAlertFinish.play(); - }); + $.get('/painel/cronometro', { tipo: 'aparte', action: 'stop' } ); + + $('#aparteReset').show(); + $('#aparte').runner('stop'); + $('#aparteStart').text('Iniciar'); + $('#discursoStart').prop('disabled', false); + $('#discursoReset').prop('disabled', false); + $('#ordemStart').prop('disabled', false); + $('#ordemReset').prop('disabled', false); + + }); $('#aparteStart').click(function(){ if ($('#aparteStart').text() == 'Iniciar') { @@ -199,8 +214,16 @@ $(function() { stopAt: 0, milliseconds: false }).on('runnerFinish', function(eventObject, info){ - audioAlertFinish.play(); - }); + $.get('/painel/cronometro', { tipo: 'ordem', action: 'stop' } ); + + $('#ordemReset').show(); + $('#ordem').runner('stop'); + $('#ordemStart').text('Iniciar'); + $('#discursoStart').prop('disabled', false); + $('#discursoReset').prop('disabled', false); + $('#aparteStart').prop('disabled', false); + $('#aparteReset').prop('disabled', false); + }); $('#ordemStart').click(function() { if ($('#ordemStart').text() == 'Iniciar') {