diff --git a/sapl/base/templatetags/menus.py b/sapl/base/templatetags/menus.py index 289cd20e6..b9fb593e5 100644 --- a/sapl/base/templatetags/menus.py +++ b/sapl/base/templatetags/menus.py @@ -89,7 +89,7 @@ def nav_run(context, path=None): %s """) % ( yaml_path, rm.app_name, str(e))) - + return {'menu': menu} diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index d76616a56..f22eeee28 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -1,4 +1,4 @@ - +from django.contrib import messages from datetime import datetime from crispy_forms.helper import FormHelper @@ -426,13 +426,35 @@ class OcorrenciaSessaoForm(ModelForm): class VotacaoForm(forms.Form): - 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') + votos_sim = forms.IntegerField(label='Sim') + votos_nao = forms.IntegerField(label='Não') + abstencoes = forms.IntegerField(label='Abstenções') + total_presentes = forms.IntegerField(required=False, widget=forms.HiddenInput()) + voto_presidente = forms.IntegerField(label='A totalização inclui o voto do Presidente?') + total_votos = forms.IntegerField(required=False, label='total') observacao = forms.CharField(required=False , label='Observação') resultado_votacao = forms.CharField(label='Resultado da Votação') + def clean(self): + cleaned_data = super(VotacaoForm, self).clean() + if not self.is_valid(): + return cleaned_data + + votos_sim = cleaned_data['votos_sim'] + votos_nao = cleaned_data['votos_nao'] + abstencoes = cleaned_data['abstencoes'] + qtde_presentes = cleaned_data['total_presentes'] + qtde_votos = votos_sim + votos_nao + abstencoes + voto_presidente = cleaned_data['voto_presidente'] + + if not voto_presidente: + qtde_presentes -= 1 + + if qtde_votos != qtde_presentes: + raise ValidationError('O total de votos não corresponde com a quantidade de presentes!') + + return cleaned_data + # def save(self, commit=False): # #TODO Verificar se esse códido é utilizado diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 203521e97..18d602714 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -898,9 +898,9 @@ class PresencaOrdemDiaView(FormMixin, PresencaMixin, DetailView): ordem.sessao_plenaria = self.object ordem.parlamentar = Parlamentar.objects.get(id=p) ordem.save() + username = request.user.username + self.logger.info('user=' + username + '. PresencaOrdemDia (parlamentar com id={}) salva com sucesso!'.format(p)) - username = request.user.username - self.logger.info('user=' + username + '. PresencaOrdemDia (parlamentar com id={}) salva com sucesso!'.format(p)) msg = _('Presença em Ordem do Dia salva com sucesso!') messages.add_message(request, messages.SUCCESS, msg) @@ -3231,18 +3231,16 @@ class VotacaoEmBlocoExpediente(ListView): def get_queryset(self): kwargs = self.kwargs return ExpedienteMateria.objects.filter(sessao_plenaria_id=kwargs['pk'], - resultado='') + resultado='') def get_context_data(self, **kwargs): context = super(VotacaoEmBlocoExpediente, self).get_context_data(**kwargs) context['turno_choices'] = Tramitacao.TURNO_CHOICES + context['title'] = SessaoPlenaria.objects.get(id=self.kwargs['pk']) context['pk'] = self.kwargs['pk'] + context.update({'subnav_template_name': 'sessao/subnav.yaml'}) return context - def post(self, request, *args, **kwargs): - return HttpResponseRedirect( - reverse('sapl.sessao:votacaoblocosimb', kwargs=self.kwargs)) - class VotacaoEmBlocoOrdemDia(ListView): model = OrdemDia @@ -3252,20 +3250,17 @@ class VotacaoEmBlocoOrdemDia(ListView): context_object_name = 'ordem_dia' def get_queryset(self): - kwargs = self.kwargs - return OrdemDia.objects.filter(sessao_plenaria_id=kwargs['pk'], + return OrdemDia.objects.filter(sessao_plenaria_id=self.kwargs['pk'], resultado='') def get_context_data(self, **kwargs): context = super(VotacaoEmBlocoOrdemDia, self).get_context_data(**kwargs) context['turno_choices'] = Tramitacao.TURNO_CHOICES context['pk'] = self.kwargs['pk'] + context['title'] = SessaoPlenaria.objects.get(id=self.kwargs['pk']) + context.update({'subnav_template_name': 'sessao/subnav.yaml'}) return context - def post(self, request, *args, **kwargs): - return HttpResponseRedirect( - reverse('sapl.sessao:votacaoblocosimb', kwargs=self.kwargs)) - class VotacaoEmBlocoSimbolicaView(TemplateView): @@ -3277,21 +3272,26 @@ class VotacaoEmBlocoSimbolicaView(TemplateView): logger = logging.getLogger(__name__) def post(self, request, *args, **kwargs): + if not 'context' in locals(): - context = {'pk': self.kwargs['pk']} + context = {'pk': self.kwargs['pk'], + 'title': SessaoPlenaria.objects.get(id=self.kwargs['pk']), + 'subnav_template_name': 'sessao/subnav.yaml'} - if 'origem' in request.POST: + if 'marcadas_1' in request.POST: context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(), 'origem': request.POST['origem']}) + + # marcadas_1 se refere a votação simbólica e marcadas_2 a votação nominal if request.POST['origem'] == 'ordem': - ordens = OrdemDia.objects.filter(id__in=request.POST.getlist('marcadas_id_1')) + ordens = OrdemDia.objects.filter(id__in=request.POST.getlist('marcadas_1')) qtde_presentes = PresencaOrdemDia.objects.filter( sessao_plenaria_id=self.kwargs['pk']).count() context.update({'ordens':ordens, 'total_presentes': qtde_presentes}) else: - expedientes = ExpedienteMateria.objects.filter(id__in=request.POST.getlist('marcadas_id_1')) + expedientes = ExpedienteMateria.objects.filter(id__in=request.POST.getlist('marcadas_1')) qtde_presentes = SessaoPlenariaPresenca.objects.filter( sessao_plenaria_id=self.kwargs['pk']).count() context.update({'expedientes':expedientes, @@ -3301,21 +3301,8 @@ class VotacaoEmBlocoSimbolicaView(TemplateView): form = VotacaoForm(request.POST) if form.is_valid(): - qtde_votos = (int(request.POST['votos_sim']) + - int(request.POST['votos_nao']) + - int(request.POST['abstencoes'])) - - qtde_presentes = int(request.POST['total_presentes']) - - if (request.POST['voto_presidente'] == '0'): - qtde_presentes -= 1 - if qtde_votos != qtde_presentes: - form._errors["total_votos"] = ErrorList([u""]) - form.add_error(None, 'O total de votos não corresponde com a quantidade de presentes!') - return self.form_invalid(form,context) - - origem = request.POST['origem2'] + origem = request.POST['origem'] if origem == 'ordem': ordens = OrdemDia.objects.filter(id__in=request.POST.getlist('ordens')) @@ -3335,8 +3322,10 @@ class VotacaoEmBlocoSimbolicaView(TemplateView): votacao.save() except Exception as e: username = request.user.username - self.logger.error('user=' + username + '. Problemas ao salvar RegistroVotacao da materia de id={} ' - 'e da ordem de id={}. '.format(ordem.materia.id, ordem.id) + str(e)) + self.logger.error('user=' + username + '. Problemas ao salvar ' + 'RegistroVotacao da materia de id={} ' + 'e da ordem de id={}. ' + .format(ordem.materia.id, ordem.id) + str(e)) return self.form_invalid(form, context) else: ordem.resultado = resultado.nome @@ -3368,13 +3357,13 @@ class VotacaoEmBlocoSimbolicaView(TemplateView): expediente.votacao_aberta = False expediente.save() - return HttpResponseRedirect(self.get_success_url(origem)) + return HttpResponseRedirect(self.get_success_url()) else: return self.form_invalid(form, context) if 'cancelar-votacao' in request.POST: - if request.POST['origem2'] == 'ordem': + if request.POST['origem'] == 'ordem': ordens = OrdemDia.objects.filter(id__in=request.POST.getlist('ordens')) for ordem in ordens: ordem.votacao_aberta = False @@ -3385,8 +3374,7 @@ class VotacaoEmBlocoSimbolicaView(TemplateView): expediente.votacao_aberta = False expediente.save() - origem = request.POST['origem2'] - return HttpResponseRedirect(self.get_success_url(origem)) + return HttpResponseRedirect(self.get_success_url()) return self.render_to_response(context) @@ -3395,14 +3383,13 @@ class VotacaoEmBlocoSimbolicaView(TemplateView): for tipo in TipoResultadoVotacao.objects.all(): yield tipo - def get_success_url(self, origem): - pk = self.kwargs['pk'] - if origem=='ordem': + def get_success_url(self): + if self.request.POST['origem']=='ordem': return reverse('sapl.sessao:ordemdia_list', - kwargs={'pk': pk}) + kwargs={'pk': self.kwargs['pk']}) else: return reverse('sapl.sessao:expedientemateria_list', - kwargs={'pk': pk}) + kwargs={'pk': self.kwargs['pk']}) def form_invalid(self, form, context): @@ -3417,13 +3404,13 @@ class VotacaoEmBlocoSimbolicaView(TemplateView): messages.add_message(self.request, messages.ERROR, error_message) - if self.request.POST['origem2'] == 'ordem': + if self.request.POST['origem'] == 'ordem': ordens = OrdemDia.objects.filter(id__in=self.request.POST.getlist('ordens')) qtde_presentes = PresencaOrdemDia.objects.filter( sessao_plenaria_id=self.kwargs['pk']).count() context.update({'ordens': ordens, 'total_presentes': qtde_presentes}) - elif self.request.POST['origem2'] == 'expediente': + elif self.request.POST['origem'] == 'expediente': expedientes = ExpedienteMateria.objects.filter(id__in=self.request.POST.getlist('expedientes')) qtde_presentes = SessaoPlenariaPresenca.objects.filter( sessao_plenaria_id=self.kwargs['pk']).count() @@ -3432,7 +3419,7 @@ class VotacaoEmBlocoSimbolicaView(TemplateView): context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(), 'form': form, - 'origem': self.request.POST['origem2']}) + 'origem': self.request.POST['origem']}) return self.render_to_response(context) @@ -3449,29 +3436,32 @@ class VotacaoEmBlocoNominalView(TemplateView): form = VotacaoNominalForm(request.POST) if not 'context' in locals(): - context = {'pk': self.kwargs['pk']} + context = {'pk': self.kwargs['pk'], + 'title': SessaoPlenaria.objects.get(id=self.kwargs['pk']), + 'subnav_template_name': 'sessao/subnav.yaml'} - if 'origem' in request.POST: + if 'marcadas_2' in request.POST: context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(), - 'origem': request.POST['origem'], - 'form': form}) + 'origem': request.POST['origem']}) + + # marcadas_1 se refere a votação simbólica e marcadas_2 a votação nominal if request.POST['origem'] == 'ordem': - ordens = OrdemDia.objects.filter(id__in=request.POST.getlist('marcadas_id_2')) + ordens = OrdemDia.objects.filter(id__in=request.POST.getlist('marcadas_2')) presentes = PresencaOrdemDia.objects.filter( sessao_plenaria_id=kwargs['pk']) context.update({'ordens':ordens}) else: - expedientes = ExpedienteMateria.objects.filter(id__in=request.POST.getlist('marcadas_id_2')) + expedientes = ExpedienteMateria.objects.filter(id__in=request.POST.getlist('marcadas_2')) presentes = SessaoPlenariaPresenca.objects.filter( sessao_plenaria_id=kwargs['pk']) context.update({'expedientes':expedientes}) - total = presentes.count() + total_presentes = presentes.count() context.update({'parlamentares':self.get_parlamentares(), - 'total':total}) + 'total_presentes':total_presentes}) if 'cancelar-votacao' in request.POST: - if request.POST['origem2'] == 'ordem': + if request.POST['origem'] == 'ordem': for ordem_id in request.POST.getlist('ordens'): ordem = OrdemDia.objects.get(id=ordem_id) fechar_votacao_materia(ordem) @@ -3490,7 +3480,7 @@ class VotacaoEmBlocoNominalView(TemplateView): if form.is_valid(): if form.cleaned_data['resultado_votacao'] == None: form.add_error(None, 'Não é possível finalizar a votação sem ' - 'nenhum resultado da votação') + 'nenhum resultado da votação.') return self.form_invalid(form, context) qtde_votos = (int(request.POST['votos_sim']) + @@ -3498,17 +3488,15 @@ class VotacaoEmBlocoNominalView(TemplateView): int(request.POST['abstencoes']) + int(request.POST['nao_votou'])) - origem = request.POST['origem2'] - # Caso todas as opções sejam 'Não votou', fecha a votação if int(request.POST['nao_votou']) == qtde_votos: self.logger.error('user=' + username + '. Não é possível finalizar a votação sem ' - 'nenhum voto') + 'nenhum voto.') form.add_error(None, 'Não é possível finalizar a votação sem ' - 'nenhum voto') + 'nenhum voto.') return self.form_invalid(form, context) - if origem=='ordem': + if request.POST['origem'] == 'ordem': for ordem_id in request.POST.getlist('ordens'): ordem = OrdemDia.objects.get(id=ordem_id) # Remove todas as votação desta matéria, caso existam @@ -3591,23 +3579,25 @@ class VotacaoEmBlocoNominalView(TemplateView): return self.render_to_response(context) def get_parlamentares(self): - - if 'origem' in self.request.POST: + + #campos hidden ainda não preenchidos + if 'marcadas_2' in self.request.POST: if self.request.POST['origem'] == 'ordem': presencas = PresencaOrdemDia.objects.filter( sessao_plenaria_id=self.kwargs['pk']) - ordens_id = self.request.POST.getlist('marcadas_id_2') + ordens_id = self.request.POST.getlist('marcadas_2') voto_parlamentar = VotoParlamentar.objects.filter( ordem=ordens_id[0]) else: presencas = PresencaOrdemDia.objects.filter( sessao_plenaria_id=self.kwargs['pk']) - expedientes_id = self.request.POST.getlist('marcadas_id_2') + expedientes_id = self.request.POST.getlist('marcadas_2') voto_parlamentar = VotoParlamentar.objects.filter( expediente=expedientes_id[0]) - #origem2 + + #campos hidden já preenchidos else: - if self.request.POST['origem2'] == 'ordem': + if self.request.POST['origem'] == 'ordem': presencas = PresencaOrdemDia.objects.filter( sessao_plenaria_id=self.kwargs['pk']) ordens_id = self.request.POST.getlist('ordens') @@ -3636,7 +3626,7 @@ class VotacaoEmBlocoNominalView(TemplateView): yield [parlamentar, voto.voto] def get_success_url(self): - if self.request.POST['origem2']=='ordem': + if self.request.POST['origem']=='ordem': return reverse('sapl.sessao:ordemdia_list', kwargs={'pk': self.kwargs['pk']}) else: @@ -3647,31 +3637,31 @@ class VotacaoEmBlocoNominalView(TemplateView): errors_tuple = [(form[e].label, form.errors[e]) for e in form.errors if e in form.fields] - error_message = '''' messages.add_message(self.request, messages.ERROR, error_message) - if self.request.POST['origem2'] == 'ordem': + if self.request.POST['origem'] == 'ordem': ordens = OrdemDia.objects.filter(id__in=self.request.POST.getlist('ordens')) presentes = PresencaOrdemDia.objects.filter( sessao_plenaria_id=self.kwargs['pk']) context.update({'ordens': ordens}) - elif self.request.POST['origem2'] == 'expediente': + elif self.request.POST['origem'] == 'expediente': expedientes = ExpedienteMateria.objects.filter(id__in=self.request.POST.getlist('expedientes')) presentes = SessaoPlenariaPresenca.objects.filter( sessao_plenaria_id=self.kwargs['pk']) context.update({'expedientes': expedientes}) - total = presentes.count() + total_presentes = presentes.count() context.update({'parlamentares':self.get_parlamentares(), - 'total':total, + 'total_presentes':total_presentes, 'resultado_votacao': TipoResultadoVotacao.objects.all(), 'form': form, - 'origem': self.request.POST['origem2']}) + 'origem': self.request.POST['origem']}) return self.render_to_response(context) \ No newline at end of file diff --git a/sapl/templates/sessao/votacao/votacao_bloco_expediente.html b/sapl/templates/sessao/votacao/votacao_bloco_expediente.html index 6be1c323d..55ecdff5a 100644 --- a/sapl/templates/sessao/votacao/votacao_bloco_expediente.html +++ b/sapl/templates/sessao/votacao/votacao_bloco_expediente.html @@ -1,23 +1,7 @@ {% extends "crud/detail.html" %} {% load i18n crispy_forms_tags %} -{% block detail_content %} - {% comment %} {% block buttons %} - - {% if filter_url and not filter.form.errors %} -
- {% trans 'Fazer nova pesquisa' %} -
- -
- {% trans 'Matérias do Expediente' %} -
- - {% endif %} - - {% endblock %} - -

{% endcomment %} +{% block base_content %}
{% csrf_token %} @@ -31,9 +15,9 @@
- +
- +
@@ -58,7 +42,7 @@ {% for o in expedientes %} - + {{o.materia.tipo.sigla}} {{o.materia.numero}}/{{o.materia.ano}} - {{o.materia.tipo}}
{% if o.materia.numeracao_set.last %} Processo:   {{o.materia.numeracao_set.last}}
@@ -103,13 +87,13 @@ -{% endblock detail_content %} +{% endblock base_content %} {% block extra_js %}