Browse Source

WIP Implementa modelagem de Membros de Bancadas

Adiciona cadastro de membro

Adiciona visualização de membros

Adiciona atualização de membro

WIP Adiciona deletação de membro

Adiciona cadastro de cargo

Adiciona visualização de cargos

Adiciona atualização de cargo

WIP Adiciona deletação de cargo
pull/2758/head
Vinícius Cantuária 6 years ago
parent
commit
4824b65053
  1. 242
      sapl/parlamentares/forms.py
  2. 136
      sapl/parlamentares/migrations/0034_auto_20190604_1220.py
  3. 160
      sapl/parlamentares/models.py
  4. 41
      sapl/parlamentares/tests/test_parlamentares.py
  5. 33
      sapl/parlamentares/urls.py
  6. 132
      sapl/parlamentares/views.py
  7. 2
      sapl/rules/map_rules.py
  8. 36
      sapl/templates/parlamentares/bancada_detail.html
  9. 1
      sapl/templates/parlamentares/cargomembrobancada_create.html
  10. 3
      sapl/templates/parlamentares/cargomembrobancada_delete.html
  11. 81
      sapl/templates/parlamentares/cargomembrobancada_detail.html
  12. 3
      sapl/templates/parlamentares/cargomembrobancada_update.html
  13. 7
      sapl/templates/parlamentares/layouts.yaml
  14. 1
      sapl/templates/parlamentares/membrobancada_create.html
  15. 3
      sapl/templates/parlamentares/membrobancada_delete.html
  16. 105
      sapl/templates/parlamentares/membrobancada_detail.html
  17. 3
      sapl/templates/parlamentares/membrobancada_update.html
  18. 215
      scripts/popula_bancada.py

242
sapl/parlamentares/forms.py

