Browse Source

Refatora model de Frente Parlamentar (#3023)

Co-authored-by: Vinícius Cantuária <cantuariavc@gmail.com>
pull/3251/head
Ricardo Lima Canela 4 years ago
committed by GitHub
parent
commit
26efdf6c5b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 32
      sapl/parlamentares/forms.py
  2. 68
      sapl/parlamentares/migrations/0032_frente_parlamentar.py
  3. 57
      sapl/parlamentares/models.py
  4. 14
      sapl/parlamentares/urls.py
  5. 67
      sapl/parlamentares/views.py
  6. 2
      sapl/rules/map_rules.py
  7. 3
      sapl/templates/menu_tabelas_auxiliares.yaml
  8. 9
      sapl/templates/parlamentares/frente_detail.html
  9. 93
      sapl/templates/parlamentares/frente_form.html
  10. 9
      sapl/templates/parlamentares/frenteparlamentar_list.html
  11. 19
      sapl/templates/parlamentares/layouts.yaml
  12. 42
      sapl/templates/parlamentares/parlamentar_frentes_list.html
  13. 2
      sapl/templates/parlamentares/subnav.yaml

32
sapl/parlamentares/forms.py

@ -23,7 +23,7 @@ from sapl.rules import SAPL_GROUP_VOTANTE
import django_filters import django_filters
from .models import (ComposicaoColigacao, Filiacao, Frente, Legislatura, from .models import (ComposicaoColigacao, Filiacao, Frente, Legislatura,
Mandato, Parlamentar, Votante, Bloco) Mandato, Parlamentar, Votante, Bloco, FrenteParlamentar)
class ImageThumbnailFileInput(ClearableFileInput): class ImageThumbnailFileInput(ClearableFileInput):
@ -428,11 +428,7 @@ class FrenteForm(ModelForm):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(FrenteForm, self).__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['parlamentares'].queryset = Parlamentar.objects.filter(
ativo=True).order_by('nome_completo')
self.fields['parlamentares'].label = _('Parlamentares \
(Mantenha CTRL pressionado para selecionar vários)')
class Meta: class Meta:
model = Frente model = Frente
@ -470,6 +466,30 @@ class FrenteForm(ModelForm):
return frente return frente
class FrenteParlamentarForm(ModelForm):
logger = logging.getLogger(__name__)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['frente'].widget = forms.HiddenInput()
class Meta:
model = FrenteParlamentar
fields = '__all__'
def clean(self):
cd = super().clean()
if not self.is_valid():
return self.cleaned_data
if cd['cargo'].cargo_unico:
frente_parlamentar = FrenteParlamentar.objects.filter(frente=cd['frente'], cargo=cd['cargo'])
if frente_parlamentar and not frente_parlamentar[0].parlamentar == cd['parlamentar']:
raise ValidationError(_("Cargo único já ocupado por outro parlamentar."))
return cd
class VotanteForm(ModelForm): class VotanteForm(ModelForm):
username = forms.CharField( username = forms.CharField(

68
sapl/parlamentares/migrations/0032_frente_parlamentar.py

@ -0,0 +1,68 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-08-07 12:50
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
def cria_parlamentar_em_frente(apps, schema_editor):
Frente = apps.get_model("parlamentares", "Frente")
FrenteCargo = apps.get_model("parlamentares", "FrenteCargo")
FrenteParlamentar = apps.get_model("parlamentares", "FrenteParlamentar")
cargo_membro = FrenteCargo.objects.create(nome_cargo="membro", cargo_unico=False)
parlamentares_frente = []
for frente in Frente.objects.all().prefetch_related("parlamentares"):
for parlamentar in frente.parlamentares.all():
parlamentares_frente.append(
FrenteParlamentar(
frente=frente,
parlamentar=parlamentar,
cargo=cargo_membro,
data_entrada=frente.data_criacao))
FrenteParlamentar.objects.bulk_create(parlamentares_frente)
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0031_auto_20200407_1406'),
]
operations = [
migrations.CreateModel(
name='FrenteCargo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nome_cargo', models.CharField(max_length=80, verbose_name='Cargo de frente parlamentar')),
('cargo_unico', models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Cargo único?')),
],
options={
'verbose_name': 'Cargo de Frente Parlamentar',
'verbose_name_plural': 'Cargos de Frente Parlamentar',
'ordering': ('cargo_unico', 'nome_cargo'),
},
),
migrations.CreateModel(
name='FrenteParlamentar',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('frente', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.Frente',verbose_name='Frente parlamentar')),
('parlamentar', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.Parlamentar', verbose_name='Parlamentar')),
('cargo', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.FrenteCargo', verbose_name='Cargo na frente parlamentar')),
('data_entrada', models.DateField(verbose_name='Data Entrada')),
('data_saida', models.DateField(blank=True, null=True, verbose_name='Data Saída')),
],
options={
'verbose_name': 'Parlamentar de frente parlamentar',
'verbose_name_plural': 'Parlamentares de frente parlamentar',
'ordering': ('frente', 'parlamentar', 'cargo'),
},
),
migrations.RunPython(cria_parlamentar_em_frente),
migrations.RemoveField(
model_name='frente',
name='parlamentares',
),
]

57
sapl/parlamentares/models.py

@ -518,13 +518,12 @@ class Frente(models.Model):
nome = models.CharField( nome = models.CharField(
max_length=80, max_length=80,
verbose_name=_('Nome da Frente')) verbose_name=_('Nome da Frente'))
parlamentares = models.ManyToManyField(Parlamentar, descricao = models.TextField(blank=True, verbose_name=_('Descrição'))
blank=True,
verbose_name=_('Parlamentares'))
data_criacao = models.DateField(verbose_name=_('Data Criação')) data_criacao = models.DateField(verbose_name=_('Data Criação'))
data_extincao = models.DateField( data_extincao = models.DateField(
blank=True, null=True, verbose_name=_('Data Dissolução')) blank=True,
descricao = models.TextField(blank=True, verbose_name=_('Descrição')) null=True,
verbose_name=_('Data Dissolução'))
# campo conceitual de reversão genérica para o model Autor que dá a # campo conceitual de reversão genérica para o model Autor que dá a
# o meio possível de localização de tipos de autores. # o meio possível de localização de tipos de autores.
@ -549,6 +548,54 @@ class Frente(models.Model):
return self.nome return self.nome
@reversion.register()
class FrenteCargo(models.Model):
nome_cargo = models.CharField(
max_length=80,
verbose_name=_('Cargo de frente parlamentar'))
cargo_unico = models.BooleanField(
default=False,
choices=YES_NO_CHOICES,
verbose_name=_('Cargo único?'))
class Meta:
verbose_name = _('Cargo de Frente Parlamentar')
verbose_name_plural = _('Cargos de Frente Parlamentar')
ordering = ('cargo_unico', 'nome_cargo',)
def __str__(self):
return f"{self.nome_cargo}"
@reversion.register()
class FrenteParlamentar(models.Model):
frente = models.ForeignKey(
Frente,
verbose_name=_('Frente parlamentar'),
on_delete=models.CASCADE)
parlamentar = models.ForeignKey(
Parlamentar,
verbose_name=_('Parlamentar'),
on_delete=models.CASCADE)
cargo = models.ForeignKey(
FrenteCargo,
verbose_name=_('Cargo na frente parlamentar'),
on_delete=models.PROTECT)
data_entrada = models.DateField(verbose_name=_('Data Entrada'))
data_saida = models.DateField(
blank=True,
null=True,
verbose_name=_('Data Saída'))
class Meta:
verbose_name = _('Parlamentar de frente parlamentar')
verbose_name_plural = _('Parlamentares de frente parlamentar')
ordering = ('frente', 'parlamentar', 'cargo')
def __str__(self):
return f"{self.parlamentar} - {self.cargo.nome_cargo} - {self.frente}"
class Votante(models.Model): class Votante(models.Model):
parlamentar = models.ForeignKey( parlamentar = models.ForeignKey(
Parlamentar, verbose_name=_('Parlamentar'), Parlamentar, verbose_name=_('Parlamentar'),

14
sapl/parlamentares/urls.py

@ -21,7 +21,8 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
remove_parlamentar_composicao, remove_parlamentar_composicao,
parlamentares_filiados, BlocoCrud, parlamentares_filiados, BlocoCrud,
PesquisarParlamentarView, VincularParlamentarView, PesquisarParlamentarView, VincularParlamentarView,
get_sessoes_legislatura) get_sessoes_legislatura, FrenteCargoCrud, FrenteParlamentarCrud,
get_parlamentar_frentes)
from .apps import AppConfig from .apps import AppConfig
@ -33,7 +34,7 @@ urlpatterns = [
FiliacaoCrud.get_urls() + MandatoCrud.get_urls() + FiliacaoCrud.get_urls() + MandatoCrud.get_urls() +
ParticipacaoParlamentarCrud.get_urls() + ParticipacaoParlamentarCrud.get_urls() +
ProposicaoParlamentarCrud.get_urls() + ProposicaoParlamentarCrud.get_urls() +
RelatoriaParlamentarCrud.get_urls() + FrenteList.get_urls() + RelatoriaParlamentarCrud.get_urls() +
VotanteView.get_urls() VotanteView.get_urls()
)), )),
@ -43,6 +44,8 @@ urlpatterns = [
url(r'^parlamentar/(?P<pk>\d+)/materias$', url(r'^parlamentar/(?P<pk>\d+)/materias$',
ParlamentarMateriasView.as_view(), name='parlamentar_materias'), ParlamentarMateriasView.as_view(), name='parlamentar_materias'),
url(r'^parlamentar/(?P<pk>\d+)/frentes/$', get_parlamentar_frentes, name='parlamentar_frentes'),
url(r'^parlamentar/vincular-parlamentar/$', url(r'^parlamentar/vincular-parlamentar/$',
VincularParlamentarView.as_view(), name='vincular_parlamentar'), VincularParlamentarView.as_view(), name='vincular_parlamentar'),
@ -54,8 +57,11 @@ urlpatterns = [
ComposicaoColigacaoCrud.get_urls())), ComposicaoColigacaoCrud.get_urls())),
url(r'^sistema/bloco/', url(r'^sistema/bloco/',
include(BlocoCrud.get_urls())), include(BlocoCrud.get_urls())),
url(r'^sistema/frente/',
include(FrenteCrud.get_urls())), url(r'^sistema/frente/', include(FrenteCrud.get_urls())),
url(r'^sistema/frente-cargo/', include(FrenteCargoCrud.get_urls())),
url(r'^sistema/frente-parlamentares/', include(FrenteParlamentarCrud.get_urls())),
url(r'^sistema/frente/atualiza-lista-parlamentares', url(r'^sistema/frente/atualiza-lista-parlamentares',
frente_atualiza_lista_parlamentares, frente_atualiza_lista_parlamentares,
name='atualiza_lista_parlamentares'), name='atualiza_lista_parlamentares'),

