Repository: interlegis/sapl

Issue:
Painel de votação
Quando da votação aberta para uma matéria que o tipo de votação é simbólica, assim que é registrado o resultado da votação a lista de parlamentares desaparece. Mesmo que a votação seja simbólica é interessante mostrar os parlamentares presente.

![image](https://user-images.githubusercontent.com/13314947/29836938-186241ce-8ccd-11e7-9010-34a09bed5e46.png)



Discussion:

Resolving patch:
diff --git a/sapl/painel/views.py b/sapl/painel/views.py
--- a/sapl/painel/views.py
+++ b/sapl/painel/views.py
@@ -16,7 +16,7 @@
 from sapl.sessao.models import (ExpedienteMateria, OrdemDia, PresencaOrdemDia,
                                 RegistroVotacao, SessaoPlenaria,
                                 SessaoPlenariaPresenca, VotoParlamentar)
-from sapl.utils import get_client_ip
+from sapl.utils import filiacao_data, get_client_ip, parlamentares_ativos
 
 from .models import Cronometro
 
@@ -252,8 +252,6 @@ def get_cronometro_status(request, name):
         cronometro = ''
     return cronometro
 
-# ##############################ORDEM DO DIA##################################
-
 
 def get_materia_aberta(pk):
     return OrdemDia.objects.filter(
@@ -261,56 +259,43 @@ def get_materia_aberta(pk):
 
 
 def get_presentes(pk, response, materia):
-    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
-
-    sessao_plenaria_presenca = SessaoPlenariaPresenca.objects.filter(
+    if type(materia) == OrdemDia:
+        presentes = PresencaOrdemDia.objects.filter(
         sessao_plenaria_id=pk)
-    presentes_sessao_plenaria = [
-        p.parlamentar.nome_parlamentar for p in sessao_plenaria_presenca]
-    num_presentes_sessao_plen = len(presentes_sessao_plenaria)
+    elif type(materia) == ExpedienteMateria:
+        presentes = SessaoPlenariaPresenca.objects.filter(
+            sessao_plenaria_id=pk)
 
-    presenca_ordem_dia = PresencaOrdemDia.objects.filter(
-        sessao_plenaria_id=pk)
-    presentes_ordem_dia = []
-    for p in presenca_ordem_dia:
-        nome_parlamentar = p.parlamentar.nome_parlamentar
-
-        try:
-            parlamentar_partido[nome_parlamentar]
-        except KeyError:
-            presentes_ordem_dia.append(
-                {'id': p.id,
-                 'nome': nome_parlamentar,
-                 'partido': str(_('Sem Registro')),
-                 })
+    num_presentes = len(presentes)
+    data_sessao = materia.sessao_plenaria.data_inicio
+
+    presentes_list = []
+    for p in presentes:
+        filiacao = filiacao_data(p.parlamentar, data_sessao, data_sessao)
+
+        if not filiacao:
+            partido = _('Sem Registro')
         else:
-            presentes_ordem_dia.append(
-                {'id': p.id,
-                 'nome': nome_parlamentar,
-                 'partido': parlamentar_partido[nome_parlamentar],
-                 })
-    num_presentes_ordem_dia = len(presentes_ordem_dia)
+            partido = filiacao
+
+        presentes_list.append(
+            {'id': p.id,
+             'parlamentar_id': p.parlamentar.id,
+             'nome': p.parlamentar.nome_parlamentar,
+             'partido': partido,
+             'voto': ''
+             })
 
     if materia.tipo_votacao == 1:
-        tipo_votacao = str(_('Simbólica'))
-        response = get_votos(response, materia)
+        tipo_votacao = 'Simbólica'
     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,
-        'num_presentes_ordem_dia': num_presentes_ordem_dia,
-        'presentes_sessao_plenaria': presentes_sessao_plenaria,
-        'num_presentes_sessao_plenaria': num_presentes_sessao_plen,
+        'presentes': presentes_list,
+        'num_presentes': num_presentes,
         'status_painel': 'ABERTO',
         'msg_painel': str(_('Votação aberta!')),
         'tipo_resultado': materia.resultado,
@@ -321,76 +306,11 @@ def get_presentes(pk, response, materia):
     return response
 
 
-# ########################EXPEDIENTE############################################
-
-
 def get_materia_expediente_aberta(pk):
     return ExpedienteMateria.objects.filter(
         sessao_plenaria_id=pk, votacao_aberta=True).last()
 
 
-def get_presentes_expediente(pk, response, materia):
-    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
-
-    sessao_plenaria_presenca = SessaoPlenariaPresenca.objects.filter(
-        sessao_plenaria_id=pk)
-    presentes_sessao_plenaria = [
-        p.parlamentar.nome_parlamentar for p in sessao_plenaria_presenca]
-    num_presentes_sessao_plen = len(presentes_sessao_plenaria)
-
-    presenca_expediente = SessaoPlenariaPresenca.objects.filter(
-        sessao_plenaria_id=pk)
-    presentes_expediente = []
-    for p in presenca_expediente:
-        nome_parlamentar = p.parlamentar.nome_parlamentar
-
-        try:
-            parlamentar_partido[nome_parlamentar]
-        except KeyError:
-            presentes_expediente.append(
-                {'id': p.id,
-                 'nome': nome_parlamentar,
-                 'partido': str(_('Sem Registro')),
-                 })
-        else:
-            presentes_expediente.append(
-                {'id': p.id,
-                 'nome': nome_parlamentar,
-                 'partido': parlamentar_partido[nome_parlamentar],
-                 })
-    num_presentes_expediente = len(presentes_expediente)
-
-    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,
-        'presentes_sessao_plenaria': presentes_sessao_plenaria,
-        'num_presentes_sessao_plenaria': num_presentes_sessao_plen,
-        'status_painel': str(_('ABERTO')),
-        'msg_painel': str(_('Votação aberta!')),
-        'tipo_resultado': tipo_votacao,
-        'observacao_materia': materia.observacao,
-        'materia_legislativa_texto': str(materia.materia)})
-
-    return response
-
-
-# ##########################GENERAL FUNCTIONS#############################
-
 def response_nenhuma_materia(response):
     response.update({
         'status_painel': 'FECHADO',
@@ -399,60 +319,10 @@ def response_nenhuma_materia(response):
 
 
 def get_votos(response, materia):
-    if materia.tipo_votacao == 1:
-        tipo_votacao = 'Simbólica'
-    elif materia.tipo_votacao == 2:
-        tipo_votacao = 'Nominal'
-    elif materia.tipo_votacao == 3:
-        tipo_votacao = 'Secreta'
-
     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,
-            'natureza_resultado': registro.tipo_resultado_votacao.natureza,
-        })
-    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.',
-            'natureza_resultado': None,
-        })
-    return response
-
-
-def get_votos_nominal(response, materia):
-    votos = []
-
-    if materia.tipo_votacao == 1:
-        tipo_votacao = 'Simbólica'
-    elif materia.tipo_votacao == 2:
-        tipo_votacao = 'Nominal'
-    elif materia.tipo_votacao == 3:
-        tipo_votacao = 'Secreta'
-
-    if type(materia) == OrdemDia:
-        registro = RegistroVotacao.objects.filter(
-            ordem=materia, materia=materia.materia).last()
-    else:
+    elif type(materia) == ExpedienteMateria:
         registro = RegistroVotacao.objects.filter(
             expediente=materia, materia=materia.materia).last()
 
