Browse Source

Fix #1203 frente parlamentar (#1267)

* Inicia a reestruturação

* Adiciona lógica para aparecer ou esconder caixa de seleção de parlamentares

* Cria o campo de data de inicio do mandato

* Adiciona campo de inicio de mandato nos forms e details

* Cria logica para mostrar somente os ativos

* Finaliza as melhorias em Frente

* Tira obrigatoriedade do campo Data Inicio de Mandato

* Conserta teste de mandato
pull/1276/head
Eduardo Calil 8 years ago
committed by Edward
parent
commit
078319154e
  1. 3
      sapl/parlamentares/forms.py
  2. 27
      sapl/parlamentares/migrations/0003_auto_20170707_1656.py
  3. 20
      sapl/parlamentares/migrations/0004_auto_20170711_1305.py
  4. 7
      sapl/parlamentares/models.py
  5. 2
      sapl/parlamentares/tests/test_parlamentares.py
  6. 10
      sapl/parlamentares/urls.py
  7. 110
      sapl/parlamentares/views.py
  8. 128
      sapl/templates/parlamentares/frente_form.html
  9. 3
      sapl/templates/parlamentares/layouts.yaml
  10. 10
      scripts/set_inicio_mandato.py

3
sapl/parlamentares/forms.py

@ -54,7 +54,8 @@ class MandatoForm(ModelForm):
class Meta: class Meta:
model = Mandato model = Mandato
fields = ['legislatura', 'coligacao', 'votos_recebidos', fields = ['legislatura', 'coligacao', 'votos_recebidos',
'data_fim_mandato', 'data_expedicao_diploma', 'titular', 'data_inicio_mandato', 'data_fim_mandato',
'data_expedicao_diploma', 'titular',
'tipo_afastamento', 'observacao', 'parlamentar'] 'tipo_afastamento', 'observacao', 'parlamentar']
widgets = {'parlamentar': forms.HiddenInput()} widgets = {'parlamentar': forms.HiddenInput()}

27
sapl/parlamentares/migrations/0003_auto_20170707_1656.py

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2017-07-07 16:56
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0002_auto_20170504_1751'),
]
operations = [
migrations.AddField(
model_name='mandato',
name='data_inicio_mandato',
field=models.DateField(default=datetime.datetime(2017, 7, 7, 16, 56, 58, 525896), verbose_name='Início do Mandato'),
preserve_default=False,
),
migrations.AlterField(
model_name='mandato',
name='data_fim_mandato',
field=models.DateField(blank=True, null=True, verbose_name='Fim do Mandato'),
),
]

20
sapl/parlamentares/migrations/0004_auto_20170711_1305.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2017-07-11 13:05
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0003_auto_20170707_1656'),
]
operations = [
migrations.AlterField(
model_name='mandato',
name='data_inicio_mandato',
field=models.DateField(blank=True, null=True, verbose_name='Início do Mandato'),
),
]

7
sapl/parlamentares/models.py

