diff --git a/sapl/painel/urls.py b/sapl/painel/urls.py index b617d8fec..f0054bd3c 100644 --- a/sapl/painel/urls.py +++ b/sapl/painel/urls.py @@ -20,6 +20,6 @@ urlpatterns = [ url(r'^painel/cronometro$', cronometro_painel, name='cronometro_painel'), # url(r'^painel/cronometro$', include(CronometroPainelCrud.get_urls())), - url(r'^voto-individual/(?P\d+)$', votante_view, + url(r'^voto-individual/$', votante_view, name="voto_individual"), ] diff --git a/sapl/painel/views.py b/sapl/painel/views.py index df30ada41..010b92cb8 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -1,7 +1,9 @@ from datetime import date +from django.contrib import messages from django.contrib.auth.decorators import user_passes_test -from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned +from django.db.models import Q from django.core.urlresolvers import reverse from django.http import HttpResponse, JsonResponse from django.http.response import Http404, HttpResponseRedirect @@ -30,51 +32,36 @@ def check_permission(user): return user.has_module_perms(AppConfig.label) -def votante_view(request, pk): - if not Votante.objects.filter(user=request.user).exists(): - raise Http404('Você não tem permissão para votar') +def votacao_aberta(request): + votacoes_abertas = SessaoPlenaria.objects.filter( + Q(ordemdia__votacao_aberta=True) | + Q(expedientemateria__votacao_aberta=True)).distinct() - context = {'head_title': str(_('Votação Individual')), 'sessao_id': pk} + if len(votacoes_abertas) > 1: + msg_abertas = '' + for i, v in enumerate(votacoes_abertas): + if i != 0: + msg_abertas += ', ' + msg_abertas += '''%s''' % ( + reverse('sapl.sessao:sessaoplenaria_detail', + kwargs={'pk': v.id}), + v.__str__()) - # Pega sessão - try: - sessao = SessaoPlenaria.objects.get(pk=pk) - except ObjectDoesNotExist: - raise Http404() + msg = _('Existe mais de uma votações aberta. Elas se encontram ' + 'nas seguintes Sessões: ' + msg_abertas + '. Para votar, ' + 'peça para que o Operador as feche.') + messages.add_message(request, messages.INFO, msg) + return HttpResponseRedirect('/') - context.update({'sessao': sessao, - 'data': sessao.data_inicio, - 'hora': sessao.hora_inicio}) + else: + return votacoes_abertas.first() - # Inicializa presentes - presentes = [] - # Verifica votação aberta - # Se aberta, verifica se é nominal. ID nominal == 2 - ordem_dia = get_materia_aberta(pk) - expediente = get_materia_expediente_aberta(pk) - materia = None +def votante_view(request): + if not Votante.objects.filter(user=request.user).exists(): + raise Http404('Você não tem permissão para votar') - if ordem_dia: - materia = ordem_dia.materia - if ordem_dia.tipo_votacao == VOTACAO_NOMINAL: - context.update({'materia': materia, 'ementa': materia.ementa}) - presentes = PresencaOrdemDia.objects.filter(sessao_plenaria_id=pk) - else: - context.update( - {'materia': 'A matéria aberta não é votação nominal.'}) - elif expediente: - materia = expediente.materia - if expediente.tipo_votacao == VOTACAO_NOMINAL: - context.update({'materia': materia, 'ementa': materia.ementa}) - presentes = SessaoPlenariaPresenca.objects.filter( - sessao_plenaria_id=pk) - else: - context.update( - {'materia': 'A matéria aberta não é votação nominal.'}) - else: - context.update( - {'materia': 'Nenhuma matéria com votação nominal aberta.'}) + context = {'head_title': str(_('Votação Individual'))} # Verifica se usuário possui permissão para votar if 'parlamentares.can_vote' in request.user.get_all_permissions(): @@ -82,40 +69,92 @@ def votante_view(request, pk): else: context.update({'permissao': False}) - # Verifica se usuário está presente na sessão + # Pega o votante relacionado ao usuário try: votante = Votante.objects.get(user=request.user) except ObjectDoesNotExist: context.update({'error_message': 'Erro ao recuperar parlamentar ligado ao usuário'}) - else: - parlamentar = votante.parlamentar - context.update({'presente': False}) - if len(presentes) > 0: - for p in presentes: - if p.parlamentar.id == parlamentar.id: - context.update({'presente': True}) - break - else: - context.update({'error_message': - 'Nenhuma matéria com votação nominal aberta.'}) + except MultipleObjectsReturned: + context.update({'error_message': + 'Este usuário está ligado a mais de um Votante!'}) - # Recupera o voto do parlamentar logado - voto = [] - if ordem_dia: - voto = VotoParlamentar.objects.filter( - ordem=ordem_dia) - elif expediente: - voto = VotoParlamentar.objects.filter( - expediente=expediente) + # Pega sessão + sessao = votacao_aberta(request) + if sessao: + pk = sessao.pk - if voto: - try: - voto = voto.get(parlamentar=parlamentar) - except ObjectDoesNotExist: - context.update({'voto_parlamentar': 'Voto não computado.'}) + context.update({'sessao_id': pk}) + + context.update({'sessao': sessao, + 'data': sessao.data_inicio, + 'hora': sessao.hora_inicio}) + + # Inicializa presentes + presentes = [] + + # Verifica votação aberta + # Se aberta, verifica se é nominal. ID nominal == 2 + ordem_dia = get_materia_aberta(pk) + expediente = get_materia_expediente_aberta(pk) + materia = None + + if ordem_dia: + materia = ordem_dia.materia + if ordem_dia.tipo_votacao == VOTACAO_NOMINAL: + context.update({'materia': materia, 'ementa': materia.ementa}) + presentes = PresencaOrdemDia.objects.filter( + sessao_plenaria_id=pk) + else: + context.update( + {'materia': 'A matéria aberta não é votação nominal.'}) + elif expediente: + materia = expediente.materia + if expediente.tipo_votacao == VOTACAO_NOMINAL: + context.update({'materia': materia, 'ementa': materia.ementa}) + presentes = SessaoPlenariaPresenca.objects.filter( + sessao_plenaria_id=pk) + else: + context.update( + {'materia': 'A matéria aberta não é votação nominal.'}) else: - context.update({'voto_parlamentar': voto.voto}) + context.update( + {'materia': 'Nenhuma matéria com votação nominal aberta.'}) + + # Verifica se usuário está presente na sessão + if votante: + parlamentar = votante.parlamentar + context.update({'presente': False}) + if len(presentes) > 0: + for p in presentes: + if p.parlamentar.id == parlamentar.id: + context.update({'presente': True}) + break + else: + context.update({'error_message': + 'Não há presentes na Sessão com a matéria em ' + 'votação.'}) + + # Recupera o voto do parlamentar logado + voto = [] + if ordem_dia: + voto = VotoParlamentar.objects.filter( + ordem=ordem_dia) + elif expediente: + voto = VotoParlamentar.objects.filter( + expediente=expediente) + + if voto: + try: + voto = voto.get(parlamentar=parlamentar) + except ObjectDoesNotExist: + context.update({'voto_parlamentar': 'Voto não computado.'}) + else: + context.update({'voto_parlamentar': voto.voto}) + + else: + context.update( + {'error_message': 'Nenhuma matéria aberta.'}) # Salva o voto if request.method == 'POST': diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 9beb28ee2..af3b7d8dd 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -6,6 +6,7 @@ from django.contrib.auth.decorators import permission_required from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.urlresolvers import reverse +from django.db.models import Q from django.forms.utils import ErrorList from django.http import JsonResponse from django.http.response import Http404, HttpResponseRedirect @@ -81,49 +82,46 @@ def reordernar_materias_ordem(request, pk): reverse('sapl.sessao:ordemdia_list', kwargs={'pk': pk})) -@permission_required('sessao.change_expedientemateria') -def abrir_votacao_expediente_view(request, pk, spk): - existe_expediente_aberto = ExpedienteMateria.objects.filter( - sessao_plenaria_id=spk, votacao_aberta=True - ).exists() - existe_ordem_aberta = OrdemDia.objects.filter( - sessao_plenaria_id=spk, votacao_aberta=True - ).exists() - - if existe_expediente_aberto or existe_ordem_aberta: - msg = _('Já existe uma matéria com votação aberta. Para abrir ' - 'outra, termine ou feche a votação existente.') +def verifica_votacoes_abertas(request, model, pk): + votacoes_abertas = SessaoPlenaria.objects.filter( + Q(ordemdia__votacao_aberta=True) | + Q(expedientemateria__votacao_aberta=True)).distinct() + + if votacoes_abertas: + msg_abertas = '' + for i, v in enumerate(votacoes_abertas): + if i != 0: + msg_abertas += ', ' + msg_abertas += '''%s''' % ( + reverse('sapl.sessao:sessaoplenaria_detail', + kwargs={'pk': v.id}), + v.__str__()) + + msg = _('Já existem votações abertas nas seguintes Sessões: ' + + msg_abertas + '. Para abrir ' + 'outra, termine ou feche as votações abertas.') messages.add_message(request, messages.INFO, msg) + else: - expediente = ExpedienteMateria.objects.get(id=pk) - expediente.votacao_aberta = True - expediente.save() + materia_votacao = model.objects.get(id=pk) + materia_votacao.votacao_aberta = True + materia_votacao.save() + + +@permission_required('sessao.change_expedientemateria') +def abrir_votacao_expediente_view(request, pk, spk): + verifica_votacoes_abertas(request, ExpedienteMateria, pk) return HttpResponseRedirect( reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': spk})) @permission_required('sessao.change_ordemdia') def abrir_votacao_ordem_view(request, pk, spk): - existe_ordem_aberta = OrdemDia.objects.filter( - sessao_plenaria_id=spk, votacao_aberta=True - ).exists() - existe_expediente_aberto = ExpedienteMateria.objects.filter( - sessao_plenaria_id=spk, votacao_aberta=True - ).exists() - - if existe_ordem_aberta or existe_expediente_aberto: - msg = _('Já existe uma matéria com votação aberta. Para abrir ' - 'outra, termine ou feche a votação existente.') - messages.add_message(request, messages.INFO, msg) - else: - ordem = OrdemDia.objects.get(id=pk) - ordem.votacao_aberta = True - ordem.save() + verifica_votacoes_abertas(request, OrdemDia, pk) return HttpResponseRedirect( reverse('sapl.sessao:ordemdia_list', kwargs={'pk': spk})) - def put_link_materia(context): for i, row in enumerate(context['rows']): materia = context['object_list'][i].materia @@ -133,6 +131,7 @@ def put_link_materia(context): context['rows'][i][1] = (row[1][0], url_materia) return context + def get_presencas_generic(model, sessao, legislatura): presencas = model.objects.filter( sessao_plenaria=sessao) diff --git a/sapl/templates/base.html b/sapl/templates/base.html index 647fcdc15..88b877016 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -63,6 +63,11 @@