Browse Source

Adiciona Cargo para Bloco Parlamentar (#3284)

Adiciona vínculo de Parlamentar com Cargo de Bloco
pull/3257/merge
Vinícius Cantuária 4 years ago
committed by GitHub
parent
commit
522769dcdb
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 30
      sapl/parlamentares/forms.py
  2. 52
      sapl/parlamentares/migrations/0033_bloco_blococargo_blocomembro.py
  3. 64
      sapl/parlamentares/models.py
  4. 9
      sapl/parlamentares/urls.py
  5. 50
      sapl/parlamentares/views.py
  6. 2
      sapl/rules/map_rules.py
  7. 3
      sapl/templates/menu_tabelas_auxiliares.yaml
  8. 9
      sapl/templates/parlamentares/bloco_detail.html
  9. 9
      sapl/templates/parlamentares/blocomembro_list.html
  10. 18
      sapl/templates/parlamentares/layouts.yaml

30
sapl/parlamentares/forms.py

@ -23,7 +23,7 @@ from sapl.rules import SAPL_GROUP_VOTANTE
import django_filters
from .models import (Coligacao, ComposicaoColigacao, Filiacao, Frente, Legislatura,
Mandato, Parlamentar, Partido, Votante, Bloco, FrenteParlamentar)
Mandato, Parlamentar, Partido, Votante, Bloco, FrenteParlamentar, BlocoMembro)
class ImageThumbnailFileInput(ClearableFileInput):
@ -702,4 +702,30 @@ class BlocoForm(ModelForm):
tipo=tipo,
nome=bloco.nome
)
return bloco
return bloco
class BlocoMembroForm(ModelForm):
logger = logging.getLogger(__name__)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['bloco'].widget = forms.HiddenInput()
class Meta:
model = BlocoMembro
fields = '__all__'
def clean(self):
cd = super().clean()
if not self.is_valid():
return self.cleaned_data
if cd['cargo'].cargo_unico \
and BlocoMembro.objects.filter(bloco=cd['bloco'], cargo=cd['cargo'], data_saida__isnull=True)\
.exclude(pk=self.instance.pk).exists():
raise ValidationError(_("Cargo único já ocupado por outro membro."))
elif not cd['data_saida'] and BlocoMembro.objects.filter(parlamentar=cd['parlamentar'], data_saida__isnull=True).exists():
raise ValidationError(_("Parlamentar já é membro do bloco parlamentar."))
return cd

52
sapl/parlamentares/migrations/0033_bloco_blococargo_blocomembro.py