67
sapl/parlamentares/views.py

@ -36,15 +36,16 @@ from sapl.utils import (parlamentares_ativos, show_results_filter_set)
from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm, from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm,
ParlamentarCreateForm, ParlamentarForm, VotanteForm, ParlamentarCreateForm, ParlamentarForm, VotanteForm,
ParlamentarFilterSet, VincularParlamentarForm, ParlamentarFilterSet, VincularParlamentarForm,
BlocoForm) BlocoForm, FrenteParlamentarForm)
from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
Dependente, Filiacao, Frente, Legislatura, Mandato, Dependente, Filiacao, Frente, Legislatura, Mandato,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
SituacaoMilitar, TipoAfastamento, TipoDependente, Votante, SituacaoMilitar, TipoAfastamento, TipoDependente, Votante,
Bloco) Bloco, FrenteCargo, FrenteParlamentar)
FrenteCargoCrud = CrudAux.build(FrenteCargo, 'frente_cargo')
CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa') CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa')
TipoDependenteCrud = CrudAux.build(TipoDependente, 'tipo_dependente') TipoDependenteCrud = CrudAux.build(TipoDependente, 'tipo_dependente')
NivelInstrucaoCrud = CrudAux.build(NivelInstrucao, 'nivel_instrucao') NivelInstrucaoCrud = CrudAux.build(NivelInstrucao, 'nivel_instrucao')
@ -384,8 +385,7 @@ class FrenteCrud(Crud):
model = Frente model = Frente
help_topic = 'tipo_situa_militar' help_topic = 'tipo_situa_militar'
public = [RP_DETAIL, RP_LIST] public = [RP_DETAIL, RP_LIST]
list_field_names = ['nome', 'data_criacao', list_field_names = ['nome', 'data_criacao', 'data_extincao']
'data_extincao', 'parlamentares']
class BaseMixin(Crud.BaseMixin): class BaseMixin(Crud.BaseMixin):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@ -403,6 +403,65 @@ class FrenteCrud(Crud):
form_class = FrenteForm form_class = FrenteForm
class FrenteParlamentarCrud(MasterDetailCrud):
model = FrenteParlamentar
parent_field = 'frente'
help_topic = 'frente_parlamentares'
public = [RP_LIST, RP_DETAIL]
class CreateView(MasterDetailCrud.CreateView):
form_class = FrenteParlamentarForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['subnav_template_name'] = ''
return context
def get_initial(self):
self.initial['frente'] = Frente.objects.get(pk=self.kwargs['pk'])
return self.initial
class UpdateView(MasterDetailCrud.UpdateView):
form_class = FrenteParlamentarForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['subnav_template_name'] = ''
return context
class DetailView(MasterDetailCrud.DetailView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['subnav_template_name'] = ''
return context
class ListView(MasterDetailCrud.ListView):
layout_key = 'FrenteParlamentarList'
ordering = ('-cargo__cargo_unico', 'parlamentar')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['subnav_template_name'] = ''
return context
def get_parlamentar_frentes(request, pk):
template_name = 'parlamentares/parlamentar_frentes_list.html'
frentes = [f for f in FrenteParlamentar.objects.filter(parlamentar_id=pk)
.select_related('frente', 'cargo')
.order_by('-data_entrada', '-data_saida')]
context = {
'subnav_template_name': 'parlamentares/subnav.yaml',
'root_pk': pk,
'nome_parlamentar': Parlamentar.objects.get(id=pk).nome_parlamentar,
'frentes': frentes,
'num_frentes': len(frentes)
}
return render(request, template_name, context)
class MandatoCrud(MasterDetailCrud): class MandatoCrud(MasterDetailCrud):
model = Mandato model = Mandato
parent_field = 'parlamentar' parent_field = 'parlamentar'

2
sapl/rules/map_rules.py

@ -282,6 +282,8 @@ rules_group_geral = {
(parlamentares.CargoMesa, __base__, __perms_publicas__), (parlamentares.CargoMesa, __base__, __perms_publicas__),
(parlamentares.ComposicaoMesa, __base__, __perms_publicas__), (parlamentares.ComposicaoMesa, __base__, __perms_publicas__),
(parlamentares.Frente, __base__, __perms_publicas__), (parlamentares.Frente, __base__, __perms_publicas__),
(parlamentares.FrenteCargo, __base__, __perms_publicas__),
(parlamentares.FrenteParlamentar, __base__, __perms_publicas__),
(parlamentares.Votante, __base__, __perms_publicas__), (parlamentares.Votante, __base__, __perms_publicas__),
(parlamentares.Bloco, __base__, __perms_publicas__), (parlamentares.Bloco, __base__, __perms_publicas__),

3
sapl/templates/menu_tabelas_auxiliares.yaml

@ -80,6 +80,9 @@
- title: {% trans 'Frente Parlamentar' %} - title: {% trans 'Frente Parlamentar' %}
url: sapl.parlamentares:frente_list url: sapl.parlamentares:frente_list
css_class: btn btn-link css_class: btn btn-link
- title: {% trans 'Cargo de Frente Parlamentar' %}
url: sapl.parlamentares:frentecargo_list
css_class: btn btn-link
- title: {% trans 'Bloco Parlamentar' %} - title: {% trans 'Bloco Parlamentar' %}
url: sapl.parlamentares:bloco_list url: sapl.parlamentares:bloco_list
css_class: btn btn-link css_class: btn btn-link

9
sapl/templates/parlamentares/frente_detail.html

@ -0,0 +1,9 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags cropping %}
{% block actions %}
{{ block.super }}
<div class="actions btn-group btn-group-sm" role="group">
<a href="{% url 'sapl.parlamentares:frenteparlamentar_list' object.pk %}" class="btn btn-outline-primary">Listar Parlamentares Filiados</a>
</div>
{% endblock actions %}

93
sapl/templates/parlamentares/frente_form.html

@ -22,24 +22,6 @@
</div> </div>
</div> </div>
<div id="div_parlamentares">
<div class="row">
<div class="col-md-12" >
<div class="checkbox">
<label for="id_selecionar_ativos">
<input id="id_selecionar_ativos" type="checkbox" name="id_selecionar_ativos"/>
<b><h4>Listar somente os parlamentares ativos</h4></b>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12" >
{{ form.parlamentares|as_crispy_field }}
</div>
</div>
</div>
<div class="row"> <div class="row">
<div class="col-md-12" > <div class="col-md-12" >
{{ form.descricao|as_crispy_field }} {{ form.descricao|as_crispy_field }}
@ -51,78 +33,3 @@
</form> </form>
{% endblock base_content %} {% 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
{% if object.id %}
var frente_id = {{ object.id }}
$.get("/sistema/frente/parlamentares-frente-selected",
{frente_id: frente_id},
function (data) {
id_list = data['id_list'];
$("#id_parlamentares").val(id_list);
});
{% endif %}
}
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 %}

