From e315e91c2cb666321fe906a49e8e146b5dcdb86b Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 5 Oct 2015 09:58:34 -0300 Subject: [PATCH] Add open/close Votacao --- painel/urls.py | 4 +- painel/views.py | 102 +++++++++----------- sessao/models.py | 3 + sessao/views.py | 42 +++++--- templates/painel/mensagem.html | 2 +- templates/painel/parlamentares.html | 2 +- templates/painel/votacao.html | 2 +- templates/sessao/materia_ordemdia_list.html | 24 +++-- 8 files changed, 98 insertions(+), 83 deletions(-) diff --git a/painel/urls.py b/painel/urls.py index a9daf34ec..3fbf73c99 100644 --- a/painel/urls.py +++ b/painel/urls.py @@ -1,13 +1,13 @@ from django.conf.urls import include, url from .views import (controlador_painel, cronometro_painel_crud, - json_votacao, painel_mensagem_view, + get_dados_painel, painel_mensagem_view, painel_parlamentares_view, painel_view, painel_votacao_view) urlpatterns = [ url(r'^(?P\d+)/painel$', painel_view, name="painel_principal"), - url(r'^painel/(?P\d+)/json_votacao$', json_votacao, name='json_votacao'), + url(r'^painel/(?P\d+)/dados$', get_dados_painel, name='painel_dados'), url(r'^painel/controlador$', controlador_painel, name='painel_controlador'), url(r'^painel/mensagem$', painel_mensagem_view, name="painel_mensagem"), url(r'^painel/parlamentares$', painel_parlamentares_view, name='painel_parlamentares'), diff --git a/painel/views.py b/painel/views.py index a7e88e296..b1fe75bd6 100644 --- a/painel/views.py +++ b/painel/views.py @@ -68,81 +68,75 @@ def painel_parlamentares_view(request): def painel_votacao_view(request): return render(request, 'painel/votacao.html') -# REST web services +def get_dados_painel(request, pk): -# TODO: make this response non cacheable, -# probably on jQuery site, but check Django too -# TODO: reduce number of database query hits by means -# of QuerySet wizardry. + # Sessão Plenária + sessao_plenaria_id = pk + sessao_plenaria = SessaoPlenaria.objects.get(id=sessao_plenaria_id) + # # Ordem Dia + # ordem_dia = OrdemDia.objects.get(sessao_plenaria_id = sessao_plenaria_id) -def json_votacao(request, pk): - - - # TODO: se tentar usar objects.get(ordem_id = 104 - # ocorre a msg: 'RegistroVotacao' object does not support indexing - # TODO; tratar o caso de vir vazio - votacao = RegistroVotacao.objects.first() - - # Magic! - # http://stackoverflow.com/questions/15507171/django-filter-query-foreign-key - # recuperar pela votacao.id - voto_parlamentar = VotoParlamentar.objects.filter(votacao_id=votacao.id) - votos = {} - for vp in voto_parlamentar: - votos[vp.parlamentar.nome_parlamentar] = vp.voto - - ordem_dia = OrdemDia.objects.get(id=104) - - sessaoplenaria_id = ordem_dia.sessao_plenaria_id - - sessao_plenaria = SessaoPlenaria.objects.get(id=sessaoplenaria_id) - - # Pra recuperar o partido do parlamentar - # tem que fazer OUTRA query, deve ter uma - # forma de fazer isso na base do join de data models. - filiacao = Filiacao.objects.filter(data_desfiliacao__isnull=True) + # # Pra recuperar o partido do parlamentar + # # tem que fazer OUTRA query, deve ter uma + # # forma de fazer isso na base do join de data models. + filiacao = Filiacao.objects.filter(data_desfiliacao__isnull=True, parlamentar__ativo=True) parlamentar_partido = {} for f in filiacao: - parlamentar_partido[f.parlamentar.nome_parlamentar] = f.partido.sigla + parlamentar_partido[f.parlamentar.nome_parlamentar] = f.partido.sigla + + # Presença Sessão Plenária + sessao_plenaria_presenca = SessaoPlenariaPresenca.objects.filter(id=sessao_plenaria_id) + presentes_sessao_plenaria = [p.parlamentar.nome_parlamentar for p in sessao_plenaria_presenca] + num_presentes_sessao_plen = len(presentes_sessao_plenaria) - # FIXME: id fixo para testes - presenca_ordem_dia = PresencaOrdemDia.objects.filter( - sessao_plenaria_id=6) + # Presença Ordem do dia + presenca_ordem_dia = PresencaOrdemDia.objects.filter(sessao_plenaria_id=sessao_plenaria_id) presentes_ordem_dia = [] for p in presenca_ordem_dia: nome_parlamentar = p.parlamentar.nome_parlamentar presentes_ordem_dia.append( {'nome': nome_parlamentar, 'partido': parlamentar_partido[nome_parlamentar], - 'voto': votos.get(nome_parlamentar, '-')}) + #'voto': votos.get(nome_parlamentar, '-') + }) + num_presentes_ordem_dia = len(presentes_ordem_dia) + - total_votos = votacao.numero_votos_sim + \ - votacao.numero_votos_nao + votacao.numero_abstencoes + # # TODO: se tentar usar objects.get(ordem_id = 104 + # # ocorre a msg: 'RegistroVotacao' object does not support indexing + # # TODO; tratar o caso de vir vazio + # votacao = RegistroVotacao.objects.first() - sessao_plenaria_presenca = SessaoPlenariaPresenca.objects.filter( - id=sessaoplenaria_id) - presentes_sessao_plenaria = [] - for p in sessao_plenaria_presenca: - presentes_sessao_plenaria.append(p.parlamentar.nome_parlamentar) + # # Magic! + # # http://stackoverflow.com/questions/15507171/django-filter-query-foreign-key + # # recuperar pela votacao.id + # voto_parlamentar = VotoParlamentar.objects.filter(votacao_id=votacao.id) + # votos = {} + # for vp in voto_parlamentar: + # votos[vp.parlamentar.nome_parlamentar] = vp.voto - presentes = len(presentes_sessao_plenaria) + # total_votos = votacao.numero_votos_sim + votacao.numero_votos_nao + votacao.numero_abstencoes - tipo_resultado = votacao.tipo_resultado_votacao.nome.upper() + # tipo_resultado = votacao.tipo_resultado_votacao.nome.upper() votacao_json = {"sessao_plenaria": str(sessao_plenaria), "sessao_plenaria_data": sessao_plenaria.data_inicio, "sessao_plenaria_hora_inicio": sessao_plenaria.hora_inicio, - "materia_legislativa_texto": ordem_dia.materia.ementa, - "observacao_materia": ordem_dia.materia.observacao, - "tipo_votacao": ordem_dia.tipo_votacao, - "numero_votos_sim": votacao.numero_votos_sim, - "numero_votos_nao": votacao.numero_votos_nao, - "numero_abstencoes": votacao.numero_abstencoes, - "total_votos": total_votos, - "presentes": presentes, - "tipo_resultado": tipo_resultado, + #"materia_legislativa_texto": ordem_dia.materia.ementa, + #"observacao_materia": ordem_dia.materia.observacao, + # "tipo_votacao": ordem_dia.tipo_votacao, + # "numero_votos_sim": votacao.numero_votos_sim, + # "numero_votos_nao": votacao.numero_votos_nao, + # "numero_abstencoes": votacao.numero_abstencoes, + # "total_votos": total_votos, + # "presentes": presentes, + # "tipo_resultado": tipo_resultado, "presentes_ordem_dia": presentes_ordem_dia, + "num_presentes_ordem_dia": num_presentes_ordem_dia, "presentes_sessao_plenaria": presentes_sessao_plenaria, + "num_presentes_sessao_plenaria": num_presentes_sessao_plen, } + + return JsonResponse(votacao_json) diff --git a/sessao/models.py b/sessao/models.py index 5f6dd904f..0c7905cba 100644 --- a/sessao/models.py +++ b/sessao/models.py @@ -107,6 +107,9 @@ class AbstractOrdemDia(models.Model): resultado = models.TextField(blank=True, null=True) tipo_votacao = models.PositiveIntegerField( verbose_name=_('Tipo de votação'), choices=TIPO_VOTACAO_CHOICES) + votacao_aberta = models.NullBooleanField(blank=True, + choices=YES_NO_CHOICES, + verbose_name=_('Votação iniciada?')) class Meta: abstract = True diff --git a/sessao/views.py b/sessao/views.py index 7dc257882..721017463 100644 --- a/sessao/views.py +++ b/sessao/views.py @@ -226,14 +226,8 @@ class ListMateriaOrdemDiaView(sessao_crud.CrudDetailView): numero = o.numero_ordem autoria = Autoria.objects.filter(materia_id=o.materia_id) - if len(autoria) > 1: - autor = 'Autores: ' - else: - autor = 'Autor: ' - for a in autoria: - autor += str(a.autor) - autor += ' ' + autor = [str(a.autor) for a in autoria] mat = {'pk': pk, 'oid': o.materia_id, @@ -243,6 +237,7 @@ class ListMateriaOrdemDiaView(sessao_crud.CrudDetailView): 'numero': numero, 'resultado': o.resultado, 'autor': autor, + 'votacao_aberta': o.votacao_aberta, 'tipo_votacao': o.tipo_votacao } materias_ordem.append(mat) @@ -255,6 +250,7 @@ class ListMateriaOrdemDiaView(sessao_crud.CrudDetailView): def post(self, request, *args, **kwargs): self.object = self.get_object() + context = self.get_context_data(object=self.object) pk = self.kwargs['pk'] # TODO: Existe uma forma de atualizar em lote de acordo @@ -262,13 +258,23 @@ class ListMateriaOrdemDiaView(sessao_crud.CrudDetailView): # OrdemDia.objects.filter(sessao_plenaria_id=pk) # .order_by('numero_ordem').update(numero_ordem=3) - ordens = OrdemDia.objects.filter(sessao_plenaria_id=pk) - ordem_num = 1 - for o in ordens: - o.numero_ordem = ordem_num - o.save() - ordem_num += 1 - + if 'materia_reorder' in request.POST: + ordens = OrdemDia.objects.filter(sessao_plenaria_id=pk) + ordem_num = 1 + for o in ordens: + o.numero_ordem = ordem_num + o.save() + ordem_num += 1 + elif 'abrir-votacao' in request.POST: + existe_votacao_aberta = OrdemDia.objects.filter(sessao_plenaria_id=pk, votacao_aberta=True).exists() + if existe_votacao_aberta: + context.update( + {'error_message': "Não foi possível salvar formulário!"}) + else: + ordem_id = request.POST['ordem_id'] + ordem = OrdemDia.objects.get(id=ordem_id) + ordem.votacao_aberta = True + ordem.save() return self.get(self, request, args, kwargs) @@ -945,13 +951,13 @@ class ResumoView(FormMixin, sessao_crud.CrudDetailView): ]}) # ===================================================================== # Conteúdo Multimídia - if(self.object.url_audio): + if vself.object.url_audio: context.update({'multimidia_audio': 'Audio: ' + str(self.object.url_audio)}) else: context.update({'multimidia_audio': 'Audio: Indisponivel'}) - if(self.object.url_video): + if self.object.url_video: context.update({'multimidia_video': 'Video: ' + str(self.object.url_video)}) else: @@ -1363,6 +1369,7 @@ class VotacaoEditView(FormMixin, sessao_crud.CrudDetailView): ordem = OrdemDia.objects.get( sessao_plenaria_id=self.object.id, materia_id=materia_id) + ordem.votacao_aberta = False ordem.resultado = None ordem.save() @@ -1507,6 +1514,7 @@ class VotacaoView(FormMixin, sessao_crud.CrudDetailView): resultado = TipoResultadoVotacao.objects.get( id=request.POST['resultado_votacao']) ordem.resultado = resultado.nome + ordem.votacao_aberta = False ordem.save() return self.form_valid(form) @@ -1614,6 +1622,7 @@ class VotacaoNominalView(FormMixin, sessao_crud.CrudDetailView): resultado = TipoResultadoVotacao.objects.get( id=request.POST['resultado_votacao']) ordem.resultado = resultado.nome + ordem.votacao_aberta = False ordem.save() return self.form_valid(form) @@ -1694,6 +1703,7 @@ class VotacaoNominalEditView(FormMixin, sessao_crud.CrudDetailView): sessao_plenaria_id=self.object.id, materia_id=materia_id) ordem.resultado = None + ordem.votacao_aberta = False ordem.save() try: diff --git a/templates/painel/mensagem.html b/templates/painel/mensagem.html index 4d2ec9cbc..607c30fe4 100644 --- a/templates/painel/mensagem.html +++ b/templates/painel/mensagem.html @@ -94,7 +94,7 @@

{{ context.title }}

- +

Ajax refresh counter:



diff --git a/templates/painel/parlamentares.html b/templates/painel/parlamentares.html index a182c40aa..cbedf8b7e 100644 --- a/templates/painel/parlamentares.html +++ b/templates/painel/parlamentares.html @@ -94,7 +94,7 @@

{{ context.title }}

- +





diff --git a/templates/painel/votacao.html b/templates/painel/votacao.html index edb560615..fa235b8a2 100644 --- a/templates/painel/votacao.html +++ b/templates/painel/votacao.html @@ -94,7 +94,7 @@

{{ context.title }}

- +





diff --git a/templates/sessao/materia_ordemdia_list.html b/templates/sessao/materia_ordemdia_list.html index e23932d8c..4f6c1a274 100644 --- a/templates/sessao/materia_ordemdia_list.html +++ b/templates/sessao/materia_ordemdia_list.html @@ -16,7 +16,7 @@ Matérias da Ordem do Dia {{m.numero}} - {{m.titulo}}  
- {{m.autor}} + Autor{{m.autor|length|pluralize:"es"}}: {{m.autor|join:', '}}
  • {{m.ementa|safe}}
  • @@ -30,13 +30,21 @@ Matérias da Ordem do Dia {% endif %} {% else %} Matéria não votada
    - {% if m.tipo_votacao == 1 %} - Registrar Votação - {% elif m.tipo_votacao == 2 %} - Registrar Votação - {% elif m.tipo_votacao == 3%} - Registrar Votação - {% endif %} + {% if m.votacao_aberta %} + {% if m.tipo_votacao == 1 %} + Registrar Votação + {% elif m.tipo_votacao == 2 %} + Registrar Votação + {% elif m.tipo_votacao == 3%} + Registrar Votação + {% endif %} + {% else %} +
    + {% csrf_token %} + + +
    + {% endif %} {% endif %}
  • {% endfor %}