Repository: interlegis/sapl

Issue:
Deixar campo resultado de votação obrigatório ao fechar uma votação nominal. 



Discussion:

Resolving patch:
diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py
--- a/sapl/sessao/forms.py
+++ b/sapl/sessao/forms.py
@@ -18,7 +18,7 @@
                         autor_modal, timezone)
 
 from .models import (Bancada, ExpedienteMateria, Orador, OradorExpediente,
-                     OrdemDia, SessaoPlenaria, SessaoPlenariaPresenca)
+                     OrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, TipoResultadoVotacao)
 
 
 def recupera_anos():
@@ -238,10 +238,6 @@ class PresencaForm(forms.Form):
     parlamentar = forms.CharField(required=False, max_length=20)
 
 
-class VotacaoNominalForm(forms.Form):
-    pass
-
-
 class ListMateriaForm(forms.Form):
     error_message = forms.CharField(required=False, label='votacao_aberta')
 
@@ -256,10 +252,17 @@ class ExpedienteForm(forms.Form):
 
 
 class VotacaoForm(forms.Form):
-    votos_sim = forms.CharField(required=True, label='Sim')
-    votos_nao = forms.CharField(required=True, label='Não')
-    abstencoes = forms.CharField(required=True, label='Abstenções')
+    votos_sim = forms.CharField(label='Sim')
+    votos_nao = forms.CharField(label='Não')
+    abstencoes = forms.CharField(label='Abstenções')
     total_votos = forms.CharField(required=False, label='total')
+    resultado_votacao = forms.CharField(label='Resultado da Votação')
+
+
+class VotacaoNominalForm(forms.Form):
+    resultado_votacao = forms.ModelChoiceField(label='Resultado da Votação',
+                                               required=True,
+                                               queryset=TipoResultadoVotacao.objects.all())
 
 
 class VotacaoEditForm(forms.Form):
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -1651,6 +1651,7 @@ class VotacaoNominalAbstract(SessaoPermissionMixin):
     template_name = 'sessao/votacao/nominal.html'
     ordem = None
     expediente = None
+    form_class = VotacaoNominalForm
 
     def get(self, request, *args, **kwargs):
         if self.ordem:
@@ -1699,13 +1700,14 @@ def get(self, request, *args, **kwargs):
                            materia_votacao.materia.ementa))}
         context = {'materia': materia, 'object': self.get_object(),
                    'parlamentares': self.get_parlamentares(presentes),
-                   'tipos': self.get_tipos_votacao(),
+                   'form': self.get_form(),
                    'total': total}
 
         return self.render_to_response(context)
 
     def post(self, request, *args, **kwargs):
         self.object = self.get_object()
+        form = self.get_form()
 
         if self.ordem:
             ordem_id = kwargs['oid']
@@ -1725,7 +1727,6 @@ def post(self, request, *args, **kwargs):
 
             materia_votacao = expediente
 
-        form = VotacaoNominalForm(request.POST)
 
         if 'cancelar-votacao' in request.POST:
             fechar_votacao_materia(materia_votacao)
@@ -1742,19 +1743,20 @@ def post(self, request, *args, **kwargs):
                 voto = v[0]
                 parlamentar_id = v[1]
 
-                if(voto == 'Sim'):
+                if voto == 'Sim':
                     votos_sim += 1
-                elif(voto == 'Não'):
+                elif voto == 'Não':
                     votos_nao += 1
-                elif(voto == 'Abstenção'):
+                elif voto == 'Abstenção':
                     abstencoes += 1
-                elif(voto == 'Não Votou'):
+                elif voto == 'Não Votou':
                     nao_votou += 1
 
             # Caso todas as opções sejam 'Não votou', fecha a votação
             if nao_votou == len(request.POST.getlist('voto_parlamentar')):
-                fechar_votacao_materia(materia_votacao)
-                return self.form_valid(form)
+                form.add_error(None, 'Não é possível finalizar a votação sem '\
+                                     'nenhum voto')
+                return self.form_invalid(form)
 
             if self.ordem:
                 votacao = RegistroVotacao.objects.filter(
@@ -1771,7 +1773,7 @@ def post(self, request, *args, **kwargs):
             votacao.numero_votos_sim = votos_sim
             votacao.numero_votos_nao = votos_nao
             votacao.numero_abstencoes = abstencoes
-            votacao.observacao = request.POST['observacao']
+            votacao.observacao = request.POST.get('observacao', None)
 
             if self.ordem:
                 votacao.materia_id = ordem.materia.id
@@ -1780,8 +1782,7 @@ def post(self, request, *args, **kwargs):
                 votacao.materia_id = expediente.materia.id
                 votacao.expediente_id = expediente_id
 
-            votacao.tipo_resultado_votacao_id = int(
-                request.POST['resultado_votacao'])
+            votacao.tipo_resultado_votacao = form.cleaned_data['resultado_votacao']
             votacao.save()
 
             for votos in request.POST.getlist('voto_parlamentar'):
@@ -1803,8 +1804,7 @@ def post(self, request, *args, **kwargs):
                 voto_parlamentar.votacao_id = votacao.id
                 voto_parlamentar.save()
 
-                resultado = TipoResultadoVotacao.objects.get(
-                    id=request.POST['resultado_votacao'])
+                resultado = form.cleaned_data['resultado_votacao']
 
                 materia_votacao.resultado = resultado.nome
                 materia_votacao.votacao_aberta = False
@@ -1823,9 +1823,35 @@ def post(self, request, *args, **kwargs):
                     expediente=expediente,
                     votacao__isnull=True).delete()
             return self.form_valid(form)
+
         else:
             return self.form_invalid(form)
 
+    def form_invalid(self, form):
+        errors_tuple = [(form[e].label, form.errors[e]) for e in form.errors if e in form.fields]
+        error_message = '''<ul>'''
+        for e in errors_tuple:
+            error_message += '''<li><b>%s</b>: %s</li>''' % (e[0], e[1][0])
+        for e in form.non_field_errors():
+            error_message += '''<li>%s</li>''' % e
+        error_message += '''</ul>'''
+
+        messages.add_message(self.request, messages.ERROR, error_message)
+
+        if self.ordem:
+            view = 'sapl.sessao:votacaonominal'
+        elif self.expediente:
+            view = 'sapl.sessao:votacaonominalexp'
+        else:
+            view = None
+
+        return HttpResponseRedirect(reverse(
+            view,
+            kwargs={'pk': self.kwargs['pk'],
+                    'oid': self.kwargs['oid'],
+                    'mid': self.kwargs['mid']}))
+
+
     def get_parlamentares(self, presencas):
         self.object = self.get_object()
 
@@ -1848,10 +1874,6 @@ def get_parlamentares(self, presencas):
                 else:
                     yield [parlamentar, voto.voto]
 
-    def get_tipos_votacao(self):
-        for tipo in TipoResultadoVotacao.objects.all():
-            yield tipo
-
     def get_success_url(self):
         pk = self.kwargs['pk']
 


Test patch: