Browse Source

Add open/close Votacao

pull/7/head
Edward Ribeiro 9 years ago
parent
commit
e315e91c2c
  1. 4
      painel/urls.py
  2. 100
      painel/views.py
  3. 3
      sessao/models.py
  4. 30
      sessao/views.py
  5. 2
      templates/painel/mensagem.html
  6. 2
      templates/painel/parlamentares.html
  7. 2
      templates/painel/votacao.html
  8. 10
      templates/sessao/materia_ordemdia_list.html

4
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<pk>\d+)/painel$', painel_view, name="painel_principal"),
url(r'^painel/(?P<pk>\d+)/json_votacao$', json_votacao, name='json_votacao'),
url(r'^painel/(?P<pk>\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'),

100
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
# FIXME: id fixo para testes
presenca_ordem_dia = PresencaOrdemDia.objects.filter(
sessao_plenaria_id=6)
# 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)
# 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)

3
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

30
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)
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:

2
templates/painel/mensagem.html

@ -94,7 +94,7 @@
</head>
<body>
<h1>{{ context.title }}</h1>
<input id="json_url" type="hidden" value="{% url 'json_votacao' %}">
<input id="json_url" type="hidden" value="{% url 'dados_painel' %}">
<h2>Ajax refresh counter: <span id="counter"></span></h2>
<h3>
<span id="sessao_plenaria"></span><br/><br/>

2
templates/painel/parlamentares.html

@ -94,7 +94,7 @@
</head>
<body>
<h1>{{ context.title }}</h1>
<input id="json_url" type="hidden" value="{% url 'json_votacao' %}">
<input id="json_url" type="hidden" value="{% url 'dados_painel' %}">
<h3>
<span id="sessao_plenaria"></span><br/><br/>
<span id="sessao_plenaria_data"></span><br/><br/>

2
templates/painel/votacao.html

@ -94,7 +94,7 @@
</head>
<body>
<h1>{{ context.title }}</h1>
<input id="json_url" type="hidden" value="{% url 'json_votacao' %}">
<input id="json_url" type="hidden" value="{% url 'dados_painel' %}">
<h3>
<span id="sessao_plenaria"></span><br/><br/>
<span id="sessao_plenaria_data"></span><br/><br/>

10
templates/sessao/materia_ordemdia_list.html

@ -16,7 +16,7 @@ Matérias da Ordem do Dia
{{m.numero}} - <a href="{% url 'sessaoplenaria:materiaordemdia_edit' m.pk m.oid %}">{{m.titulo}}</a>
&nbsp;
</br>
{{m.autor}}
<strong>Autor{{m.autor|length|pluralize:"es"}}</strong>: {{m.autor|join:', '}}
</li>
<li>{{m.ementa|safe}}</li>
<li>
@ -30,6 +30,7 @@ Matérias da Ordem do Dia
{% endif %}
{% else %}
Matéria não votada <br />
{% if m.votacao_aberta %}
{% if m.tipo_votacao == 1 %}
<b><a href="{% url 'sessaoplenaria:votacaosimbolica' m.pk m.oid m.ordem_id %}">Registrar Votação</a></b>
{% elif m.tipo_votacao == 2 %}
@ -37,6 +38,13 @@ Matérias da Ordem do Dia
{% elif m.tipo_votacao == 3%}
<b><a href="{% url 'sessaoplenaria:votacaosecreta' m.pk m.oid m.ordem_id %}">Registrar Votação</a></b>
{% endif %}
{% else %}
<form method="POST" action="{% url 'sessaoplenaria:materiaordemdia_list' object.pk %}">
{% csrf_token %}
<input type="hidden" id="ordem_id" name="ordem_id" value="{{ m.ordem_id }}">
<input type="submit" id="abrir-votacao" name="abrir-votacao" value="Abrir Votação" class="button primary">
</form>
{% endif %}
{% endif %}
</li>
{% endfor %}

Loading…
Cancel
Save