@ -0,0 +1,52 @@
# Generated by Django 2.2.13 on 2020-10-05 13:15
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0032_frente_parlamentar'),
]
operations = [
migrations.CreateModel(
name='BlocoCargo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nome_cargo', models.CharField(max_length=120, verbose_name='Cargo do bloco parlamentar')),
('cargo_unico', models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Cargo único?')),
],
options={
'verbose_name': 'Cargo de Bloco Parlamentar',
'verbose_name_plural': 'Cargos de Bloco Parlamentar',
'ordering': ('cargo_unico', 'nome_cargo'),
},
),
migrations.AlterModelOptions(
name='bloco',
options={'ordering': ('partidos__nome', 'nome'), 'verbose_name': 'Bloco Parlamentar', 'verbose_name_plural': 'Blocos Parlamentares'},
),
migrations.AlterField(
model_name='bloco',
name='nome',
field=models.CharField(max_length=120, verbose_name='Nome do Bloco'),
),
migrations.CreateModel(
name='BlocoMembro',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('data_entrada', models.DateField(verbose_name='Data Entrada')),
('data_saida', models.DateField(blank=True, null=True, verbose_name='Data Saída')),
('bloco', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.Bloco', verbose_name='Bloco parlamentar')),
('cargo', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.BlocoCargo', verbose_name='Cargo na bloco parlamentar')),
('parlamentar', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.Parlamentar', verbose_name='Parlamentar')),
],
options={
'verbose_name': 'Membro de bloco parlamentar',
'verbose_name_plural': 'Membros de bloco parlamentar',
'ordering': ('bloco', 'parlamentar', 'cargo'),
},
),
]

64
sapl/parlamentares/models.py

@ -634,14 +634,21 @@ class Bloco(models.Model):
* blocos podem existir por mais de uma legislatura
'''
nome = models.CharField(
max_length=80, verbose_name=_('Nome do Bloco'))
max_length=120,
verbose_name=_('Nome do Bloco'))
partidos = models.ManyToManyField(
Partido, blank=True, verbose_name=_('Partidos'))
Partido,
blank=True,
verbose_name=_('Partidos'))
data_criacao = models.DateField(
blank=False, null=True, verbose_name=_('Data Criação'))
blank=False, null=True,
verbose_name=_('Data Criação'))
data_extincao = models.DateField(
blank=True, null=True, verbose_name=_('Data Dissolução'))
descricao = models.TextField(blank=True, verbose_name=_('Descrição'))
blank=True, null=True,
verbose_name=_('Data Dissoluçã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.
@ -661,3 +668,50 @@ class Bloco(models.Model):
def __str__(self):
return self.nome
@reversion.register()
class BlocoCargo(models.Model):
nome_cargo = models.CharField(
max_length=120,
verbose_name=_('Cargo do bloco parlamentar'))
cargo_unico = models.BooleanField(
default=False,
choices=YES_NO_CHOICES,
verbose_name=_('Cargo único?'))
class Meta:
verbose_name = _('Cargo de Bloco Parlamentar')
verbose_name_plural = _('Cargos de Bloco Parlamentar')
ordering = ('cargo_unico', 'nome_cargo',)
def __str__(self):
return f"{self.nome_cargo}"
@reversion.register()
class BlocoMembro(models.Model):
bloco = models.ForeignKey(
Bloco,
verbose_name=_('Bloco parlamentar'),
on_delete=models.CASCADE)
parlamentar = models.ForeignKey(
Parlamentar,
verbose_name=_('Parlamentar'),
on_delete=models.CASCADE)
cargo = models.ForeignKey(
BlocoCargo,
verbose_name=_('Cargo na bloco 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 = _('Membro de bloco parlamentar')
verbose_name_plural = _('Membros de bloco parlamentar')
ordering = ('bloco', 'parlamentar', 'cargo')
def __str__(self):
return f"{self.parlamentar} - {self.cargo.nome_cargo} - {self.bloco}"

9
sapl/parlamentares/urls.py

@ -22,7 +22,8 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
parlamentares_filiados, BlocoCrud,
PesquisarParlamentarView, VincularParlamentarView,
get_sessoes_legislatura, FrenteCargoCrud, FrenteParlamentarCrud,
get_parlamentar_frentes, PesquisarColigacaoView, PesquisarPartidoView)
get_parlamentar_frentes, PesquisarColigacaoView, PesquisarPartidoView,
BlocoCargoCrud, BlocoMembroCrud)
from .apps import AppConfig
@ -55,6 +56,12 @@ urlpatterns = [
url(r'^sistema/bloco/', include(BlocoCrud.get_urls())),
url(r'^sistema/coligacao/', include(ColigacaoCrud.get_urls() + ComposicaoColigacaoCrud.get_urls())),
url(r'^sistema/bloco/', include(BlocoCrud.get_urls())),
url(r'^sistema/bloco-cargo/', include(BlocoCargoCrud.get_urls())),
url(r'^sistema/bloco-membros/', include(BlocoMembroCrud.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())),

50
sapl/parlamentares/views.py

@ -36,24 +36,24 @@ from sapl.utils import (parlamentares_ativos, show_results_filter_set)
from .forms import (ColigacaoFilterSet, FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm,
ParlamentarCreateForm, ParlamentarForm, VotanteForm,
ParlamentarFilterSet, PartidoFilterSet, VincularParlamentarForm,
BlocoForm, FrenteParlamentarForm)
BlocoForm, FrenteParlamentarForm, BlocoMembroForm)
from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
Dependente, Filiacao, Frente, Legislatura, Mandato,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
SituacaoMilitar, TipoAfastamento, TipoDependente, Votante,
Bloco, FrenteCargo, FrenteParlamentar)
Bloco, FrenteCargo, FrenteParlamentar, BlocoCargo, BlocoMembro)
FrenteCargoCrud = CrudAux.build(FrenteCargo, 'frente_cargo')
BlocoCargoCrud = CrudAux.build(BlocoCargo, 'bloco_cargo')
CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa')
TipoDependenteCrud = CrudAux.build(TipoDependente, 'tipo_dependente')
NivelInstrucaoCrud = CrudAux.build(NivelInstrucao, 'nivel_instrucao')
TipoAfastamentoCrud = CrudAux.build(TipoAfastamento, 'tipo_afastamento')
TipoMilitarCrud = CrudAux.build(SituacaoMilitar, 'tipo_situa_militar')
DependenteCrud = MasterDetailCrud.build(
Dependente, 'parlamentar', 'dependente')
DependenteCrud = MasterDetailCrud.build(Dependente, 'parlamentar', 'dependente')
class SessaoLegislativaCrud(CrudAux):
@ -1283,6 +1283,48 @@ class BlocoCrud(CrudAux):
return reverse('sapl.parlamentares:bloco_list')
class BlocoMembroCrud(MasterDetailCrud):
model = BlocoMembro
parent_field = 'bloco'
help_topic = 'bloco_membros'
public = [RP_LIST, RP_DETAIL]
class CreateView(MasterDetailCrud.CreateView):
form_class = BlocoMembroForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['subnav_template_name'] = ''
return context
def get_initial(self):
self.initial['bloco'] = Bloco.objects.get(pk=self.kwargs['pk'])
return self.initial
class UpdateView(MasterDetailCrud.UpdateView):
form_class = BlocoMembroForm
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 = 'BlocoMembroList'
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_sessoes_legislatura(request):
legislatura_id = request.GET['legislatura']

2
sapl/rules/map_rules.py

@ -286,6 +286,8 @@ rules_group_geral = {
(parlamentares.FrenteParlamentar, __base__, __perms_publicas__),
(parlamentares.Votante, __base__, __perms_publicas__),
(parlamentares.Bloco, __base__, __perms_publicas__),
(parlamentares.BlocoCargo, __base__, __perms_publicas__),
(parlamentares.BlocoMembro, __base__, __perms_publicas__),
(sessao.CargoBancada, __base__, __perms_publicas__),

3
sapl/templates/menu_tabelas_auxiliares.yaml

@ -92,6 +92,9 @@
- title: {% trans 'Bloco Parlamentar' %}
url: sapl.parlamentares:bloco_list
css_class: btn btn-link
- title: {% trans 'Cargo de Bloco Parlamentar' %}
url: sapl.parlamentares:blococargo_list
css_class: btn btn-link
- title: {% trans 'Módulo Proposições' %}
css_class: head_title
children:

9
sapl/templates/parlamentares/bloco_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:blocomembro_list' object.pk %}" class="btn btn-outline-primary">Listar Membros Filiados</a>
</div>
{% endblock actions %}

9
sapl/templates/parlamentares/blocomembro_list.html

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

18
sapl/templates/parlamentares/layouts.yaml

@ -148,4 +148,20 @@ Bloco:
- nome
- data_criacao data_extincao
- partidos
- descricao
- descricao
BlocoCargo:
{% trans 'Cargo' %}:
- nome_cargo cargo_unico:4
BlocoMembro:
{% trans 'Membro'%}:
- bloco
- cargo:4 parlamentar
- data_entrada data_saida
BlocoMembroList:
{% trans 'Membros'%}:
- id
- cargo:4 parlamentar
- data_entrada data_saida

Loading…
Cancel
Save