@ -23,8 +23,8 @@ from sapl.rules import SAPL_GROUP_VOTANTE
import django_filters
from .models import (ComposicaoColigacao, Filiacao, Frente, Legislatura,
Mandato, Parlamentar, Votante, Bloco, Bancada, CargoBloco,
CargoBlocoPartido)
Mandato, Parlamentar, Votante, Bloco, CargoBloco, CargoBlocoPartido,
Bancada, MembroBancada, CargoMembroBancada)
class ImageThumbnailFileInput(ClearableFileInput):
@ -622,57 +622,6 @@ class BlocoForm(ModelForm):
return bloco
class BancadaForm(ModelForm):
class Meta:
model = Bancada
fields = ['legislatura', 'nome', 'partido', 'data_criacao',
'data_extincao', 'descricao']
def clean(self):
super(BancadaForm, self).clean()
if not self.is_valid():
return self.cleaned_data
data = self.cleaned_data
legislatura = data['legislatura']
data_criacao = data['data_criacao']
if data_criacao:
if (data_criacao < legislatura.data_inicio or
data_criacao > legislatura.data_fim):
raise ValidationError(_("Data de criação da bancada fora do intervalo"
" de legislatura informada"))
data_extincao = data['data_extincao']
if data_extincao:
if (data_extincao < legislatura.data_inicio or
data_extincao > legislatura.data_fim):
raise ValidationError(_("Data fim da bancada fora do intervalo de"
" legislatura informada"))
if self.cleaned_data['data_extincao']:
if (self.cleaned_data['data_extincao'] <
self.cleaned_data['data_criacao']):
msg = _('Data de extinção não pode ser menor que a de criação')
raise ValidationError(msg)
return self.cleaned_data
@transaction.atomic
def save(self, commit=True):
bancada = super(BancadaForm, self).save(commit)
content_type = ContentType.objects.get_for_model(Bancada)
object_id = bancada.pk
tipo = TipoAutor.objects.get(content_type=content_type)
Autor.objects.create(
content_type=content_type,
object_id=object_id,
tipo=tipo,
nome=bancada.nome
)
return bancada
class CargoBlocoForm(ModelForm):
class Meta:
model = CargoBloco
@ -737,3 +686,190 @@ class CargoBlocoPartidoForm(ModelForm):
if self.instance.pk and (cleaned_data['parlamentar'].id != self.instance.parlamentar.id):
raise ValidationError("Não é possivel alterar o parlamentar " + str(self.instance.parlamentar))
class BancadaForm(ModelForm):
class Meta:
model = Bancada
fields = ['nome', 'descricao', 'ativo']
def clean(self):
super(BancadaForm, self).clean()
if not self.is_valid():
return self.cleaned_data
def save(self, commit=True):
bancada = super(BancadaForm, self).save(commit)
content_type = ContentType.objects.get_for_model(Bancada)
object_id = bancada.pk
tipo = TipoAutor.objects.get(content_type=content_type)
Autor.objects.create(
content_type=content_type,
object_id=object_id,
tipo=tipo,
nome=bancada.nome
)
return bancada
class MembroBancadaForm(ModelForm):
class Meta:
model = MembroBancada
fields = '__all__'
def __init__(self, *args, **kwargs):
self.bancada = kwargs.pop('bancada')
super().__init__(*args, **kwargs)
self.fields['bancada'].choices = [(self.bancada.pk, self.bancada.nome)]
if not self.instance.pk:
action_label = 'Adicionar Membro'
else:
self.fields['parlamentar'].choices = [(self.instance.parlamentar.pk, self.instance.parlamentar)]
self.fields['legislatura'].initial = (self.instance.legislatura.pk, self.instance.legislatura)
self.fields['data_inicio'].initial = self.instance.data_inicio
self.fields['data_fim'].initial = self.instance.data_fim
action_label = 'Atualizar Membro'
row = to_row([
('parlamentar', 6),
('bancada', 4),
('legislatura', 4),
('data_inicio', 3),
('data_fim', 3),
])
self.helper = SaplFormHelper()
self.helper.layout = Layout(
Fieldset(
_(action_label),
row,
form_actions(label=_(action_label))
)
)
def clean(self):
data = super().clean()
if not self.is_valid():
return data
data_inicio_legislatura = data['legislatura'].data_inicio
data_fim_legislatura = data['legislatura'].data_fim
data_inicio = data['data_inicio']
data_fim = data['data_fim']
if data_fim and data_inicio > data_fim:
raise ValidationError(_('A data início de membro deve ser anterior a data fim.'))
elif data_inicio_legislatura > data_inicio:
raise ValidationError(_('A data início de membro deve ser posterior a data início da legislatura.'))
elif data_fim and data_fim > data_fim_legislatura:
raise ValidationError(_('A data fim de membro deve ser anterior a data fim da legislatura.'))
return data
def save(self, commit=False):
data = super().save(commit)
if not self.instance.pk:
membro, created = MembroBancada.objects.get_or_create(
parlamentar=data.parlamentar,
bancada=data.bancada,
data_inicio=data.data_inicio,
data_fim=data.data_fim,
legislatura=data.legislatura)
else:
membro = MembroBancada.objects.get(pk=self.instance.pk)
membro.data_inicio = data.data_inicio
membro.data_fim = data.data_fim
membro.legislatura = data.legislatura
membro.save()
return membro
class CargoMembroBancadaForm(ModelForm):
class Meta:
model = CargoMembroBancada
fields = '__all__'
data_inicio_membro = forms.DateField(
label='Data Início de Membro',
required=False,
disabled=True, )
data_fim_membro = forms.DateField(
label='Data Fim de Membro',
required=False,
disabled=True, )
def __init__(self, *args, **kwargs):
self.membro = kwargs.pop('membro')
super().__init__(*args, **kwargs)
self.fields['membro'].choices = [(self.membro.pk, self.membro.parlamentar.nome_parlamentar)]
self.fields['data_inicio_membro'].initial = self.membro.data_inicio
self.fields['data_fim_membro'].initial = self.membro.data_fim
if not self.instance.pk:
action_label = 'Adicionar Cargo'
else:
action_label = 'Atualizar Cargo'
row = to_row([
('membro', 4),
('data_inicio_membro', 3),
('data_fim_membro', 3),
('cargo', 4),
('data_inicio', 3),
('data_fim', 3),
])
self.helper = SaplFormHelper()
self.helper.layout = Layout(
Fieldset(
_(action_label),
row,
form_actions(label=_(action_label))
)
)
def clean(self):
data = super().clean()
if not self.is_valid():
return data
data_inicio_membro = self.membro.data_inicio
data_fim_membro = self.membro.data_fim
data_inicio = data['data_inicio']
data_fim = data['data_fim']
if data_fim and data_inicio > data_fim:
raise ValidationError(_('A data início no cargo deve ser anterior a data fim.'))
elif data_inicio_membro > data_inicio:
raise ValidationError(_('A data início no cargo deve ser posterior a data início de membro.'))
elif data_fim and data_fim_membro and data_fim > data_fim_membro:
raise ValidationError(_('A data fim no cargo deve ser anterior a data fim de membro.'))
return data
def save(self, commit=False):
data = super().save(commit)
if not self.instance.pk:
cargo, created = CargoMembroBancada.objects.get_or_create(
membro=data.membro,
cargo=data.cargo,
data_inicio=data.data_inicio,
data_fim=data.data_fim)
else:
cargo = CargoMembroBancada.objects.get(pk=self.instance.pk)
cargo.cargo = data.cargo
cargo.data_inicio = data.data_inicio
cargo.data_fim = data.data_fim
cargo.save()
return cargo

136
sapl/parlamentares/migrations/0034_auto_20190604_1220.py