9
sapl/templates/parlamentares/frenteparlamentar_list.html

@ -0,0 +1,9 @@
{% extends "crud/list.html" %}
{% load i18n %}
{% load common_tags %}
{% block more_buttons %}
<a href="{% url 'sapl.parlamentares:frente_detail' root_pk %}" class="btn btn-outline-primary">
Frente Parlamentar
</a>
{% endblock more_buttons %}

19
sapl/templates/parlamentares/layouts.yaml

@ -117,12 +117,27 @@ ComposicaoColigacao:
- partido - partido
Frente: Frente:
{% trans 'Frente' %}: {% trans 'Frente Parlamentar' %}:
- nome - nome
- data_criacao data_extincao - data_criacao data_extincao
- parlamentares
- descricao - descricao
FrenteCargo:
{% trans 'Cargo' %}:
- nome_cargo cargo_unico:4
FrenteParlamentar:
{% trans 'Parlamentar'%}:
- frente
- cargo:4 parlamentar
- data_entrada data_saida
FrenteParlamentarList:
{% trans 'Parlamentares'%}:
- id
- cargo:4 parlamentar
- data_entrada data_saida
Votante: Votante:
{% trans 'Votante' %}: {% trans 'Votante' %}:
- parlamentar user - parlamentar user

42
sapl/templates/parlamentares/parlamentar_frentes_list.html