@ -449,7 +449,12 @@ class Mandato(models.Model):
on_delete=models.PROTECT, verbose_name=_('Coligação')) on_delete=models.PROTECT, verbose_name=_('Coligação'))
# TODO what is this field?????? # TODO what is this field??????
tipo_causa_fim_mandato = models.PositiveIntegerField(blank=True, null=True) tipo_causa_fim_mandato = models.PositiveIntegerField(blank=True, null=True)
data_fim_mandato = models.DateField(verbose_name=_('Fim do Mandato')) data_inicio_mandato = models.DateField(verbose_name=_('Início do Mandato'),
blank=True,
null=True)
data_fim_mandato = models.DateField(verbose_name=_('Fim do Mandato'),
blank=True,
null=True)
votos_recebidos = models.PositiveIntegerField( votos_recebidos = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Votos Recebidos (Mandato)')) blank=True, null=True, verbose_name=_('Votos Recebidos (Mandato)'))
data_expedicao_diploma = models.DateField( data_expedicao_diploma = models.DateField(

2
sapl/parlamentares/tests/test_parlamentares.py

@ -147,7 +147,5 @@ def test_form_errors_mandato(admin_client):
assert (response.context_data['form'].errors['legislatura'] == assert (response.context_data['form'].errors['legislatura'] ==
['Este campo é obrigatório.']) ['Este campo é obrigatório.'])
assert (response.context_data['form'].errors['data_fim_mandato'] ==
['Este campo é obrigatório.'])
assert (response.context_data['form'].errors['data_expedicao_diploma'] == assert (response.context_data['form'].errors['data_expedicao_diploma'] ==
['Este campo é obrigatório.']) ['Este campo é obrigatório.'])

10
sapl/parlamentares/urls.py

@ -15,7 +15,9 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
TipoMilitarCrud, VotanteView, TipoMilitarCrud, VotanteView,
altera_field_mesa, altera_field_mesa,
altera_field_mesa_public_view, altera_field_mesa_public_view,
frente_atualiza_lista_parlamentares,
insere_parlamentar_composicao, insere_parlamentar_composicao,
parlamentares_frente_selected,
remove_parlamentar_composicao) remove_parlamentar_composicao)
from .apps import AppConfig from .apps import AppConfig
@ -38,8 +40,16 @@ urlpatterns = [
url(r'^sistema/coligacao/', url(r'^sistema/coligacao/',
include(ColigacaoCrud.get_urls() + include(ColigacaoCrud.get_urls() +
ComposicaoColigacaoCrud.get_urls())), ComposicaoColigacaoCrud.get_urls())),
url(r'^sistema/frente/', url(r'^sistema/frente/',
include(FrenteCrud.get_urls())), include(FrenteCrud.get_urls())),
url(r'^sistema/frente/atualiza-lista-parlamentares',
frente_atualiza_lista_parlamentares,
name='atualiza_lista_parlamentares'),
url(r'^sistema/frente/parlamentares-frente-selected',
parlamentares_frente_selected,
name='parlamentares_frente_selected'),
url(r'^sistema/parlamentar/legislatura/', url(r'^sistema/parlamentar/legislatura/',
include(LegislaturaCrud.get_urls())), include(LegislaturaCrud.get_urls())),
url(r'^sistema/parlamentar/tipo-dependente/', url(r'^sistema/parlamentar/tipo-dependente/',

110
sapl/parlamentares/views.py

@ -30,6 +30,10 @@ from sapl.materia.models import Autoria
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db.models.aggregates import Count from django.db.models.aggregates import Count
import datetime
import json
CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa') CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa')
PartidoCrud = CrudAux.build(Partido, 'partidos') PartidoCrud = CrudAux.build(Partido, 'partidos')
SessaoLegislativaCrud = CrudAux.build(SessaoLegislativa, 'sessao_legislativa') SessaoLegislativaCrud = CrudAux.build(SessaoLegislativa, 'sessao_legislativa')
@ -38,9 +42,6 @@ NivelInstrucaoCrud = CrudAux.build(NivelInstrucao, 'nivel_instrucao')
TipoAfastamentoCrud = CrudAux.build(TipoAfastamento, 'tipo_afastamento') TipoAfastamentoCrud = CrudAux.build(TipoAfastamento, 'tipo_afastamento')
TipoMilitarCrud = CrudAux.build(SituacaoMilitar, 'tipo_situa_militar') TipoMilitarCrud = CrudAux.build(SituacaoMilitar, 'tipo_situa_militar')
FrenteCrud = CrudAux.build(Frente, 'tipo_situa_militar', list_field_names=[
'nome', 'data_criacao', 'parlamentares'])
DependenteCrud = MasterDetailCrud.build( DependenteCrud = MasterDetailCrud.build(
Dependente, 'parlamentar', 'dependente') Dependente, 'parlamentar', 'dependente')
@ -211,6 +212,109 @@ class ColigacaoCrud(CrudAux):
subnav_template_name = 'parlamentares/subnav_coligacao.yaml' subnav_template_name = 'parlamentares/subnav_coligacao.yaml'
def json_date_convert(date):
'''
:param date: recebe a data de uma chamada ajax no formato de
string "dd/mm/yyyy"
:return:
'''
dia, mes, ano = date.split('/')
return datetime.date(day=int(dia),
month=int(mes),
year=int(ano))
def parlamentares_ativos(data_inicio, data_fim=None):
'''
:param data_inicio: define a data de inicial do período desejado
:param data_fim: define a data final do período desejado
:return: queryset dos parlamentares ativos naquele período
'''
mandatos_ativos = Mandato.objects.filter(Q(
data_inicio_mandato__lte=data_inicio,
data_fim_mandato__isnull=True) | Q(
data_inicio_mandato__lte=data_inicio,
data_fim_mandato__gte=data_inicio))
if data_fim:
mandatos_ativos = mandatos_ativos | Mandato.objects.filter(
data_inicio_mandato__gte=data_inicio,
data_inicio_mandato__lte=data_fim)
else:
mandatos_ativos = mandatos_ativos | Mandato.objects.filter(
data_inicio_mandato__gte=data_inicio)
parlamentares_id = mandatos_ativos.values_list(
'parlamentar_id',
flat=True).distinct('parlamentar_id')
return Parlamentar.objects.filter(id__in=parlamentares_id)
def frente_atualiza_lista_parlamentares(request):
'''
:param request: recebe os parâmetros do GET da chamada Ajax
:return: retorna a lista atualizada dos parlamentares
'''
ativos = json.loads(request.GET['ativos'])
parlamentares = Parlamentar.objects.all()
if ativos:
if 'data_criacao' in request.GET and request.GET['data_criacao']:
data_criacao = json_date_convert(request.GET['data_criacao'])
if 'data_extincao' in request.GET and request.GET['data_extincao']:
data_extincao = json_date_convert(request.GET['data_extincao'])
parlamentares = parlamentares_ativos(data_criacao,
data_extincao)
else:
parlamentares = parlamentares_ativos(data_criacao)
parlamentares_list = [(p.id, p.__str__()) for p in parlamentares]
return JsonResponse({'parlamentares_list': parlamentares_list})
def parlamentares_frente_selected(request):
'''
:return: Lista com o id dos parlamentares em uma frente
'''
try:
frente = Frente.objects.get(id=int(request.GET['frente_id']))
except ObjectDoesNotExist:
lista_parlamentar_id = []
else:
lista_parlamentar_id = frente.parlamentares.all().values_list(
'id', flat=True)
return JsonResponse({'id_list': list(lista_parlamentar_id)})
class FrenteCrud(CrudAux):
model = Frente
help_path = 'tabelas_auxiliares#tipo_situa_militar'
list_field_names = ['nome', 'data_criacao', 'parlamentares']
class CreateView(CrudAux.CreateView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Update view é um indicador para o javascript
# de que esta não é uma tela de edição de frente
context['update_view'] = 0
return context
class UpdateView(CrudAux.UpdateView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Update view é um indicador para o javascript
# de que esta não é uma tela de edição de frente
context['update_view'] = 1
return context
class MandatoCrud(MasterDetailCrud): class MandatoCrud(MasterDetailCrud):
model = Mandato model = Mandato
parent_field = 'parlamentar' parent_field = 'parlamentar'

128
sapl/templates/parlamentares/frente_form.html

@ -0,0 +1,128 @@
{% extends "crud/form.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% load common_tags %}
{% block base_content %}
<form method="POST">
{% csrf_token %}
<div class="row-fluid">
<div class="col-md-12" >
{{ form.nome|as_crispy_field }}
</div>
</div>
<div class="row-fluid">
<div class="col-md-6" >
{{ form.data_criacao|as_crispy_field }}
</div>
<div class="col-md-6" >
{{ form.data_extincao|as_crispy_field }}
</div>
</div>
<div id="div_parlamentares" style="display: none">
<div class="row-fluid">
<div class="col-md-12" >
<div class="checkbox">
<input id="id_selecionar_ativos" type="checkbox">
<b><h4>Listar somente os parlamentares ativos</h4></b>
</div>
</div>
</div>
<div class="row-fluid">
<div class="col-md-12" >
{{ form.parlamentares|as_crispy_field }}
</div>
</div>
</div>
<div class="row-fluid">
<div class="col-md-12" >
{{ form.descricao|as_crispy_field }}
</div>
</div>
<br />
<input type="submit" value="Salvar" class="btn btn-primary" />
</form>
{% endblock base_content %}
{% block extra_js %}
<script language="JavaScript">
function selecionar_parlamentares_frente() {
// Seleciona automaticamente todos os parlamentares
// que já estão presentes naquela frente
var update_view = {{ update_view }}
if (update_view == 1) {
var frente_id = {{ object.id }}
$.get("/sistema/frente/parlamentares-frente-selected",
{frente_id: frente_id},
function (data) {
id_list = data['id_list'];
$("div.controls select").val(id_list);
});
}
}
function atualiza_parlamentares() {
// Coloca para selecao os parlamentares no intervalo informado
// e somente os ativos, caso seja solicitado
// var ativos;
var data_criacao = $("#id_data_criacao").val();
var data_extincao = $("#id_data_extincao").val();
if (data_criacao === '') {
$('#div_parlamentares').hide();
}
else{
$('#div_parlamentares').show();
var ativos = $('#id_selecionar_ativos').prop('checked');
// Limpa a listagem para atualizar
$("#id_parlamentares").find("option").remove();
$.get("/sistema/frente/atualiza-lista-parlamentares",
{data_criacao: data_criacao,
data_extincao: data_extincao,
ativos: ativos},
function(data){
// Caso não venha nenhum dado da requisição, retorna null
if ($.isEmptyObject(data)){
return null
}
lista_parlamentares = data['parlamentares_list'];
// Atualiza a listagem de parlamentares
for (i = 0; i < lista_parlamentares.length; i++) {
$('#id_parlamentares').append(
'<option value="' + lista_parlamentares[i][0] + '">' +
lista_parlamentares[i][1] + '</option>');
}
}
).done(function(){selecionar_parlamentares_frente();});
}
}
$(document).ready(function(){
atualiza_parlamentares();
});
$("#id_data_criacao").change(function () {
atualiza_parlamentares();
});
$("#id_data_extincao").change(function () {
atualiza_parlamentares();
});
$("#id_selecionar_ativos").change(function () {
atualiza_parlamentares();
});
</script>
{% endblock %}

3
sapl/templates/parlamentares/layouts.yaml

@ -71,7 +71,8 @@ Filiacao:
Mandato: Mandato:
{% trans 'Mandato' %}: {% trans 'Mandato' %}:
- legislatura coligacao votos_recebidos - legislatura coligacao votos_recebidos
- data_fim_mandato data_expedicao_diploma titular - data_inicio_mandato data_fim_mandato
- data_expedicao_diploma titular
- tipo_afastamento - tipo_afastamento
- observacao - observacao

10
scripts/set_inicio_mandato.py

@ -0,0 +1,10 @@
from sapl.parlamentares.models import Mandato
def popula_campo_data_inicio():
for m in Mandato.objects.all():
m.data_inicio_mandato = m.legislatura.data_inicio
m.save()
if __name__ == '__main__':
popula_campo_data_inicio()
Loading…
Cancel
Save