@ -0,0 +1,136 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-06-04 15:20
from __future__ import unicode_literals
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0033_auto_20190712_1132'),
]
operations = [
migrations.CreateModel(
name='CargoMembroBancada',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('data_inicio', models.DateField(verbose_name='Data Início do Membro no Cargo')),
('data_fim', models.DateField(blank=True, null=True, verbose_name='Data Fim do Membro no Cargo')),
],
options={
'verbose_name': 'Cargo Membro Bancada Parlamentar',
'verbose_name_plural': 'Cargos Membros Bancada Parlamentar',
'ordering': ('-data_inicio',),
},
),
migrations.CreateModel(
name='MembroBancada',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('data_inicio', models.DateField(verbose_name='Data Início de Membro')),
('data_fim', models.DateField(blank=True, null=True, verbose_name='Data Fim de Membro')),
],
options={
'verbose_name': 'Membro Bancada Parlamentar',
'verbose_name_plural': 'Membros Bancada Parlamentar',
'ordering': ('parlamentar', '-data_inicio',),
},
),
migrations.AlterModelOptions(
name='bancada',
options={'ordering': ('nome',), 'verbose_name': 'Bancada Parlamentar',
'verbose_name_plural': 'Bancadas Parlamentares'},
),
migrations.AlterModelOptions(
name='cargobancada',
options={'ordering': ('nome_cargo',), 'verbose_name': 'Cargo Bancada Parlamentar',
'verbose_name_plural': 'Cargos Bancada Parlamentar'},
),
migrations.RemoveField(
model_name='bancada',
name='data_criacao',
),
migrations.RemoveField(
model_name='bancada',
name='data_extincao',
),
migrations.RemoveField(
model_name='bancada',
name='legislatura',
),
migrations.RemoveField(
model_name='bancada',
name='partido',
),
migrations.RemoveField(
model_name='cargobancada',
name='cargo_unico',
),
migrations.AddField(
model_name='bancada',
name='ativo',
field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], db_index=True, default=True,
verbose_name='Bancada Parlamentar ativa?'),
),
migrations.AddField(
model_name='cargobancada',
name='descricao',
field=models.TextField(blank=True, verbose_name='Descrição'),
),
migrations.AlterField(
model_name='bancada',
name='nome',
field=models.CharField(max_length=30, verbose_name='Nome da Bancada Parlamentar'),
),
migrations.AlterField(
model_name='cargobancada',
name='nome_cargo',
field=models.CharField(max_length=30, verbose_name='Nome do Cargo'),
),
migrations.AlterModelTable(
name='cargobancada',
table=None,
),
migrations.AddField(
model_name='membrobancada',
name='bancada',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.Bancada',
verbose_name='Bancada Parlamentar'),
),
migrations.AddField(
model_name='membrobancada',
name='legislatura',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.Legislatura',
verbose_name='Legislatura do Membro'),
),
migrations.AddField(
model_name='membrobancada',
name='parlamentar',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.Parlamentar',
verbose_name='Parlamentar'),
),
migrations.AddField(
model_name='cargomembrobancada',
name='cargo',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.CargoBancada',
verbose_name='Cargo do Membro'),
),
migrations.AddField(
model_name='cargomembrobancada',
name='membro',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.MembroBancada',
verbose_name='Membro no Cargo'),
),
migrations.AlterModelOptions(
name='cargobancada',
options={'ordering': ('nome',), 'verbose_name': 'Cargo Bancada Parlamentar',
'verbose_name_plural': 'Cargos Bancada Parlamentar'},
),
migrations.RenameField(
model_name='cargobancada',
old_name='nome_cargo',
new_name='nome',
),
]

160
sapl/parlamentares/models.py

