Repository: interlegis/sapl

Issue:
Votação na Ordem do Dia!!
Estava registrando a votação das matérias na Ordem do Dia, utilizando o Painel Eletrônico e recorrentemente o computador ficou travando, e no meio de um registro de votações, cujo mesmo estava sendo feito por mim como operador e não pelos Vereadores, o sistema travou em meu computador e quando reiniciei a máquina ele não mais entrou naquela Ordem do Dia, onde aparece o seguinte erro: Server Error (500). Mas o pior é que não consigo mais registrar nenhuma votação nas sessões que ocorreram depois, pois o sistema retorna dizendo que já existe uma matéria aberta pra votação.


Discussion:
Quase certeza que foram criados mais de um RegistroVotacao para essa sessão plenária (deve existir somente um). Isso é uma inconsistência de dados que ainda não conseguimos identificar exatamente porque ocorre. Se o teu sistema **não está** hospedado no Interlegis vc terá que acessar o BD (via pgAdmin3, por exemplo) e deletar os registros duplicados que estarão na tabela sessao_registrovotacao. Tente se orientar pelas colunas materia_id e ordem_id para saber quais registros apagar.

Caso o SAPL esteja hospedado no Interlegis então abra um ticket em https://suporte.interlegis.leg.br para que possamos realizar esse procedimento de remoção.

Resolving patch:
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -30,7 +30,6 @@
 from sapl.materia.models import (Autoria, DocumentoAcessorio,
                                  TipoMateriaLegislativa, Tramitacao)
 from sapl.materia.views import MateriaLegislativaPesquisaView
-from sapl.norma.models import NormaJuridica
 from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato,
                                        Parlamentar, SessaoLegislativa)
 from sapl.sessao.apps import AppConfig
@@ -1114,15 +1113,13 @@ def remove_parlamentar_composicao(request):
 
         if 'composicao_mesa' in request.POST:
             try:
-                composicao = IntegranteMesa.objects.get(
-                    id=int(request.POST['composicao_mesa']))
+                IntegranteMesa.objects.get(
+                    id=int(request.POST['composicao_mesa'])).delete()
             except ObjectDoesNotExist:
                 return JsonResponse(
                     {'msg': (
                         'Composição da Mesa não pôde ser removida!', 0)})
 
-            composicao.delete()
-
             return JsonResponse(
                 {'msg': (
                     'Parlamentar excluido com sucesso!', 1)})
@@ -1526,8 +1523,7 @@ def post(self, request, *args, **kwargs):
         ordem_id = kwargs['oid']
 
         if(int(request.POST['anular_votacao']) == 1):