@ -0,0 +1,42 @@
{% extends "crud/list.html" %}
{% load i18n %}
{% load common_tags %}
{% block actions %}
{{ block.super }}
{% endblock actions %}
{% block base_content %}
{% if not frentes %}
<h1>O {{ nome_parlamentar }} não têm participações em Frentes Parlamentares.</h1>
{% else %}
<h1>Frentes ({{ nome_parlamentar }})</h1>
<br/>
Total de Frentes: {{ num_frentes }}
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Frent{{ num_frentes|pluralize:"e,es" }}</th>
<th>Cargo</th>
<th>Data de Entrada</th>
<th>Data de Saída</th>
</tr>
</thead>
<tbody>
{% for frente in frentes %}
<tr>
<td>
<a href="{% url 'sapl.parlamentares:frente_detail' frente.frente.pk %}">{{ frente.frente }}</a>
</td>
<td>{{ frente.cargo.nome_cargo }}</td>
<td>{{ frente.data_entrada }}</td>
<td>{% if frente.data_saida %} {{ frente.data_saida }} {% else %} - {% endif %}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
<br/>
{% include 'paginacao.html'%}
<br /><br /><br />
{% endblock base_content %}

2
sapl/templates/parlamentares/subnav.yaml

@ -18,7 +18,7 @@
- title: {% trans 'Relatorias' %} - title: {% trans 'Relatorias' %}
url: relatoria_parlamentar_list url: relatoria_parlamentar_list
- title: {% trans 'Frentes' %} - title: {% trans 'Frentes' %}
url: frente_parlamentar_list url: parlamentar_frentes
- title: {% trans 'Usuário' %} - title: {% trans 'Usuário' %}
url: votante_list url: votante_list
check_permission: parlamentares.add_parlamentar check_permission: parlamentares.add_parlamentar

Loading…
Cancel
Save