@ -659,41 +659,6 @@ class Bloco(models.Model):
return self.nome
@reversion.register()
class Bancada(models.Model):
legislatura = models.ForeignKey(Legislatura,
on_delete=models.PROTECT,
verbose_name=_('Legislatura'))
nome = models.CharField(
max_length=80,
verbose_name=_('Nome da Bancada'))
partido = models.ForeignKey(Partido,
blank=True,
null=True,
on_delete=models.PROTECT,
verbose_name=_('Partido'))
data_criacao = models.DateField(blank=False, null=True,
verbose_name=_('Data Criação'))
data_extincao = models.DateField(blank=True, null=True,
verbose_name=_('Data Extinção'))
descricao = models.TextField(blank=True, verbose_name=_('Descrição'))
# 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.
autor = SaplGenericRelation(Autor, related_query_name='bancada_set',
fields_search=(
('nome', '__icontains'),
('descricao', '__icontains'),
('partido__sigla', '__icontains'),
('partido__nome', '__icontains'),
))
class Meta:
db_table = 'parlamentares_bancada'
verbose_name = _('Bancada Parlamentar')
verbose_name_plural = _('Bancadas Parlamentares')
ordering = ('-legislatura__numero', )
class CargoBloco(models.Model):
class Meta:
verbose_name = _('Cargo de Bloco')
@ -710,24 +675,6 @@ class CargoBloco(models.Model):
return self.nome
@reversion.register()
class CargoBancada(models.Model):
nome_cargo = models.CharField(max_length=80,
verbose_name=_('Cargo de Bancada'))
cargo_unico = models.BooleanField(default=False,
choices=YES_NO_CHOICES,
verbose_name=_('Cargo Único ?'))
class Meta:
db_table = 'parlamentares_cargobancada'
verbose_name = _('Cargo de Bancada')
verbose_name_plural = _('Cargos de Bancada')
def __str__(self):
return self.nome_cargo
class CargoBlocoPartido(models.Model):
class Meta:
verbose_name = _('Vinculo bloco parlamentar')
@ -748,3 +695,110 @@ class CargoBlocoPartido(models.Model):
data_inicio = models.DateField(verbose_name=_('Data Início'))
data_fim = models.DateField(blank=True, null=True, verbose_name=_('Data Fim'))
class Bancada(models.Model):
nome = models.CharField(
max_length=30,
verbose_name=_('Nome da Bancada Parlamentar'))
descricao = models.TextField(
blank=True,
verbose_name=_('Descrição'))
ativo = models.BooleanField(
db_index=True,
default=True,
choices=YES_NO_CHOICES,
verbose_name=_('Bancada Parlamentar ativa?'))
# 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.
autor = SaplGenericRelation(
Autor,
related_query_name='bancada_set',
fields_search=(
('nome', '__icontains'),
('descricao', '__icontains'),
('partido__sigla', '__icontains'),
('partido__nome', '__icontains'),)
)
class Meta:
db_table = 'parlamentares_bancada'
verbose_name = _('Bancada Parlamentar')
verbose_name_plural = _('Bancadas Parlamentares')
ordering = ('nome', )
def __str__(self):
return self.nome
class MembroBancada(models.Model):
parlamentar = models.ForeignKey(
Parlamentar,
on_delete=models.CASCADE,
verbose_name=_('Parlamentar'))
bancada = models.ForeignKey(
Bancada,
on_delete=models.CASCADE,
verbose_name=_('Bancada Parlamentar'))
data_inicio = models.DateField(
verbose_name=_('Data Início de Membro'))
data_fim = models.DateField(
verbose_name=_('Data Fim de Membro'),
blank=True,
null=True)
legislatura = models.ForeignKey(
Legislatura,
on_delete=models.CASCADE,
verbose_name=_('Legislatura do Membro'))
class Meta:
verbose_name = _('Membro Bancada Parlamentar')
verbose_name_plural = _('Membros Bancada Parlamentar')
ordering = ('parlamentar', '-data_inicio', )
def __str__(self):
return '{} - {}'.format(self.parlamentar, self.bancada)
class CargoBancada(models.Model):
nome = models.CharField(
max_length=30,
verbose_name=_('Nome do Cargo'))
descricao = models.TextField(
blank=True,
verbose_name=_('Descrição'))
class Meta:
verbose_name = _('Cargo Bancada Parlamentar')
verbose_name_plural = _('Cargos Bancada Parlamentar')
ordering = ('nome', )
def __str__(self):
return self.nome
class CargoMembroBancada(models.Model):
cargo = models.ForeignKey(
CargoBancada,
on_delete=models.CASCADE,
verbose_name=_('Cargo do Membro'))
membro = models.ForeignKey(
MembroBancada,
on_delete=models.CASCADE,
verbose_name=_('Membro no Cargo'))
data_inicio = models.DateField(
verbose_name=_('Data Início do Membro no Cargo'))
data_fim = models.DateField(
verbose_name=_('Data Fim do Membro no Cargo'),
blank=True,
null=True)
class Meta:
verbose_name = _('Cargo Membro Bancada Parlamentar')
verbose_name_plural = _('Cargos Membros Bancada Parlamentar')
ordering = ('-data_inicio', )
def __str__(self):
return '{} - {}'.format(self.cargo, self.membro)

41
sapl/parlamentares/tests/test_parlamentares.py

@ -362,49 +362,16 @@ def test_valida_campos_obrigatorios_bancada_form():
errors = form.errors
assert errors['legislatura'] == [_('Este campo é obrigatório.')]
assert errors['nome'] == [_('Este campo é obrigatório.')]
assert errors['data_criacao'] == [_('Este campo é obrigatório.')]
assert len(errors) == 3
def data(valor):
return datetime.strptime(valor, '%Y-%m-%d').date()
assert len(errors) == 1
@pytest.mark.django_db(transaction=False)
def test_bancada_form_valido():
legislatura = mommy.make(Legislatura,
data_inicio=data('2017-11-10'),
data_fim=data('2017-12-31'),
)
partido = mommy.make(Partido)
form = forms.BancadaForm(data={'legislatura': str(legislatura.pk),
'nome': 'Nome da Bancada',
'partido': str(partido.pk),
'data_criacao': '10/11/2017',
'data_extincao': '10/12/2017',
'descricao': 'teste'
form = forms.BancadaForm(data={'nome': 'Nome da Bancada',
'descricao': 'teste',
'ativo': True
})
assert form.is_valid()
@pytest.mark.django_db(transaction=False)
def test_bancada_form_datas_invalidas():
legislatura = mommy.make(Legislatura,
data_inicio=data('2017-11-10'),
data_fim=data('2017-12-31'),
)
partido = mommy.make(Partido)
form = forms.BancadaForm(data={'legislatura': str(legislatura.pk),
'nome': 'Nome da Bancada',
'partido': str(partido.pk),
'data_criacao': '2016-11-01',
'data_extincao': '2016-10-01',
'descricao': 'teste'
})
assert not form.is_valid()

33
sapl/parlamentares/urls.py

@ -28,13 +28,18 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
edita_vinculo_parlamentar_bloco,
deleta_vinculo_parlamentar_bloco,
vincula_parlamentar_ao_bloco,
get_sessoes_legislatura)
get_sessoes_legislatura,
MembroBancadaCreate, MembroBancadaDetail,
MembroBancadaUpdate, MembroBancadaDelete,
CargoMembroBancadaCreate, CargoMembroBancadaDetail,
CargoMembroBancadaUpdate, CargoMembroBancadaDelete)
from .apps import AppConfig
app_name = AppConfig.name
urlpatterns = [
url(r'^parlamentar/', include(
ParlamentarCrud.get_urls() + DependenteCrud.get_urls() +
@ -79,6 +84,32 @@ urlpatterns = [
url(r'^sistema/deleta-vinculo-parlamentar-bloco/(?P<pk>\d+)/',
deleta_vinculo_parlamentar_bloco,name='deleta-vinculo-parlamentar-bloco'),
url(r'^sistema/bancada/(?P<pk>\d+)/membro/create/$',
MembroBancadaCreate.as_view(),
name='membrobancada_create'),
url(r'^sistema/bancada/(?P<bancada_pk>\d+)/membro/(?P<pk>\d+)/$',
MembroBancadaDetail.as_view(),
name='membrobancada_detail'),
url(r'^sistema/bancada/(?P<bancada_pk>\d+)/membro/(?P<pk>\d+)/update/$',
MembroBancadaUpdate.as_view(),
name='membrobancada_update'),
url(r'^sistema/bancada/(?P<bancada_pk>\d+)/membro/(?P<pk>\d+)/delete/$',
MembroBancadaDelete.as_view(),
name='membrobancada_delete'),
url(r'^sistema/bancada/(?P<bancada_pk>\d+)/membro/(?P<pk>\d+)/cargo/create/$',
CargoMembroBancadaCreate.as_view(),
name='cargomembrobancada_create'),
url(r'^sistema/bancada/(?P<bancada_pk>\d+)/membro/(?P<membro_pk>\d+)/cargo/(?P<pk>\d+)/$',
CargoMembroBancadaDetail.as_view(),
name='cargomembrobancada_detail'),
url(r'^sistema/bancada/(?P<bancada_pk>\d+)/membro/(?P<membro_pk>\d+)/cargo/(?P<pk>\d+)/update/$',
CargoMembroBancadaUpdate.as_view(),
name='cargomembrobancada_update'),
url(r'^sistema/bancada/(?P<bancada_pk>\d+)/membro/(?P<membro_pk>\d+)/cargo/(?P<pk>\d+)/delete/$',
CargoMembroBancadaDelete.as_view(),
name='cargomembrobancada_delete'),
url(r'^sistema/frente/',
include(FrenteCrud.get_urls())),
url(r'^sistema/frente/atualiza-lista-parlamentares',

132
sapl/parlamentares/views.py

@ -1,6 +1,6 @@
from datetime import datetime
import json
import logging
from datetime import datetime
from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin
@ -17,12 +17,11 @@ from django.utils import timezone
from django.utils.datastructures import MultiValueDictKeyError
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.generic import FormView
from django.views.generic.edit import UpdateView
from django.views.generic import FormView, DetailView
from django.views.generic.edit import UpdateView, CreateView, DeleteView
from django_filters.views import FilterView
from image_cropping.utils import get_backend
from sapl.base.forms import SessaoLegislativaForm, PartidoForm, PartidoUpdateForm
from sapl.base.models import Autor
from sapl.comissoes.models import Participacao
@ -32,15 +31,13 @@ from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux,
from sapl.materia.models import Autoria, Proposicao, Relatoria
from sapl.parlamentares.apps import AppConfig
from sapl.utils import (parlamentares_ativos, show_results_filter_set)
from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm,
ParlamentarCreateForm, ParlamentarForm, VotanteForm,
ParlamentarFilterSet, VincularParlamentarForm,
BlocoForm, CargoBlocoForm, CargoBlocoPartidoForm,
BancadaForm)
BancadaForm, MembroBancadaForm, CargoMembroBancadaForm)
from .models import (Bancada, CargoBancada, CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
from .models import (Bancada, MembroBancada, CargoMembroBancada, CargoBancada, CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
Dependente, Filiacao, Frente, Legislatura, Mandato,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
SituacaoMilitar, TipoAfastamento, TipoDependente, Votante,
@ -121,6 +118,125 @@ class BancadaCrud(CrudAux):
def get_success_url(self):
return reverse('sapl.parlamentares:bancada_list')
class DetailView(CrudAux.DetailView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
membros = []
for membro in Bancada.objects.get(pk=self.kwargs['pk']).membrobancada_set.all():
membros.append({
'pk': membro.pk,
'nome': membro.parlamentar.nome_parlamentar,
'ativo': 'Não' if membro.data_fim else 'Sim',
})
context.update({
'qntd': len(membros),
'membros': membros,
'bancada_pk': self.kwargs['pk'],
})
return context
class MembroBancadaCreate(CreateView):
template_name = 'parlamentares/membrobancada_create.html'
form_class = MembroBancadaForm
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs.update({'bancada': Bancada.objects.get(pk=self.kwargs['pk'])})
return kwargs
def get_success_url(self):
return reverse_lazy('sapl.parlamentares:bancada_detail',
kwargs={'pk': self.kwargs['pk']})
class MembroBancadaDetail(DetailView):
model = MembroBancada
template_name = 'parlamentares/membrobancada_detail.html'
form_class = MembroBancadaForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
cargos = CargoMembroBancada.objects.filter(membro__pk=self.kwargs['pk'])
context.update({
'qntd': len(cargos),
'cargos': cargos,
})
return context
class MembroBancadaUpdate(UpdateView):
model = MembroBancada
template_name = 'parlamentares/membrobancada_update.html'
form_class = MembroBancadaForm
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs.update({'bancada': Bancada.objects.get(pk=self.kwargs['bancada_pk'])})
return kwargs
def get_success_url(self):
return reverse_lazy('sapl.parlamentares:membrobancada_detail',
kwargs={'bancada_pk': self.kwargs['bancada_pk'], 'pk': self.kwargs['pk']})
class MembroBancadaDelete(DeleteView):
model = MembroBancada
template_name = 'parlamentares/membrobancada_delete.html'
form_class = MembroBancadaForm
def get_success_url(self):
return reverse_lazy('sapl.parlamentares:bancada_detail',
kwargs={'pk': self.kwargs['pk']})
class CargoMembroBancadaCreate(CreateView):
template_name = 'parlamentares/cargomembrobancada_create.html'
form_class = CargoMembroBancadaForm
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs.update({'membro': MembroBancada.objects.get(pk=self.kwargs['pk'])})
return kwargs
def get_success_url(self):
return reverse_lazy('sapl.parlamentares:membrobancada_detail',
kwargs={'bancada_pk': self.kwargs['bancada_pk'], 'pk': self.kwargs['pk']})
class CargoMembroBancadaDetail(DetailView):
model = CargoMembroBancada
template_name = 'parlamentares/cargomembrobancada_detail.html'
form_class = CargoMembroBancadaForm
class CargoMembroBancadaUpdate(UpdateView):
model = CargoMembroBancada
template_name = 'parlamentares/cargomembrobancada_update.html'
form_class = CargoMembroBancadaForm
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs.update({'membro': MembroBancada.objects.get(pk=self.kwargs['membro_pk'])})
return kwargs
def get_success_url(self):
return reverse_lazy('sapl.parlamentares:cargomembrobancada_detail',
kwargs={'bancada_pk': self.kwargs['bancada_pk'], 'membro_pk': self.kwargs['pk'],
'pk': self.kwargs['pk']})
class CargoMembroBancadaDelete(DeleteView):
model = CargoMembroBancada
template_name = 'parlamentares/cargomembrobancada_delete.html'
form_class = CargoMembroBancadaForm
def get_success_url(self):
return reverse_lazy('sapl.parlamentares:membrobancada_detail',
kwargs={'bancada_pk': self.kwargs['bancada_pk'], 'pk': self.kwargs['pk']})
class FrenteList(MasterDetailCrud):
model = Frente

2
sapl/rules/map_rules.py

@ -283,7 +283,9 @@ rules_group_geral = {
(parlamentares.Frente, __base__, __perms_publicas__),
(parlamentares.Votante, __base__, __perms_publicas__),
(parlamentares.Bancada, __base__, __perms_publicas__),
(parlamentares.MembroBancada, __base__, __perms_publicas__),
(parlamentares.CargoBancada, __base__, __perms_publicas__),
(parlamentares.CargoMembroBancada, __base__, __perms_publicas__),
(parlamentares.Bloco, __base__, __perms_publicas__),
(parlamentares.CargoBloco, __base__, __perms_publicas__),
(parlamentares.CargoBlocoPartido, __base__, __perms_publicas__),

36
sapl/templates/parlamentares/bancada_detail.html

@ -0,0 +1,36 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load common_tags %}
{% block extra_actions %}
<div class="actions btn-group btn-group-sm" role="group">
<a href="{% url 'sapl.parlamentares:membrobancada_create' bancada_pk %}" class="btn btn-outline-primary">Adicionar Membro a Bancada</a>
</div>
{% endblock extra_actions %}
{% block table_content %}
<br>
<h2 class="legend">Membros</h2>
{% if membros %}
<div class="result-count">Total de Membros: <b>{{ qntd }}</b></div>
<table class="table table-striped table-hover table-link-ordering">
<thead>
<tr>
<th style="text-align:center;">Parlamentar</th>
<th style="text-align:center;">Ativo?</th>
</tr>
</thead>
</tbodybody>
{% for membro in membros %}
<tr>
<td style="text-align:center;"><a href="{% url 'sapl.parlamentares:membrobancada_detail' bancada_pk membro.pk %}">{{ membro.nome }}</a></td>
<td style="text-align:center;">{{ membro.ativo }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>Nenhum membro encontrado.</p>
{% endif %}
<br>
{% endblock table_content %}

1
sapl/templates/parlamentares/cargomembrobancada_create.html

@ -0,0 +1 @@
{% extends "crud/form.html" %}

3
sapl/templates/parlamentares/cargomembrobancada_delete.html

@ -0,0 +1,3 @@
{% extends "crud/confirm_delete.html" %}
{% block sections_nav %}{% endblock sections_nav %}

81
sapl/templates/parlamentares/cargomembrobancada_detail.html

@ -0,0 +1,81 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load common_tags %}
{% block sections_nav %}{% endblock sections_nav %}
{% block title %}<h1 class="page-header">Cargo {{ object.cargo }}</h1>{% endblock title %}
{% block extra_actions %}
<div class="actions btn-group btn-group-sm" role="group">
<a href="{% url 'sapl.parlamentares:membrobancada_detail' object.membro.bancada.pk object.membro.pk %}"
class="btn btn-outline-primary">Voltar</a>
</div>
{% endblock extra_actions %}
{% block editions %}
<div class="actions btn-group" role="group">
<a href="{% url 'sapl.parlamentares:cargomembrobancada_update' object.membro.bancada.pk object.membro.pk object.pk %}" class="btn btn-outline-primary">Editar</a>
<a href="" class="btn btn-outline-primary btn-outline-danger">Excluir</a>
</div>
{% endblock editions %}
{% block detail_content %}
<h2 class="legend">Cargo</h2>
<div class="row">
<div class="col">
<p class="control-label">Nome do Membro da Bancada Parlamentar</p>
</div>
<div class="col">
<p class="control-label">Data Início de Membro</p>
</div>
<div class="col">
<p class="control-label">Data Fim de Membro</p>
</div>
</div>
<div class="row">
<div class="col">
<div class="form-control-static">
<a href="{% url 'sapl.parlamentares:membrobancada_detail' object.membro.bancada.pk object.membro.pk %}">{{ object.membro.parlamentar }}</a>
</div>
</div>
<div class="col">
<div class="form-control-static">
{{ object.membro.data_inicio }}
</div>
</div>
<div class="col">
<div class="form-control-static">
{% if object.membro.data_fim %}{{ object.membro.data_fim }}{% else %}-{% endif %}
</div>
</div>
</div>
<div class="row">
<div class="col">
<p class="control-label">Nome do Cargo da Bancada Parlamentar</p>
</div>
<div class="col">
<p class="control-label">Data Início no Cargo</p>
</div>
<div class="col">
<p class="control-label">Data Fim no Cargo</p>
</div>
</div>
<div class="row">
<div class="col">
<div class="form-control-static">
<a href="{% url 'sapl.parlamentares:cargobancada_detail' object.cargo.pk %}">{{ object.cargo }}</a>
</div>
</div>
<div class="col">
<div class="form-control-static">
{{ object.data_inicio }}
</div>
</div>
<div class="col">
<div class="form-control-static">
{% if object.data_fim %}{{ object.data_fim }}{% else %}-{% endif %}
</div>
</div>
</div>
{% endblock detail_content %}

3
sapl/templates/parlamentares/cargomembrobancada_update.html

@ -0,0 +1,3 @@
{% extends "crud/form.html" %}
{% block sections_nav %}{% endblock sections_nav %}

7
sapl/templates/parlamentares/layouts.yaml

@ -118,14 +118,13 @@ ComposicaoColigacao:
Bancada:
{% trans 'Bancada' %}:
- legislatura
- nome partido
- data_criacao data_extincao
- nome:9 ativo
- descricao
CargoBancada:
{% trans 'Cargo de Bancada' %}:
- nome_cargo:8 cargo_unico
- nome
- descricao
Frente:
{% trans 'Frente' %}:

1
sapl/templates/parlamentares/membrobancada_create.html

@ -0,0 +1 @@
{% extends "crud/form.html" %}

3
sapl/templates/parlamentares/membrobancada_delete.html

@ -0,0 +1,3 @@
{% extends "crud/confirm_delete.html" %}
{% block sections_nav %}{% endblock sections_nav %}

105
sapl/templates/parlamentares/membrobancada_detail.html

@ -0,0 +1,105 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load common_tags %}
{% block sections_nav %}{% endblock sections_nav %}
{% block title %}<h1 class="page-header">Membro {{ object.parlamentar }}</h1>{% endblock title %}
{% block extra_actions %}
<div class="actions btn-group btn-group-sm" role="group">
<a href="{% url 'sapl.parlamentares:bancada_detail' object.bancada.pk %}"
class="btn btn-outline-primary">Voltar</a>
<a href="{% url 'sapl.parlamentares:cargomembrobancada_create' object.bancada.pk object.pk %}"
class="btn btn-outline-primary">Adicionar Cargo</a>
</div>
{% endblock extra_actions %}
{% block editions %}
<div class="actions btn-group" role="group">
<a href="{% url 'sapl.parlamentares:membrobancada_update' object.bancada.pk object.pk %}"
class="btn btn-outline-primary">Editar</a>
<a href="{% url 'sapl.parlamentares:membrobancada_delete' object.bancada.pk object.pk %}"
class="btn btn-outline-primary btn-outline-danger">Excluir</a>
</div>
{% endblock editions %}
{% block detail_content %}
<h2 class="legend">Membro</h2>
<div class="row">
<div class="col-8">
<p class="control-label">Nome do Membro da Bancada Parlamentar</p>
</div>
<div class="col-4">
<p class="control-label">Bancada Parlamentar</p>
</div>
</div>
<div class="row">
<div class="col-8">
<div class="form-control-static">
<a href="{% url 'sapl.parlamentares:parlamentar_detail' object.parlamentar.pk %}">{{ object.parlamentar }}</a>
</div>
</div>
<div class="col-4">
<div class="form-control-static">
<a href="{% url 'sapl.parlamentares:bancada_detail' object.bancada.pk %}">{{ object.bancada }}</a>
</div>
</div>
</div>
<div class="row">
<div class="col">
<p class="control-label">Legislatura</p>
</div>
<div class="col">
<p class="control-label">Data Início de Membro</p>
</div>
<div class="col">
<p class="control-label">Data Fim de Membro</p>
</div>
</div>
<div class="row">
<div class="col">
<div class="form-control-static">
<a href="{% url 'sapl.parlamentares:legislatura_detail' object.legislatura.pk %}">{{ object.legislatura }}</a>
</div>
</div>
<div class="col">
<div class="form-control-static">
{{ object.data_inicio }}
</div>
</div>
<div class="col">
<div class="form-control-static">
{% if object.data_fim %}{{ object.data_fim }}{% else %}-{% endif %}
</div>
</div>
</div>
{% endblock detail_content %}
{% block table_content %}
<br>
<h2 class="legend">Cargos</h2>
{% if cargos %}
<div class="result-count">Total de Cargos: <b>{{ qntd }}</b></div>
<table class="table table-striped table-hover table-link-ordering">
<thead>
<tr>
<th style="text-align:center;">Cargo</th>
<th style="text-align:center;">Data Início no Cargo</th>
<th style="text-align:center;">Data Fim no Cargo</th>
</tr>
</thead>
</tbodybody>
{% for cargo in cargos %}
<tr>
<td style="text-align:center;"><a href="{% url 'sapl.parlamentares:cargomembrobancada_detail' object.bancada.pk cargo.membro.pk cargo.cargo.pk %}">{{ cargo.cargo }}</a></td>
<td style="text-align:center;">{{ cargo.data_inicio }}</td>
<td style="text-align:center;">{% if cargo.data_fim %}{{ cargo.data_fim }}{% else %}-{% endif %}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>Nenhum cargo encontrado.</p>
{% endif %}
<br>
{% endblock table_content %}

3
sapl/templates/parlamentares/membrobancada_update.html

@ -0,0 +1,3 @@
{% extends "crud/form.html" %}
{% block sections_nav %}{% endblock sections_nav %}

215
scripts/popula_bancada.py

@ -0,0 +1,215 @@
from datetime import datetime
from sapl.parlamentares.models import Bancada, MembroBancada, Parlamentar, Legislatura, CargoBancada, CargoMembroBancada
def main():
popula_bancada()
popula_membro_bancada()
popula_cargo_bancada()
popula_cargo_membro_bancada()
def popula_bancada():
Bancada.objects.create(
nome='Bancada 1',
descricao='Descrição da Bancada 1.',
ativo=True)
Bancada.objects.create(
nome='Bancada 2',
descricao='Descrição da Bancada 2.',
ativo=False)
Bancada.objects.create(
nome='Bancada 3',
descricao='Descrição da Bancada 3.',
ativo=True)
def popula_membro_bancada():
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[0],
bancada=Bancada.objects.get(nome='Bancada 1'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[1],
bancada=Bancada.objects.get(nome='Bancada 1'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[2],
bancada=Bancada.objects.get(nome='Bancada 1'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[3],
bancada=Bancada.objects.get(nome='Bancada 1'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[4],
bancada=Bancada.objects.get(nome='Bancada 1'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[5],
bancada=Bancada.objects.get(nome='Bancada 2'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[6],
bancada=Bancada.objects.get(nome='Bancada 2'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[7],
bancada=Bancada.objects.get(nome='Bancada 2'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[8],
bancada=Bancada.objects.get(nome='Bancada 2'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[9],
bancada=Bancada.objects.get(nome='Bancada 2'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[10],
bancada=Bancada.objects.get(nome='Bancada 3'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[11],
bancada=Bancada.objects.get(nome='Bancada 3'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[12],
bancada=Bancada.objects.get(nome='Bancada 3'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[13],
bancada=Bancada.objects.get(nome='Bancada 3'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
MembroBancada.objects.create(
parlamentar=Parlamentar.objects.all()[14],
bancada=Bancada.objects.get(nome='Bancada 3'),
data_inicio='2018-1-1',
data_fim='2019-12-31',
legislatura=Legislatura.objects.first())
def popula_cargo_bancada():
CargoBancada.objects.create(
nome='Cargo 1',
descricao='Descrição do Cargo 1.')
CargoBancada.objects.create(
nome='Cargo 2',
descricao='Descrição do Cargo 2.')
CargoBancada.objects.create(
nome='Cargo 3',
descricao='Descrição do Cargo 3.')
def popula_cargo_membro_bancada():
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[0]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[1]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[2]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[3]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[4]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[5]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[6]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[7]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[8]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[9]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[10]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[11]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 1'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[12]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 2'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[13]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
CargoMembroBancada.objects.create(
cargo=CargoBancada.objects.get(nome='Cargo 3'),
membro=MembroBancada.objects.get(parlamentar=Parlamentar.objects.all()[14]),
data_inicio='2018-1-30',
data_fim='2019-5-31')
if __name__ == '__main__':
main()
Loading…
Cancel
Save