-            for r in RegistroVotacao.objects.filter(ordem_id=ordem_id):
-                r.delete()
+            RegistroVotacao.objects.filter(ordem_id=ordem_id).delete()
 
             ordem = OrdemDia.objects.get(
                 sessao_plenaria_id=self.object.id,
@@ -1558,9 +1554,8 @@ def get(self, request, *args, **kwargs):
         materia = {'materia': ordem.materia, 'ementa': ordem.materia.ementa}
         context.update({'materia': materia})
 
-        votacao = RegistroVotacao.objects.filter(
-            materia_id=materia_id,
-            ordem_id=ordem_id).last()
+        votacao = RegistroVotacao.objects.filter(materia_id=materia_id,
+                                                 ordem_id=ordem_id).last()
         votacao_existente = {'observacao': sub(
             '&nbsp;', ' ', strip_tags(votacao.observacao)),
             'resultado': votacao.tipo_resultado_votacao.nome,
@@ -1707,8 +1702,7 @@ def fechar_votacao_materia(materia):
         VotoParlamentar.objects.filter(ordem=materia).delete()
 
     elif type(materia) == ExpedienteMateria:
-        RegistroVotacao.objects.filter(
-            expediente=materia).delete()
+        RegistroVotacao.objects.filter(expediente=materia).delete()
         VotoParlamentar.objects.filter(expediente=materia).delete()
 
     if materia.resultado:
@@ -1756,7 +1750,7 @@ def get(self, request, *args, **kwargs):
         elif self.expediente:
             expediente_id = kwargs['oid']
             if (RegistroVotacao.objects.filter(
-               expediente_id=expediente_id).exists()):
+                    expediente_id=expediente_id).exists()):
                 msg = _('Esta matéria já foi votada!')
                 messages.add_message(request, messages.ERROR, msg)
                 return HttpResponseRedirect(reverse(
@@ -1843,8 +1837,7 @@ def post(self, request, *args, **kwargs):
                 return self.form_invalid(form)
             # Remove todas as votação desta matéria, caso existam
             if self.ordem:
-                RegistroVotacao.objects.filter(
-                    ordem_id=ordem_id).delete()
+                RegistroVotacao.objects.filter(ordem_id=ordem_id).delete()
             elif self.expediente:
                 RegistroVotacao.objects.filter(
                     expediente_id=expediente_id).delete()
@@ -1972,11 +1965,10 @@ def get(self, request, *args, **kwargs):
         if self.ordem:
             ordem_id = kwargs['oid']
 
-            try:
-                ordem = OrdemDia.objects.get(id=ordem_id)
-                votacao = RegistroVotacao.objects.get(
-                    ordem_id=ordem_id)
-            except ObjectDoesNotExist:
+            ordem = OrdemDia.objects.filter(id=ordem_id).last()
+            votacao = RegistroVotacao.objects.filter(ordem_id=ordem_id).last()
+
+            if not ordem or not votacao:
                 raise Http404()
 
             materia = ordem.materia
@@ -1985,11 +1977,10 @@ def get(self, request, *args, **kwargs):
         elif self.expediente:
             expediente_id = kwargs['oid']
 
-            try:
-                expediente = ExpedienteMateria.objects.get(id=expediente_id)
-                votacao = RegistroVotacao.objects.get(
-                    expediente_id=expediente_id)
-            except ObjectDoesNotExist:
+            expediente = ExpedienteMateria.objects.filter(id=expediente_id).last()
+            votacao = RegistroVotacao.objects.filter(expediente_id=expediente_id).last()
+
+            if not expediente or not votacao:
                 raise Http404()
 
             materia = expediente.materia
@@ -2106,9 +2097,9 @@ def get_context_data(self, **kwargs):
         materia_votacao = self.request.GET.get('materia', None)
 
         if materia_votacao == 'ordem':
-            votacao = RegistroVotacao.objects.get(ordem=self.kwargs['oid'])
+            votacao = RegistroVotacao.objects.filter(ordem=self.kwargs['oid']).last()
         elif materia_votacao == 'expediente':
-            votacao = RegistroVotacao.objects.get(expediente=self.kwargs['oid'])
+            votacao = RegistroVotacao.objects.filter(expediente=self.kwargs['oid']).last()
         else:
             raise Http404()
 
@@ -2142,10 +2133,9 @@ def get(self, request, *args, **kwargs):
         materia_id = kwargs['mid']
         expediente_id = kwargs['oid']
 
-        votacao = RegistroVotacao.objects.get(
-            materia_id=materia_id,
-            expediente_id=expediente_id)
-        expediente = ExpedienteMateria.objects.get(id=expediente_id)
+        votacao = RegistroVotacao.objects.filter(materia_id=materia_id,
+                                                 expediente_id=expediente_id).last()
+        expediente = ExpedienteMateria.objects.filter(id=expediente_id).last()
         votos = VotoParlamentar.objects.filter(votacao_id=votacao.id)
 
         list_votos = []
@@ -2190,9 +2180,9 @@ def get_context_data(self, **kwargs):
         materia_votacao = self.request.GET.get('materia', None)
 
         if materia_votacao == 'ordem':
-            votacao = RegistroVotacao.objects.get(ordem=self.kwargs['oid'])
+            votacao = RegistroVotacao.objects.filter(ordem=self.kwargs['oid']).last()
         elif materia_votacao == 'expediente':
-            votacao = RegistroVotacao.objects.get(expediente=self.kwargs['oid'])
+            votacao = RegistroVotacao.objects.filter(expediente=self.kwargs['oid']).last()
         else:
             raise Http404()
 
@@ -2378,14 +2368,9 @@ def get(self, request, *args, **kwargs):
                    'ementa': expediente.materia.ementa}
         context.update({'materia': materia})
 
-        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 = RegistroVotacao.objects.filter(materia_id=materia_id,
+                                                 expediente_id=expediente_id
+                                                 ).last()
         votacao_existente = {'observacao': sub(
             '&nbsp;', ' ', strip_tags(votacao.observacao)),
             'resultado': votacao.tipo_resultado_votacao.nome,
@@ -2404,10 +2389,8 @@ def post(self, request, *args, **kwargs):
         materia_id = kwargs['mid']
         expediente_id = kwargs['oid']
 
-        if(int(request.POST['anular_votacao']) == 1):
-            for r in RegistroVotacao.objects.filter(
-                    expediente_id=expediente_id):
-                r.delete()
+        if int(request.POST['anular_votacao']) == 1:
+            RegistroVotacao.objects.filter(expediente_id=expediente_id).delete()
 
             expediente = ExpedienteMateria.objects.get(
                 sessao_plenaria_id=self.object.id,


Test patch: