From 7781cb351bb52073dbf4690a6fea32570aea144c Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Tue, 6 Jun 2017 13:43:19 -0300 Subject: [PATCH] Votacao interativa refatorada --- sapl/painel/views.py | 71 ++++++++++++------ .../migrations/0007_auto_20170606_1238.py | 26 +++++++ sapl/sessao/models.py | 13 ++++ sapl/sessao/views.py | 75 +++++++++---------- 4 files changed, 125 insertions(+), 60 deletions(-) create mode 100644 sapl/sessao/migrations/0007_auto_20170606_1238.py diff --git a/sapl/painel/views.py b/sapl/painel/views.py index 30fce8ce6..e0760dcfb 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -38,7 +38,11 @@ def votante_view(request, pk): context = {'head_title': str(_('Votação Individual')), 'sessao_id': pk} # Pega sessão - sessao = SessaoPlenaria.objects.get(pk=pk) + try: + sessao = SessaoPlenaria.objects.get(pk=pk) + except ObjectDoesNotExist: + raise Http404() + context.update({'sessao': sessao, 'data': sessao.data_inicio, 'hora': sessao.hora_inicio}) @@ -98,11 +102,15 @@ def votante_view(request, pk): 'Nenhuma matéria com votação nominal aberta.'}) # Recupera o voto do parlamentar logado + if ordem_dia: + voto = VotoParlamentar.objects.filter( + ordem=ordem_dia) + elif expediente: + voto = VotoParlamentar.objects.filter( + expediente=expediente) + try: - voto = VotoNominal.objects.get( - sessao=sessao, - parlamentar=parlamentar, - materia=materia) + voto = voto.get(parlamentar=parlamentar) except ObjectDoesNotExist: context.update({'voto_parlamentar': 'Voto não computado.'}) else: @@ -110,23 +118,42 @@ def votante_view(request, pk): # Salva o voto if request.method == 'POST': - try: - voto = VotoNominal.objects.get( - sessao=sessao, - parlamentar=parlamentar, - materia=materia) - except ObjectDoesNotExist: - voto = VotoNominal.objects.create( - sessao=sessao, - parlamentar=parlamentar, - materia=materia, - voto=request.POST['voto'], - ip=get_client_ip(request), - user=request.user) - else: - voto.voto = request.POST['voto'] - voto.ip = get_client_ip(request) - voto.save() + if ordem_dia: + try: + voto = VotoParlamentar.objects.get( + parlamentar=parlamentar, + ordem=ordem_dia) + except ObjectDoesNotExist: + voto = VotoParlamentar.objects.create( + parlamentar=parlamentar, + voto=request.POST['voto'], + user=request.user, + ip=get_client_ip(request), + ordem=ordem_dia) + else: + voto.voto = request.POST['voto'] + voto.ip = get_client_ip(request) + voto.user = request.user + voto.save() + + elif expediente: + try: + voto = VotoParlamentar.objects.get( + parlamentar=parlamentar, + expediente=expediente) + except ObjectDoesNotExist: + voto = VotoParlamentar.objects.create( + parlamentar=parlamentar, + voto=request.POST['voto'], + user=request.user, + ip=get_client_ip(request), + expediente=expediente) + else: + voto.voto = request.POST['voto'] + voto.ip = get_client_ip(request) + voto.user = request.user + voto.save() + return HttpResponseRedirect( reverse('sapl.painel:voto_individual', kwargs={'pk': pk})) diff --git a/sapl/sessao/migrations/0007_auto_20170606_1238.py b/sapl/sessao/migrations/0007_auto_20170606_1238.py new file mode 100644 index 000000000..33cc2be35 --- /dev/null +++ b/sapl/sessao/migrations/0007_auto_20170606_1238.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-06-06 12:38 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0006_auto_20170601_1257'), + ] + + operations = [ + migrations.AddField( + model_name='votoparlamentar', + name='expediente', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.ExpedienteMateria'), + ), + migrations.AddField( + model_name='votoparlamentar', + name='ordem', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.OrdemDia'), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index c2ad8d19b..a7cbc51d5 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -412,6 +412,12 @@ class RegistroVotacao(models.Model): @reversion.register() class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar + ''' + As colunas ordem e expediente são redundantes, levando em consideração + que RegistroVotacao já possui ordem/expediente. Entretanto, para + viabilizar a votação interativa, uma vez que ela é feita antes de haver + um RegistroVotacao, é preciso identificar o voto por ordem/expediente. + ''' votacao = models.ForeignKey(RegistroVotacao, blank=True, null=True) @@ -432,6 +438,13 @@ class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar blank=True, null=True) + ordem = models.ForeignKey(OrdemDia, + blank=True, + null=True) + expediente = models.ForeignKey(ExpedienteMateria, + blank=True, + null=True) + class Meta: verbose_name = _('Registro de Votação de Parlamentar') verbose_name_plural = _('Registros de Votações de Parlamentares') diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index cf83e74c3..4f1dfd546 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1568,25 +1568,24 @@ class VotacaoView(SessaoPermissionMixin): kwargs={'pk': pk}) -def fechar_votacao_materia(ordem=None, expediente=None): - if ordem: - registro_votacao = RegistroVotacao.objects.filter(ordem=ordem) +def fechar_votacao_materia(materia): + if type(materia) == OrdemDia: + registro_votacao = RegistroVotacao.objects.filter(ordem=materia) + voto_parlamentar = VotoParlamentar.objects.filter(ordem=materia) - for r in registro_votacao: - r.delete() - - ordem.votacao_aberta = False - ordem.save() - - elif expediente: + elif type(materia) == ExpedienteMateria: registro_votacao = RegistroVotacao.objects.filter( - expediente=expediente) + expediente=materia) + voto_parlamentar = VotoParlamentar.objects.filter(expediente=materia) - for r in registro_votacao: - r.delete() + for v in voto_parlamentar: + v.delete() - expediente.votacao_aberta = False - expediente.save() + for r in registro_votacao: + r.delete() + + materia.votacao_aberta = False + materia.save() class VotacaoNominalAbstract(SessaoPermissionMixin): @@ -1611,7 +1610,7 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): total = PresencaOrdemDia.objects.filter( sessao_plenaria_id=ordem.sessao_plenaria_id).count() - tipo_materia_votacao = ordem + materia_votacao = ordem elif self.expediente: expediente_id = kwargs['oid'] @@ -1631,15 +1630,15 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): total = SessaoPlenariaPresenca.objects.filter( sessao_plenaria_id=expediente.sessao_plenaria_id).count() - tipo_materia_votacao = expediente + materia_votacao = expediente - materia = {'materia': tipo_materia_votacao.materia, + materia = {'materia': materia_votacao.materia, 'ementa': sub( ' ', ' ', strip_tags( - tipo_materia_votacao.observacao))} + materia_votacao.observacao))} context = {'materia': materia, 'object': self.get_object(), 'parlamentares': self.get_parlamentares( - tipo_materia_votacao.materia), + materia_votacao.materia), 'tipos': self.get_tipos_votacao(), 'total': total} @@ -1655,7 +1654,7 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): except ObjectDoesNotExist: raise Http404() - tipo_materia_votacao = ordem + materia_votacao = ordem elif self.expediente: expediente_id = kwargs['oid'] @@ -1664,16 +1663,12 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): except ObjectDoesNotExist: raise Http404() - tipo_materia_votacao = expediente + materia_votacao = expediente form = VotacaoNominalForm(request.POST) if 'cancelar-votacao' in request.POST: - if self.ordem: - fechar_votacao_materia(ordem=ordem) - elif self.expediente: - fechar_votacao_materia(expediente=expediente) - + fechar_votacao_materia(materia_votacao) return self.form_valid(form) if form.is_valid(): @@ -1698,11 +1693,7 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): # Caso todas as opções sejam 'Não votou', fecha a votação if nao_votou == len(request.POST.getlist('voto_parlamentar')): - if self.ordem: - fechar_votacao_materia(ordem=ordem) - elif self.expediente: - fechar_votacao_materia(expediente=expediente) - + fechar_votacao_materia(materia_votacao) return self.form_valid(form) if self.ordem: @@ -1738,7 +1729,15 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): voto = v[0] parlamentar_id = v[1] - voto_parlamentar = VotoParlamentar() + if self.ordem: + voto_parlamentar = VotoParlamentar.objects.get_or_create( + parlamentar_id=parlamentar_id, + ordem=ordem)[0] + elif self.expediente: + voto_parlamentar = VotoParlamentar.objects.get_or_create( + parlamentar_id=parlamentar_id, + expediente=expediente)[0] + voto_parlamentar.voto = voto voto_parlamentar.parlamentar_id = parlamentar_id voto_parlamentar.votacao_id = votacao.id @@ -1747,9 +1746,9 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): resultado = TipoResultadoVotacao.objects.get( id=request.POST['resultado_votacao']) - tipo_materia_votacao.resultado = resultado.nome - tipo_materia_votacao.votacao_aberta = False - tipo_materia_votacao.save() + materia_votacao.resultado = resultado.nome + materia_votacao.votacao_aberta = False + materia_votacao.save() return self.form_valid(form) else: @@ -1765,10 +1764,10 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): if self.ordem: voto_parlamentar = VotoParlamentar.objects.filter( - votacao__ordem=self.kwargs['oid']) + ordem=self.kwargs['oid']) elif self.expediente: voto_parlamentar = VotoParlamentar.objects.filter( - votacao__expediente=self.kwargs['oid']) + expediente=self.kwargs['oid']) for parlamentar in Parlamentar.objects.filter(ativo=True): if parlamentar in presentes: