Browse Source

Colocando data em html de cargo mesa

Validando datas

Melhorando js do cadastro da mesa diretora

Adicionando data de inicio e fim e  migrações

Adicionando cadastro da data

Adicionando validação de data

Fix #525

:Arrumando migrações

Mudando visual e adaptando codigo. Fix #2912
pull/2912/head
ulyssesBML 7 years ago
parent
commit
1523ee3be9
  1. 40
      sapl/parlamentares/migrations/0036_auto_20191003_1550.py
  2. 4
      sapl/parlamentares/models.py
  3. 85
      sapl/parlamentares/views.py
  4. 151
      sapl/templates/parlamentares/composicaomesa_form.html
  5. 2
      sapl/templates/parlamentares/public_composicaomesa_form.html

40
sapl/parlamentares/migrations/0036_auto_20191003_1550.py

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-07-22 14:22
from __future__ import unicode_literals
from django.db import migrations, models
def aloca_datas(apps, schema_editor):
ComposicaoMesa = apps.get_model("parlamentares", "ComposicaoMesa")
db_alias = schema_editor.connection.alias
composicao_mesa = ComposicaoMesa.objects.all()
for c in composicao_mesa:
c.data_inicio = c.sessao_legislativa.data_inicio
c.data_fim = c.sessao_legislativa.data_fim
c.save()
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0035_merge_20190802_0954'),
]
operations = [
migrations.AddField(
model_name='composicaomesa',
name='data_fim',
field=models.DateField(blank=True, null=True, verbose_name='Data Fim'),
),
migrations.AddField(
model_name='composicaomesa',
name='data_inicio',
field=models.DateField(blank=True, null=True, verbose_name='Data Início'),
),
migrations.RunPython(aloca_datas),
migrations.AlterField(
model_name='composicaomesa',
name='data_inicio',
field=models.DateField(verbose_name='Data Início'),
),
]

4
sapl/parlamentares/models.py

@ -556,6 +556,10 @@ class ComposicaoMesa(models.Model):
on_delete=models.PROTECT) on_delete=models.PROTECT)
cargo = models.ForeignKey(CargoMesa, on_delete=models.PROTECT) cargo = models.ForeignKey(CargoMesa, on_delete=models.PROTECT)
data_inicio = models.DateField(verbose_name=_('Data Início'))
data_fim = models.DateField(
blank=True, null=True, verbose_name=_('Data Fim'))
class Meta: class Meta:
verbose_name = _('Ocupação de cargo na Mesa') verbose_name = _('Ocupação de cargo na Mesa')
verbose_name_plural = _('Ocupações de cargo na Mesa') verbose_name_plural = _('Ocupações de cargo na Mesa')

85
sapl/parlamentares/views.py

@ -31,7 +31,7 @@ from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux,
MasterDetailCrud, make_pagination) MasterDetailCrud, make_pagination)
from sapl.materia.models import Autoria, Proposicao, Relatoria from sapl.materia.models import Autoria, Proposicao, Relatoria
from sapl.parlamentares.apps import AppConfig from sapl.parlamentares.apps import AppConfig
from sapl.utils import (parlamentares_ativos, show_results_filter_set) from sapl.utils import intervalos_tem_intersecao, parlamentares_ativos, show_results_filter_set
from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm, from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm,
@ -849,21 +849,12 @@ class MesaDiretoraView(FormView):
mesa = sessao_atual.composicaomesa_set.all().order_by( mesa = sessao_atual.composicaomesa_set.all().order_by(
'cargo_id') if sessao_atual else [] 'cargo_id') if sessao_atual else []
cargos_ocupados = [m.cargo for m in mesa] cargos_vagos = CargoMesa.objects.all()
cargos = CargoMesa.objects.all()
cargos_vagos = list(set(cargos) - set(cargos_ocupados)) parlamentares = [m.parlamentar for m in legislatura.mandato_set.all()]
parlamentares.sort(key=lambda x: x.nome_parlamentar)
parlamentares = legislatura.mandato_set.all()
parlamentares_ocupados = [m.parlamentar for m in mesa]
parlamentares_vagos = list(
set(
[p.parlamentar for p in parlamentares if p.parlamentar.ativo]) - set(
parlamentares_ocupados))
parlamentares_vagos.sort(key=lambda x: x.nome_parlamentar)
# Se todos os cargos estiverem ocupados, a listagem de parlamentares # Se todos os cargos estiverem ocupados, a listagem de parlamentares
# deve ser renderizada vazia # deve ser renderizada vazia
if not cargos_vagos:
parlamentares_vagos = []
return self.render_to_response( return self.render_to_response(
{'legislaturas': Legislatura.objects.all( {'legislaturas': Legislatura.objects.all(
@ -872,7 +863,7 @@ class MesaDiretoraView(FormView):
'sessoes': sessoes, 'sessoes': sessoes,
'sessao_selecionada': sessao_atual, 'sessao_selecionada': sessao_atual,
'composicao_mesa': mesa, 'composicao_mesa': mesa,
'parlamentares': parlamentares_vagos, 'parlamentares': parlamentares,
'cargos_vagos': cargos_vagos 'cargos_vagos': cargos_vagos
}) })
@ -915,25 +906,16 @@ def altera_field_mesa(request):
composicao_mesa = ComposicaoMesa.objects.filter( composicao_mesa = ComposicaoMesa.objects.filter(
sessao_legislativa=sessao_selecionada).order_by('cargo_id') sessao_legislativa=sessao_selecionada).order_by('cargo_id')
cargos_ocupados = [m.cargo for m in composicao_mesa]
cargos = CargoMesa.objects.all() cargos = CargoMesa.objects.all()
cargos_vagos = list(set(cargos) - set(cargos_ocupados))
parlamentares = Legislatura.objects.get(
id=legislatura).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))
parlamentares_vagos.sort(key=lambda x: x.nome_parlamentar) parlamentares = [p.parlamentar for p in Legislatura.objects.get(id=legislatura).mandato_set.all()]
lista_sessoes = [(s.id, s.__str__()) for s in sessoes] parlamentares.sort(key=lambda x: x.nome_parlamentar)
lista_sessoes = [(s.id, s.__str__(),s.data_inicio.year) for s in sessoes]
lista_composicao = [(c.id, c.parlamentar.__str__(), lista_composicao = [(c.id, c.parlamentar.__str__(),
c.cargo.__str__()) for c in composicao_mesa] c.cargo.__str__(), c.data_inicio.strftime('%d/%m/%Y'), c.data_fim.strftime('%d/%m/%Y')) for c in composicao_mesa]
lista_parlamentares = [( lista_parlamentares = [(
p.id, p.__str__()) for p in parlamentares_vagos] p.id, p.__str__()) for p in parlamentares]
lista_cargos = [(c.id, c.__str__()) for c in cargos_vagos] lista_cargos = [(c.id, c.__str__()) for c in cargos]
return JsonResponse( return JsonResponse(
{'lista_sessoes': lista_sessoes, {'lista_sessoes': lista_sessoes,
@ -951,6 +933,7 @@ def insere_parlamentar_composicao(request):
""" """
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
username = request.user.username username = request.user.username
msg = ""
if request.user.has_perm( if request.user.has_perm(
'%s.add_%s' % ( '%s.add_%s' % (
AppConfig.label, ComposicaoMesa._meta.model_name)): AppConfig.label, ComposicaoMesa._meta.model_name)):
@ -983,22 +966,52 @@ def insere_parlamentar_composicao(request):
". Tentando obter CargoMesa com id={}.".format(request.POST['cargo'])) ". Tentando obter CargoMesa com id={}.".format(request.POST['cargo']))
composicao.cargo = CargoMesa.objects.get( composicao.cargo = CargoMesa.objects.get(
id=int(request.POST['cargo'])) id=int(request.POST['cargo']))
parlamentar_ja_inserido = ComposicaoMesa.objects.filter(
if composicao.cargo.unico:
parlamentares_nesse_cargo = ComposicaoMesa.objects.filter(
sessao_legislativa_id=composicao.sessao_legislativa.id, sessao_legislativa_id=composicao.sessao_legislativa.id,
cargo_id=composicao.cargo.id).exists() cargo_id=composicao.cargo.id)
aux_data_inicio = datetime.strptime(request.POST['data_inicial'],'%d/%m/%Y')
aux_data_fim = datetime.strptime(request.POST['data_fim'],'%d/%m/%Y')
for cargo_mesa in parlamentares_nesse_cargo:
if intervalos_tem_intersecao(cargo_mesa.data_inicio,
cargo_mesa.data_fim,
aux_data_inicio.date(),
aux_data_fim.date()):
return JsonResponse({'msg': ('Parlamentar já inserido com esse cargo nesse periodo!', 0)})
if parlamentar_ja_inserido:
return JsonResponse({'msg': ('Parlamentar já inserido!', 0)})
if aux_data_inicio.date() < composicao.sessao_legislativa.data_inicio or aux_data_fim.date() > composicao.sessao_legislativa.data_fim:
return JsonResponse({'msg': ('Data fora de período da sessão plenária! O periodo é entre '+
str(composicao.sessao_legislativa.data_inicio.strftime("%d/%m/%Y")) +" até "+
str(composicao.sessao_legislativa.data_fim.strftime("%d/%m/%Y")), 0)})
id_parlamentar = request.POST.get('parlamentar',None)
if id_parlamentar:
composicao_parlamentar = ComposicaoMesa.objects.filter(sessao_legislativa_id=composicao.sessao_legislativa.id,
parlamentar_id=id_parlamentar)
for aux_comp in composicao_parlamentar:
if intervalos_tem_intersecao(aux_comp.data_inicio, aux_comp.data_fim,aux_data_inicio.date(),aux_data_fim.date()):
return JsonResponse({'msg': ('Esse parlamentar já possui cargo nesse período.', 0)})
composicao.data_inicio = aux_data_inicio
composicao.data_fim = aux_data_fim
composicao.save() composicao.save()
msg = {'msg': ('Parlamentar inserido com sucesso!', 1)}
except MultiValueDictKeyError: except MultiValueDictKeyError:
logger.error("user=" + username + logger.error("user=" + username +
". 'MultiValueDictKeyError', nenhum cargo foi inserido!") ". 'MultiValueDictKeyError', nenhum cargo foi inserido!")
return JsonResponse({'msg': ('Nenhum cargo foi inserido!', 0)}) msg = {'msg': ('Nenhum cargo foi inserido!', 0)}
except ValueError:
msg = {'msg': ('Erro ao cadastrar, verifique se suas datas estão no formato correto dd/mm/aaaa.', 0)}
logger.info("user=" + username + ". Parlamentar inserido com sucesso!") logger.info("user=" + username + ". Parlamentar inserido com sucesso!")
return JsonResponse({'msg': ('Parlamentar inserido com sucesso!', 1)}) return JsonResponse(msg)
else: else:
logger.error("user=" + username + logger.error("user=" + username +

151
sapl/templates/parlamentares/composicaomesa_form.html

@ -1,5 +1,6 @@
{% extends "crud/detail.html" %} {% extends "crud/detail.html" %}
{% load i18n %} {% load i18n %}
{% load common_tags %}
{% block actions %} {% endblock %} {% block actions %} {% endblock %}
{% block detail_content %} {% block detail_content %}
@ -51,54 +52,102 @@
</fieldset> </fieldset>
<br /> <br />
<fieldset class="form-group"> <fieldset class="form-group">
<div class="context-actions clearfix">
<div class="actions btn-group float-right" style="margin:10px" role="group">
<button type="button" class="btn btn-outline-primary btn-lg" data-toggle="modal" data-target="#addModal">Adicionar Novo Membro</button>
</div>
</div>
<legend>Escolha da Composição da Mesa Diretora</legend> <legend>Escolha da Composição da Mesa Diretora</legend>
<div class="row"> <table class="table" id="id_composicao_mesa">
<div class="col-md-4"> <thead>
<label>Composição da Mesa Diretora</label> <tr>
<select multiple size="5" class="form-control" id="id_composicao_mesa" name="composicao_mesa"> <th scope="col">Parlamentar</th>
<th scope="col">Cargo</th>
<th scope="col">Data de Inicio</th>
<th scope="col">Data Fim</th>
<th scope="col">Apagar</th>
</tr>
</thead>
<tbody>
{% for p in composicao_mesa %} {% for p in composicao_mesa %}
<option value="{{p.id}}"> <tr>
{{p.parlamentar}} || {{p.cargo}} <td>{{p.parlamentar}}</td>
</option> <td>{{p.cargo}}</td>
<td>{{p.data_inicio|date:"d/m/Y"}}</td>
<td>{{p.data_fim|date:"d/m/Y"}}</td>
<td><button id="{{p.id}}" onclick="apaga_membro_mesa(this)" type="button" class="btn btn-danger">Apagar</button></td>
</tr>
{% endfor %} {% endfor %}
</select> </tbody>
</table>
</div> </div>
<div class="col-md-4" align="center"> </fieldset>
<br /><br /> <!-- Modal -->
{% if perms.parlamentares.add_cargomesa %} <div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-labelledby="addModalLabel" aria-hidden="true">
<input type="submit" style="display: none" name="Incluir" id="id_incluir" Value="Incluir" class="btn btn-primary" /> <div class="modal-dialog" role="document">
{% endif %} <div class="modal-content">
<br /> <div class="modal-header">
<br /> <h5 class="modal-title" id="addModalLabel">Novo Membro Da Mesa</h5>
{% if perms.parlamentares.add_composicaomesa %} <button type="button" class="close" data-dismiss="modal" aria-label="Close">
<input type="submit" style="display: none" name="Excluir" id="id_excluir" Value="Excluir" class="btn btn-danger" /> <span aria-hidden="true">&times;</span>
{% endif %} </button>
</div> </div>
<div class="modal-body">
<div class="col-md-4"> <div id='parlamentar-cargo-title'>
<label id='parlamentar-cargo-title' style="display: none">Parlamentar | Cargo</label> <div>
<p>Parlamentar</p>
<select class="form-control" name="parlamentar" id="id_parlamentar" style="display: none"> <select class="form-control" name="parlamentar" id="id_parlamentar" style="display: none">
{% for p in parlamentares %} {% for p in parlamentares %}
<option value="{{p.id}}">{{p.nome_parlamentar}}</option> <option value="{{p.id}}">{{p.nome_parlamentar}}</option>
{% endfor %} {% endfor %}
</select> </select>
<br /> </div>
<div>
<p>Cargo</p>
<select class="form-control" name="cargo" id="id_cargo" style="display: none"> <select class="form-control" name="cargo" id="id_cargo" style="display: none">
{% for c in cargos_vagos %} {% for c in cargos_vagos %}
<option value="{{c.id}}">{{c}}</option> <option value="{{c.id}}">{{c}}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
<div class="row">
<div class="col-sm-6">
<p>Data Inicio</p>
<input class="form-control" type="text" id="datepicker">
</div>
<div class="col-sm-6">
<p>Data Fim</p>
<input class="form-control" type="text" id="datepicker2">
</div> </div>
</fieldset> </div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
<input type="submit" data-dismiss="modal" style="display: none" name="Incluir" id="id_incluir" Value="Incluir" class="btn btn-primary" />
</div>
</div>
</div>
</div>
{% endif %} {% endif %}
{% endblock detail_content %} {% endblock detail_content %}
{% block extra_js %} {% block extra_js %}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="/resources/demos/style.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script language="Javascript"> <script language="Javascript">
//############################################################## //##############################################################
@ -131,18 +180,40 @@
} }
}); });
$( "#datepicker" ).datepicker();
$( "#datepicker2" ).datepicker();
$( "#datepicker" ).datepicker( "option", "dateFormat", "dd/mm/yy");
$( "#datepicker2" ).datepicker( "option", "dateFormat", "dd/mm/yy");
$( "#datepicker" ).val("01/01/{{sessao_selecionada.data_inicio.year}}");
$( "#datepicker2" ).val("31/12/{{sessao_selecionada.data_inicio.year}}");
validate_date = () => {
s_date = ($("#datepicker").val()).split('/')
s_date2 = ($("#datepicker2").val()).split('/')
dt = new Date(day=s_date[2],month=(s_date[1]-1),year=s_date[0])
dt2 = new Date(day=s_date2[2],month=(s_date2[1]-1),year=s_date2[0])
if (dt > dt2){
alert("Data Inicial deve ser menor que a final.")
}
}
$("#datepicker").change(validate_date)
//############################################################## //##############################################################
//# EVENT HANDLERS # //# EVENT HANDLERS #
//############################################################## //##############################################################
function errors_handler(msg){ function errors_handler(msg){
if (msg == null){
$("#div-success").hide() $("#div-success").hide()
$("#div-error").hide() $("#div-error").hide()
$("#success-message").html('') $("#success-message").html('')
$("#error-message").html('') $("#error-message").html('')
}
else{ if (msg != null){
if (msg[1] == 0){ if (msg[1] == 0){
$("#div-error").show() $("#div-error").show()
$("#error-message").html(msg[0]) $("#error-message").html(msg[0])
@ -164,7 +235,7 @@
// Limpa os campos que serão atualizados // Limpa os campos que serão atualizados
$("#id_sessao_legislativa option").remove(); $("#id_sessao_legislativa option").remove();
$("#id_composicao_mesa option").remove(); $("#id_composicao_mesa tbody tr").remove();
$("#id_parlamentar option").remove(); $("#id_parlamentar option").remove();
$("#id_cargo option").remove(); $("#id_cargo option").remove();
@ -188,7 +259,13 @@
} }
for (i = 0; i < lista_composicao.length; i++) { 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>'); $('#id_composicao_mesa').append('<tr value="' + lista_composicao[i][0] + '">' +
'<td>' + lista_composicao[i][1] + ' </td> ' +
'<td>' + lista_composicao[i][2] + '</td>' +
'<td>' + lista_composicao[i][3] + '</td>' +
'<td>' + lista_composicao[i][4] + '</td>' +
'<td><button id="'+ lista_composicao[i][0] +'" onclick="apaga_membro_mesa(this)" type="button" class="btn btn-danger">Apagar</button></td>' +
+ '</tr>');
} }
// Caso ainda tenha parlamentares/cargos a serem inseridos, preenche a listagem com // Caso ainda tenha parlamentares/cargos a serem inseridos, preenche a listagem com
@ -235,10 +312,14 @@
if (data['msg'][1] == 0){ if (data['msg'][1] == 0){
msg = data['msg'] msg = data['msg']
} }
errors_handler(msg) errors_handler(msg)
index_sessao = document.getElementById("id_sessao_legislativa").selectedIndex;
$("#datepicker").val("01/01/" + lista_sessoes[index_sessao][2]);
$("#datepicker2").val("31/12/" + lista_sessoes[index_sessao][2]);
}); });
} }
//############################################################# //#############################################################
@ -259,7 +340,9 @@
$.ajax({ $.ajax({
data: {sessao: $("#id_sessao_legislativa").val(), data: {sessao: $("#id_sessao_legislativa").val(),
parlamentar: $("#id_parlamentar").val(), parlamentar: $("#id_parlamentar").val(),
cargo: $("#id_cargo").val()}, cargo: $("#id_cargo").val(),
data_inicial: $("#datepicker").val(),
data_fim: $("#datepicker2").val()},
type: 'POST', type: 'POST',
url: "{% url 'sapl.parlamentares:insere_parlamentar_composicao' %}", url: "{% url 'sapl.parlamentares:insere_parlamentar_composicao' %}",
headers: { headers: {
@ -277,13 +360,11 @@
}); });
}) })
$('#id_excluir').click(function(){ function apaga_membro_mesa(selecionado){
// Pega o id do parlamentar que foi selecionado // Pega o id do parlamentar que foi selecionado
selecionado = $("#id_composicao_mesa option:selected").val()
if (selecionado){ if (selecionado){
$.ajax({ $.ajax({
data: {composicao_mesa: selecionado}, data: {composicao_mesa: selecionado.id},
type: 'POST', type: 'POST',
url: "{% url 'sapl.parlamentares:remove_parlamentar_composicao' %}", url: "{% url 'sapl.parlamentares:remove_parlamentar_composicao' %}",
headers: { headers: {
@ -301,7 +382,7 @@
}, },
}); });
} }
}); }
</script> </script>

2
sapl/templates/parlamentares/public_composicaomesa_form.html

@ -40,6 +40,7 @@
<th>Nome do Parlamentar</th> <th>Nome do Parlamentar</th>
<th>Partido</th> <th>Partido</th>
<th>Cargo</th> <th>Cargo</th>
<th>Período (Inicio - Fim)</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -56,6 +57,7 @@
<td><a href="{% url 'sapl.parlamentares:parlamentar_detail' p.parlamentar.pk %}">{{p.parlamentar.nome_parlamentar}}</a></td> <td><a href="{% url 'sapl.parlamentares:parlamentar_detail' p.parlamentar.pk %}">{{p.parlamentar.nome_parlamentar}}</a></td>
<td>{{p.parlamentar.filiacao_atual}}</td> <td>{{p.parlamentar.filiacao_atual}}</td>
<td>{{p.cargo}}</td> <td>{{p.cargo}}</td>
<td>{{p.data_inicio|date:"d/m/Y"}} - {{p.data_fim|date:"d/m/Y"}}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

Loading…
Cancel
Save