@@ -461,54 +331,34 @@ def get_votos_nominal(response, materia):
             'numero_votos_sim': 0,
             'numero_votos_nao': 0,
             'numero_abstencoes': 0,
+            'registro': None,
             'total_votos': 0,
-            'tipo_votacao': tipo_votacao,
-            'tipo_resultado': 'Não foi votado ainda',
-            'natureza_resultado': None,
-            'votos': None
+            'tipo_resultado': 'Ainda não foi votada.',
         })
 
     else:
-        votos_parlamentares = VotoParlamentar.objects.filter(
-            votacao_id=registro.id).order_by('parlamentar__nome_parlamentar')
-
-        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.append({
-                    'parlamentar': v.parlamentar.nome_parlamentar,
-                    'voto': str(v.voto),
-                    'partido': str(_('Sem Registro'))
-                })
-            else:
-                votos.append({
-                    '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 materia.tipo_votacao == 2:
+            votos_parlamentares = VotoParlamentar.objects.filter(
+                votacao_id=registro.id).order_by('parlamentar__nome_parlamentar')
+
+            for i, p in enumerate(response['presentes']):
+                try:
+                    response['presentes'][i]['voto'] = votos_parlamentares.get(
+                        parlamentar_id=p['parlamentar_id']).voto
+                except ObjectDoesNotExist:
+                    response['presentes'][i]['voto'] = None
+
         response.update({
             'numero_votos_sim': registro.numero_votos_sim,
             'numero_votos_nao': registro.numero_votos_nao,
             'numero_abstencoes': registro.numero_abstencoes,
+            'registro': True,
             'total_votos': total,
-            'tipo_votacao': tipo_votacao,
             'tipo_resultado': registro.tipo_resultado_votacao.nome,
-            'natureza_resultado': registro.tipo_resultado_votacao.natureza,
-            'votos': votos
         })
 
     return response
@@ -517,79 +367,60 @@ def get_votos_nominal(response, materia):
 @user_passes_test(check_permission)
 def get_dados_painel(request, pk):
     sessao = SessaoPlenaria.objects.get(id=pk)
-    cronometro_discurso = get_cronometro_status(request, 'discurso')
-    cronometro_aparte = get_cronometro_status(request, 'aparte')
-    cronometro_ordem = get_cronometro_status(request, 'ordem')
 
     response = {
         'sessao_plenaria': str(sessao),
         'sessao_plenaria_data': sessao.data_inicio.strftime('%d/%m/%Y'),
         'sessao_plenaria_hora_inicio': sessao.hora_inicio,
-        "cronometro_aparte": cronometro_aparte,
-        "cronometro_discurso": cronometro_discurso,
-        "cronometro_ordem": cronometro_ordem,
+        'cronometro_aparte': get_cronometro_status(request, 'aparte'),
+        'cronometro_discurso': get_cronometro_status(request, 'discurso'),
+        'cronometro_ordem': get_cronometro_status(request, 'ordem'),
     }
 
     ordem_dia = get_materia_aberta(pk)
     expediente = get_materia_expediente_aberta(pk)
 
+    # Caso tenha alguma matéria com votação aberta, ela é mostrada no painel
+    # com prioridade para Ordem do Dia.
     if ordem_dia:
-        return JsonResponse(get_presentes(pk, response, ordem_dia))
+        return JsonResponse(get_votos(
+                                get_presentes(pk, response, ordem_dia),
+                                ordem_dia))
     elif expediente:
-        return JsonResponse(get_presentes_expediente(pk, response, expediente))
+        return JsonResponse(get_votos(
+                                get_presentes(pk, response, expediente),
+                                expediente))
 
-    # Ultimo voto em ordem e ultimo voto em expediente
+    # Caso não tenha nenhuma aberta, a matéria a ser mostrada no Painel deve ser
+    # a última votada
     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_expediente(
-                                  pk, response, ultimo_expediente_votado),
-                                  ultimo_expediente_votado))
-                elif ultimo_expediente_votado.tipo_votacao == 2:
-                    return JsonResponse(
-                        get_votos_nominal(get_presentes_expediente(
-                                          pk, response,
-                                          ultimo_expediente_votado),
-                                          ultimo_expediente_votado))
+            materia = ultima_ordem_votada\
+                       if last_ordem_voto.pk >= last_expediente_voto.pk\
+                       else 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))
+        elif last_ordem_voto:
+            materia = ultima_ordem_votada
+
         # Caso a Ordem do dia não tenha resultado, mostra o último expediente
-        if last_expediente_voto:
-            return JsonResponse(get_presentes_expediente(
-                pk, response,
-                ultimo_expediente_votado))
+        elif last_expediente_voto:
+            materia = ultimo_expediente_votado
+
+        return JsonResponse(get_votos(
+                            get_presentes(pk, response, materia),
+                            materia))
 
     # Retorna que não há nenhuma matéria já votada ou aberta
     return response_nenhuma_materia(response)


Test patch: