Browse Source

Refatora a Mesa de Sessão Plenária (#1138)

pull/1076/merge
Eduardo Calil 8 years ago
committed by Edward
parent
commit
84af4d2949
  1. 19
      sapl/sessao/urls.py
  2. 203
      sapl/sessao/views.py
  3. 265
      sapl/templates/sessao/mesa.html

19
sapl/sessao/urls.py

@ -1,8 +1,8 @@
from django.conf.urls import include, url from django.conf.urls import include, url
from sapl.sessao.views import (AdicionarVariasMateriasExpediente, from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
AdicionarVariasMateriasOrdemDia, BancadaCrud, AdicionarVariasMateriasOrdemDia,
BlocoCrud, CargoBancadaCrud, BancadaCrud, BlocoCrud, CargoBancadaCrud,
ExpedienteMateriaCrud, ExpedienteView, ExpedienteMateriaCrud, ExpedienteView,
MateriaOrdemDiaCrud, MesaView, OradorCrud, MateriaOrdemDiaCrud, MesaView, OradorCrud,
OradorExpedienteCrud, PainelView, OradorExpedienteCrud, PainelView,
@ -22,8 +22,11 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
VotacaoNominalView, VotacaoView, VotacaoNominalView, VotacaoView,
abrir_votacao_expediente_view, abrir_votacao_expediente_view,
abrir_votacao_ordem_view, abrir_votacao_ordem_view,
atualizar_mesa,
insere_parlamentar_composicao,
mudar_ordem_materia_sessao, recuperar_materia, mudar_ordem_materia_sessao, recuperar_materia,
recuperar_numero_sessao, recuperar_numero_sessao,
remove_parlamentar_composicao,
reordernar_materias_expediente, reordernar_materias_expediente,
reordernar_materias_ordem, reordernar_materias_ordem,
sessao_legislativa_legislatura_ajax) sessao_legislativa_legislatura_ajax)
@ -41,6 +44,18 @@ urlpatterns = [
url(r'^sessao/(?P<pk>\d+)/mesa$', MesaView.as_view(), name='mesa'), url(r'^sessao/(?P<pk>\d+)/mesa$', MesaView.as_view(), name='mesa'),
url(r'^sessao/mesa/atualizar-mesa/$',
atualizar_mesa,
name='atualizar_mesa'),
url(r'^sessao/mesa/insere-parlamentar/composicao/$',
insere_parlamentar_composicao,
name='insere_parlamentar_composicao'),
url(r'^sessao/mesa/remove-parlamentar-composicao/$',
remove_parlamentar_composicao,
name='remove_parlamentar_composicao'),
url(r'^sessao/recuperar-materia/', recuperar_materia), url(r'^sessao/recuperar-materia/', recuperar_materia),
url(r'^sessao/recuperar-numero-sessao/', recuperar_numero_sessao), url(r'^sessao/recuperar-numero-sessao/', recuperar_numero_sessao),
url(r'^sessao/sessao-legislativa-legislatura-ajax/', url(r'^sessao/sessao-legislativa-legislatura-ajax/',

203
sapl/sessao/views.py

@ -836,24 +836,40 @@ class MesaView(FormMixin, DetailView):
model = SessaoPlenaria model = SessaoPlenaria
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.object = self.get_object() self.object = self.get_object()
context = self.get_context_data(object=self.object) context = self.get_context_data(object=self.object)
mesa = IntegranteMesa.objects.filter( try:
sessao_plenaria=self.object) sessao = SessaoPlenaria.objects.get(
id=kwargs['pk'])
except ObjectDoesNotExist:
mensagem = _('Esta Sessão Plenária não existe!')
messages.add_message(request, messages.INFO, mensagem)
integrantes = [] return self.render_to_response(context)
for m in mesa:
parlamentar = Parlamentar.objects.get( mesa = sessao.integrantemesa_set.all() if sessao else []
id=m.parlamentar_id)
cargo = CargoMesa.objects.get( cargos_ocupados = [m.cargo for m in mesa]
id=m.cargo_id) cargos = CargoMesa.objects.all()
integrante = {'parlamentar': parlamentar, 'cargo': cargo} cargos_vagos = list(set(cargos) - set(cargos_ocupados))
integrantes.append(integrante)
parlamentares = Legislatura.objects.first().mandato_set.all()
parlamentares_ocupados = [m.parlamentar for m in mesa]
parlamentares_vagos = list(
set(
[p.parlamentar for p in parlamentares]) - set(
parlamentares_ocupados))
# Se todos os cargos estiverem ocupados, a listagem de parlamentares
# deve ser renderizada vazia
if not cargos_vagos:
parlamentares_vagos = []
context.update( context.update(
{'integrantes': ordenar_integrantes_por_cargo(integrantes)}) {'composicao_mesa': mesa,
'parlamentares': parlamentares_vagos,
'cargos_vagos': cargos_vagos})
return self.render_to_response(context) return self.render_to_response(context)
@ -863,73 +879,124 @@ class MesaView(FormMixin, DetailView):
_('Mesa Diretora'), self.object) _('Mesa Diretora'), self.object)
return context return context
@method_decorator(permission_required('sessao.change_integrantemesa')) def get_success_url(self):
def post(self, request, *args, **kwargs): pk = self.kwargs['pk']
self.object = self.get_object() return reverse('sapl.sessao:mesa', kwargs={'pk': pk})
form = MesaForm(request.POST)
if 'Incluir' in request.POST:
if form.is_valid():
integrante = IntegranteMesa()
integrante.sessao_plenaria_id = self.object.id
integrante.parlamentar_id = request.POST['parlamentar']
integrante.cargo_id = request.POST['cargo']
integrante.save()
return self.form_valid(form)
else: def atualizar_mesa(request):
form.clean() """
return self.form_valid(form) Esta função lida com qualquer alteração nos campos
elif 'Excluir' in request.POST: da Mesa Diretora, atualizando os campos após cada alteração
if 'composicao_mesa' in request.POST: """
ids = request.POST['composicao_mesa'].split(':') try:
IntegranteMesa.objects.get( sessao = SessaoPlenaria.objects.get(
sessao_plenaria_id=self.object.id, id=int(request.GET['sessao']))
parlamentar_id=ids[0], except ObjectDoesNotExist:
cargo_id=ids[1] return JsonResponse({'msg': ('Sessão Inexistente!', 0)})
).delete()
else: # Atualiza os componentes da view após a mudança
pass composicao_mesa = IntegranteMesa.objects.filter(
# TODO display message asking to select a member of list sessao_plenaria=sessao.id)
cargos_ocupados = [m.cargo for m in composicao_mesa]
cargos = CargoMesa.objects.all()
cargos_vagos = list(set(cargos) - set(cargos_ocupados))
parlamentares = Legislatura.objects.get(
id=sessao.legislatura.id).mandato_set.all()
parlamentares_ocupados = [m.parlamentar for m in composicao_mesa]
parlamentares_vagos = list(
set(
[p.parlamentar for p in parlamentares]) - set(
parlamentares_ocupados))
lista_composicao = [(c.id, c.parlamentar.__str__(),
c.cargo.__str__()) for c in composicao_mesa]
lista_parlamentares = [(
p.id, p.__str__()) for p in parlamentares_vagos]
lista_cargos = [(c.id, c.__str__()) for c in cargos_vagos]
return JsonResponse(
{'lista_composicao': lista_composicao,
'lista_parlamentares': lista_parlamentares,
'lista_cargos': lista_cargos,
'msg': ('', 1)})
def insere_parlamentar_composicao(request):
"""
Esta função lida com qualquer operação de inserção
na composição da Mesa Diretora
"""
if request.user.has_perm(
'%s.add_%s' % (
AppConfig.label, IntegranteMesa._meta.model_name)):
composicao = IntegranteMesa()
return self.form_valid(form) try:
composicao.sessao_plenaria = SessaoPlenaria.objects.get(
id=int(request.POST['sessao']))
except MultiValueDictKeyError:
return JsonResponse({'msg': ('A Sessão informada não existe!', 0)})
def get_candidatos_mesa(self): try:
self.object = self.get_object() composicao.parlamentar = Parlamentar.objects.get(
lista_parlamentares = [] id=int(request.POST['parlamentar']))
lista_integrantes = [] except MultiValueDictKeyError:
return JsonResponse({
'msg': ('Nenhum parlamentar foi inserido!', 0)})
for parlamentar in Parlamentar.objects.all(): try:
if parlamentar.ativo: composicao.cargo = CargoMesa.objects.get(
lista_parlamentares.append(parlamentar) id=int(request.POST['cargo']))
parlamentar_ja_inserido = IntegranteMesa.objects.filter(
sessao_plenaria_id=composicao.sessao_plenaria.id,
cargo_id=composicao.cargo.id).exists()
for integrante in IntegranteMesa.objects.filter( if parlamentar_ja_inserido:
sessao_plenaria=self.object): return JsonResponse({'msg': ('Parlamentar já inserido!', 0)})
parlamentar = Parlamentar.objects.get(
id=integrante.parlamentar_id)
lista_integrantes.append(parlamentar)
lista = list(set(lista_parlamentares) - set(lista_integrantes)) composicao.save()
lista.sort(key=lambda x: x.nome_parlamentar)
return lista
def get_cargos_mesa(self): except MultiValueDictKeyError:
self.object = self.get_object() return JsonResponse({'msg': ('Nenhum cargo foi inserido!', 0)})
lista_cargos = CargoMesa.objects.all()
lista_cargos_ocupados = []
for integrante in IntegranteMesa.objects.filter( return JsonResponse({'msg': ('Parlamentar inserido com sucesso!', 1)})
sessao_plenaria=self.object):
cargo = CargoMesa.objects.get(
id=integrante.cargo_id)
lista_cargos_ocupados.append(cargo)
lista = list(set(lista_cargos) - set(lista_cargos_ocupados)) else:
return lista return JsonResponse(
{'msg': ('Você não tem permissão para esta operação!', 0)})
def get_success_url(self):
pk = self.kwargs['pk'] def remove_parlamentar_composicao(request):
return reverse('sapl.sessao:mesa', kwargs={'pk': pk}) """
Essa função lida com qualquer operação de remoção
na composição da Mesa Diretora
"""
if request.POST and request.user.has_perm(
'%s.delete_%s' % (
AppConfig.label, IntegranteMesa._meta.model_name)):
if 'composicao_mesa' in request.POST:
try:
composicao = IntegranteMesa.objects.get(
id=int(request.POST['composicao_mesa']))
except ObjectDoesNotExist:
return JsonResponse(
{'msg': (
'Composição da Mesa não pôde ser removida!', 0)})
composicao.delete()
return JsonResponse(
{'msg': (
'Parlamentar excluido com sucesso!', 1)})
else:
return JsonResponse(
{'msg': (
'Selecione algum parlamentar para ser excluido!', 0)})
class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): class ResumoOrdenacaoView(PermissionRequiredMixin, FormView):

265
sapl/templates/sessao/mesa.html

@ -2,63 +2,248 @@
{% load i18n %} {% load i18n %}
{% block detail_content %} {% block detail_content %}
<fieldset class="form-group">
<legend>Mesa Diretora da Sessão</legend> <!-- Success and errors messages div -->
<form method="POST"> <div class="alert alert-danger alert-dismissible fade in" id="div-error" role="alert" style="display: none">
{% csrf_token %} <button type="button" class="close" data-dismiss="alert" aria-label="Close">
<br /> <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
<div class="row"> </button>
<b><span id="error-message"></span></b>
</div>
<div class="alert alert-success alert-dismissible fade in" id="div-success" style="display: none" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
<b><span id="success-message"></span></b>
</div>
<!-- Success and errors messages div end -->
<fieldset class="form-group">
<legend>Escolha da Composição da Mesa Diretora da Sessão Plenária</legend>
<div class="row">
<div class="col-md-4"> <div class="col-md-4">
<label>Composição</label> <label>Composição da Mesa Diretora</label>
<select multiple size="5" name="composicao_mesa" id="composicao_mesa" class="form-control"> <select multiple size="5" class="form-control" id="id_composicao_mesa" name="composicao_mesa">
{% for i in integrantes %} {% for p in composicao_mesa %}
<option value="{{i.parlamentar.id}}:{{i.cargo.id}}"> <option value="{{p.id}}">
{{i.parlamentar.nome_parlamentar}} || {{i.cargo.descricao}} {{p.parlamentar}} || {{p.cargo}}
</option> </option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
<div class="col-md-4" align="center"> <div class="col-md-4" align="center">
{% if perms.sessao %}
<br /><br /> <br /><br />
{% if view.get_cargos_mesa %}<input type="submit" name="Incluir" Value="Incluir" class="btn btn-primary" />{% endif %} {% if perms.parlamentares.add_cargomesa %}
<br /><br /> <input type="submit" style="display: none" name="Incluir" id="id_incluir" Value="Incluir" class="btn btn-primary" />
<input type="submit" name="Excluir" Value="Excluir" class="btn btn-danger" onclick="verificar()"/> {% endif %}
<br />
<br />
{% if perms.parlamentares.add_composicaomesa %}
<input type="submit" style="display: none" name="Excluir" id="id_excluir" Value="Excluir" class="btn btn-danger" />
{% endif %} {% endif %}
</div> </div>
{% if view.get_cargos_mesa %}
<div class="col-md-4"> <div class="col-md-4">
<label>Parlamentare | Cargo</label> <label id='parlamentar-cargo-title' style="display: none">Parlamentar | Cargo</label>
<select name="parlamentar" id="parlamentar" class="form-control"> <select class="form-control" name="parlamentar" id="id_parlamentar" style="display: none">
{% for parlamentar in view.get_candidatos_mesa %} {% for p in parlamentares %}
<option value="{{parlamentar.id}}" name="parlamentar" id="parlamentar">{{parlamentar.nome_parlamentar}}</option> <option value="{{p.id}}">{{p.nome_completo}}</option>
{% endfor %} {% endfor %}
</select> </select>
<br /> <br />
<select name="cargo" id="cargo" class="form-control"> <select class="form-control" name="cargo" id="id_cargo" style="display: none">
{% for cargo in view.get_cargos_mesa %} {% for c in cargos_vagos %}
<option value="{{cargo.id}}" name="cargo" id="cargo">{{cargo.descricao}}</option> <option value="{{c.id}}">{{c}}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
{% endif %}
</div> </div>
</form> </fieldset>
</fieldset>
{% endblock detail_content %} {% endblock detail_content %}
{% block extra_js %} {% block extra_js %}
<script language="Javascript">
function verificar(){ <script language="Javascript">
x = document.getElementById("composicao_mesa");
flag = true; //##############################################################
for (i = 0; i < x.options.length; i++){ // Inicialização da View #
if (x.options[i].selected == true) //##############################################################
flag = false;
} // Se a composicao estiver completa, deve-se esconder o botão e os
if(flag) // campos de inserção
alert('Nenhum parlamentar foi selecionado!'); $(document).ready(function(){
} if($("#id_parlamentar").val() == null || $("#id_cargo").val() == null){
</script> $("#id_parlamentar").hide();
{% endblock extra_js %} $("#id_cargo").hide();
$("#parlamentar-cargo-title").hide();
$('#id_incluir').hide();
}
else{
$("#id_parlamentar").show();
$("#id_cargo").show();
$("#parlamentar-cargo-title").show();
$('#id_incluir').show();
}
// Se a composição estiver vazia, deve-se esconder
// de Excluir
if (!$("#id_composicao_mesa option").val()){
$("#id_excluir").hide()
}
else{
$("#id_excluir").show()
}
});
//##############################################################
//# EVENT HANDLERS #
//##############################################################
function errors_handler(msg){
if (msg == null){
$("#div-success").hide()
$("#div-error").hide()
$("#success-message").html('')
$("#error-message").html('')
}
else{
if (msg[1] == 0){
$("#div-error").show()
$("#error-message").html(msg[0])
}
else{
$("#div-success").show()
$("#success-message").html(msg[0])
}
}
}
// Atualiza os campos após alguma operação Inserção/Remoção
function atualizar_mesa(msg=null){
// Pega o novo valor dos campos modificados
var sessao_value = {{sessaoplenaria.id|safe}}
// Limpa os campos que serão atualizados
$("#id_composicao_mesa option").remove();
$("#id_parlamentar option").remove();
$("#id_cargo option").remove();
$.get("{% url 'sapl.sessao:atualizar_mesa' %}",
{sessao: sessao_value},
function(data) {
// Caso não venha nenhum dado da requisição, retorna null
if ($.isEmptyObject(data)){
return null
}
lista_composicao = data['lista_composicao'];
lista_parlamentares = data['lista_parlamentares'];
lista_cargos = data['lista_cargos'];
for (i = 0; i < lista_composicao.length; i++) {
$('#id_composicao_mesa').append('<option value="' + lista_composicao[i][0] + '">' + lista_composicao[i][1] + ' || ' + lista_composicao[i][2] + '</option>');
}
// Caso ainda tenha parlamentares/cargos a serem inseridos, preenche a listagem com
// os disponíveis e garante que as ferramentas de inserção estejam disponíveis
if (lista_parlamentares.length != 0 && lista_cargos.length != 0){
$('#id_incluir').show()
$('#id_cargo').show();
$('#id_parlamentar').show();
$("#parlamentar-cargo-title").show();
for (i = 0; i < lista_parlamentares.length; i++) {
$('#id_parlamentar').append('<option value="' + lista_parlamentares[i][0] + '">' + lista_parlamentares[i][1] + '</option>');
}
for (i = 0; i < lista_cargos.length; i++) {
$('#id_cargo').append('<option value="' + lista_cargos[i][0] + '">' + lista_cargos[i][1] + '</option>');
}
}
// Caso contrário, esconde do usuário essas opções
else{
$('#id_incluir').hide();
$('#id_cargo').hide();
$('#id_parlamentar').hide();
$("#parlamentar-cargo-title").hide();
}
// Garante que o botão de remoção aparecerá, caso tenha
// algum parlamentar na composição
if (lista_composicao.length != 0){
$("#id_excluir").show()
}
else{
$("#id_excluir").hide()
}
// Caso haja algum erro que venha após a alteração da legislatura/sessao
// Essa mensagem de erro é prioridade
if (data['msg'][1] == 0){
msg = data['msg']
}
errors_handler(msg)
});
}
//#############################################################
//# EVENTS CATCH #
//#############################################################
$('#id_incluir').click(function(){
var sessao_value = {{sessaoplenaria.id|safe}}
$.ajax({
data: {sessao: sessao_value,
parlamentar: $("#id_parlamentar").val(),
cargo: $("#id_cargo").val()},
type: 'POST',
url: "{% url 'sapl.sessao:insere_parlamentar_composicao' %}",
headers: {
'X-CSRFToken': getCookie('csrftoken')
},
success: function(data){
var msg = data['msg'];
setTimeout(function(data){
// Atualiza os campos após a inserção
atualizar_mesa(msg)
}, 500)
},
});
})
$('#id_excluir').click(function(){
// Pega o id do parlamentar que foi selecionado
selecionado = $("#id_composicao_mesa option:selected").val()
if (selecionado){
$.ajax({
data: {composicao_mesa: selecionado},
type: 'POST',
url: "{% url 'sapl.sessao:remove_parlamentar_composicao' %}",
headers: {
'X-CSRFToken': getCookie('csrftoken')
},
success: function(data){
var msg = data['msg'];
legislatura = $("#id_legislatura").val();
sessao = $("#id_sessao_legislativa").val();
setTimeout(function(data){
// Atualiza os campos após a remoção
atualizar_mesa(msg);
}, 500)
},
});
}
});
</script>
{% endblock %}

Loading…
Cancel
Save