Browse Source

Fix #2903

pull/2904/head
Cesar Carvalho 6 years ago
parent
commit
8d67daebda
  1. 85
      sapl/parlamentares/forms.py
  2. 32
      sapl/parlamentares/migrations/0033_afastamentoparlamentar.py
  3. 30
      sapl/parlamentares/models.py
  4. 3
      sapl/parlamentares/urls.py
  5. 41
      sapl/parlamentares/views.py
  6. 1
      sapl/rules/map_rules.py
  7. 6
      sapl/templates/parlamentares/layouts.yaml
  8. 2
      sapl/templates/parlamentares/subnav.yaml

85
sapl/parlamentares/forms.py

@ -24,7 +24,7 @@ import django_filters
from .models import (ComposicaoColigacao, Filiacao, Frente, Legislatura, from .models import (ComposicaoColigacao, Filiacao, Frente, Legislatura,
Mandato, Parlamentar, Votante, Bloco, Bancada, CargoBloco, Mandato, Parlamentar, Votante, Bloco, Bancada, CargoBloco,
CargoBlocoPartido) CargoBlocoPartido, AfastamentoParlamentar, TipoAfastamento)
class ImageThumbnailFileInput(ClearableFileInput): class ImageThumbnailFileInput(ClearableFileInput):
@ -87,6 +87,12 @@ class MandatoForm(ModelForm):
'tipo_afastamento', 'observacao', 'parlamentar'] 'tipo_afastamento', 'observacao', 'parlamentar']
widgets = {'parlamentar': forms.HiddenInput()} widgets = {'parlamentar': forms.HiddenInput()}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['tipo_afastamento'].queryset = TipoAfastamento.objects.filter(indicador='F')
def clean(self): def clean(self):
super(MandatoForm, self).clean() super(MandatoForm, self).clean()
@ -673,6 +679,8 @@ class BancadaForm(ModelForm):
nome=bancada.nome nome=bancada.nome
) )
return bancada return bancada
class CargoBlocoForm(ModelForm): class CargoBlocoForm(ModelForm):
class Meta: class Meta:
model = CargoBloco model = CargoBloco
@ -736,4 +744,79 @@ class CargoBlocoPartidoForm(ModelForm):
if self.instance.pk and (cleaned_data['parlamentar'].id != self.instance.parlamentar.id): 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)) raise ValidationError("Não é possivel alterar o parlamentar " + str(self.instance.parlamentar))
class AfastamentoParlamentarForm(ModelForm):
logger = logging.getLogger(__name__)
class Meta:
model = AfastamentoParlamentar
fields = ['data_inicio', 'data_fim', 'mandato',
'tipo_afastamento', 'observacao', 'parlamentar']
widgets = {'parlamentar': forms.HiddenInput()}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if not (self.instance and self.instance.pk):
parlamentar = kwargs['initial']['parlamentar']
self.fields['mandato'].queryset = Mandato.objects.filter(parlamentar=parlamentar)
self.fields['tipo_afastamento'].queryset = TipoAfastamento.objects.filter(indicador='A')
def clean(self):
super(AfastamentoParlamentarForm, self).clean()
if not self.is_valid():
return self.cleaned_data
data = self.cleaned_data
mandato = data['mandato']
data_inicio_mandato = mandato.data_inicio_mandato
data_fim_mandato = mandato.data_fim_mandato
data_inicio_afastamento = data['data_inicio']
data_fim_afastamento = data['data_fim']
if data_inicio_afastamento < data_inicio_mandato:
self.logger.error("Data início de afastamento ({}) anterior ao inicio"
" do mandato informado ({})."
.format(data_inicio_afastamento, data_inicio_mandato))
raise ValidationError(_("Data início do afastamento anterior ao início"
" do mandato informado."))
if data_fim_mandato and data_inicio_afastamento > data_fim_mandato:
self.logger.error("Data início de afastamento ({}) posterior ao fim"
" do mandato informado ({} a {})."
.format(data_inicio_afastamento, data_fim_mandato))
raise ValidationError(_("Data início do afastamento posterior ao fim"
" do mandato informado."))
if data_fim_afastamento:
if data_fim_afastamento < data_inicio_afastamento:
self.logger.error("Data fim de afastamento ({}) menor que data início"
" do afastamento ({})."
.format(data_fim_afastamento, data_inicio_afastamento))
raise ValidationError(_("Data fim do afastamento menor que data início do"
" afastamento."))
if data_fim_afastamento < data_inicio_mandato:
self.logger.error("Data fim de afastamento ({}) anterior ao início"
" do mandato informado ({} a {})."
.format(data_fim_afastamento, data_inicio_mandato))
raise ValidationError(_("Data fim do afastamento anterior ao início"
" do mandato informado."))
if data_fim_mandato and data_fim_afastamento > data_fim_mandato:
self.logger.error("Data fim de afastamento ({}) posterior ao fim"
" do mandato informado ({} a {})."
.format(data_inicio_afastamento, data_fim_mandato))
raise ValidationError(_("Data fim do afastamento posterior ao fim"
" do mandato informado."))
if AfastamentoParlamentar.objects.last() and not AfastamentoParlamentar.objects.last().data_fim:
self.logger.error("Existe Afastamento sem Data Fim.")
raise ValidationError(_("Existe Afastamento sem Data Fim."))
return self.cleaned_data

32
sapl/parlamentares/migrations/0033_afastamentoparlamentar.py

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-08-01 15:35
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0032_auto_20190619_1509'),
]
operations = [
migrations.CreateModel(
name='AfastamentoParlamentar',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('data_inicio', models.DateField(null=True, verbose_name='Início do Afastamento')),
('data_fim', models.DateField(blank=True, null=True, verbose_name='Fim do Afastamento')),
('observacao', models.TextField(blank=True, verbose_name='Observação')),
('mandato', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.Mandato', verbose_name='Mandato')),
('parlamentar', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.Parlamentar')),
('tipo_afastamento', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='parlamentares.TipoAfastamento', verbose_name='Tipo de Afastamento')),
],
options={
'verbose_name': 'Afastamento',
'verbose_name_plural': 'Afastamentos',
},
),
]

30
sapl/parlamentares/models.py

@ -727,7 +727,6 @@ class CargoBancada(models.Model):
def __str__(self): def __str__(self):
return self.nome_cargo return self.nome_cargo
class CargoBlocoPartido(models.Model): class CargoBlocoPartido(models.Model):
class Meta: class Meta:
verbose_name = _('Vinculo bloco parlamentar') verbose_name = _('Vinculo bloco parlamentar')
@ -748,3 +747,32 @@ class CargoBlocoPartido(models.Model):
data_inicio = models.DateField(verbose_name=_('Data Início')) data_inicio = models.DateField(verbose_name=_('Data Início'))
data_fim = models.DateField(blank=True, null=True, verbose_name=_('Data Fim')) data_fim = models.DateField(blank=True, null=True, verbose_name=_('Data Fim'))
@reversion.register()
class AfastamentoParlamentar(models.Model):
parlamentar = models.ForeignKey(Parlamentar, on_delete=models.CASCADE)
mandato = models.ForeignKey(Mandato, on_delete=models.CASCADE,
verbose_name=_('Mandato'))
tipo_afastamento = models.ForeignKey(TipoAfastamento,
on_delete=models.PROTECT,
verbose_name=_('Tipo de Afastamento'),
blank=True,
null=True)
data_inicio = models.DateField(verbose_name=_('Início do Afastamento'),
blank=False,
null=True)
data_fim = models.DateField(verbose_name=_('Fim do Afastamento'),
blank=True,
null=True)
observacao = models.TextField(verbose_name=_('Observação'),
blank=True)
class Meta:
verbose_name = _('Afastamento')
verbose_name_plural = _('Afastamentos')
def __str__(self):
return _('%(parlamentar)s %(legislatura)s') % {
'parlamentar': self.parlamentar, 'legislatura': self.mandato.legislatura
}

3
sapl/parlamentares/urls.py

@ -12,6 +12,7 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
RelatoriaParlamentarCrud, RelatoriaParlamentarCrud,
SessaoLegislativaCrud, SessaoLegislativaCrud,
TipoAfastamentoCrud, TipoDependenteCrud, TipoAfastamentoCrud, TipoDependenteCrud,
AfastamentoParlamentarCrud,
TipoMilitarCrud, VotanteView, TipoMilitarCrud, VotanteView,
altera_field_mesa, altera_field_mesa,
altera_field_mesa_public_view, altera_field_mesa_public_view,
@ -42,7 +43,7 @@ urlpatterns = [
ParticipacaoParlamentarCrud.get_urls() + ParticipacaoParlamentarCrud.get_urls() +
ProposicaoParlamentarCrud.get_urls() + ProposicaoParlamentarCrud.get_urls() +
RelatoriaParlamentarCrud.get_urls() + FrenteList.get_urls() + RelatoriaParlamentarCrud.get_urls() + FrenteList.get_urls() +
VotanteView.get_urls() VotanteView.get_urls() + AfastamentoParlamentarCrud.get_urls()
)), )),
url(r'^parlamentar/lista$', lista_parlamentares, name='lista_parlamentares'), url(r'^parlamentar/lista$', lista_parlamentares, name='lista_parlamentares'),

41
sapl/parlamentares/views.py

@ -38,13 +38,13 @@ from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm,
ParlamentarCreateForm, ParlamentarForm, VotanteForm, ParlamentarCreateForm, ParlamentarForm, VotanteForm,
ParlamentarFilterSet, VincularParlamentarForm, ParlamentarFilterSet, VincularParlamentarForm,
BlocoForm, CargoBlocoForm, CargoBlocoPartidoForm, BlocoForm, CargoBlocoForm, CargoBlocoPartidoForm,
BancadaForm) BancadaForm, AfastamentoParlamentarForm)
from .models import (Bancada, CargoBancada, CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, from .models import (Bancada, CargoBancada, 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, CargoBlocoPartido, HistoricoPartido, CargoBloco) Bloco, CargoBlocoPartido, HistoricoPartido, CargoBloco, AfastamentoParlamentar)
CargoBancadaCrud = CrudAux.build(CargoBancada, '') CargoBancadaCrud = CrudAux.build(CargoBancada, '')
@ -1298,3 +1298,40 @@ def deleta_vinculo_parlamentar_bloco(request,pk):
'sapl.parlamentares:bloco_detail', 'sapl.parlamentares:bloco_detail',
kwargs={'pk': pk_bloco}) kwargs={'pk': pk_bloco})
) )
class AfastamentoParlamentarCrud(PermissionRequiredMixin, MasterDetailCrud):
model = AfastamentoParlamentar
parent_field = 'parlamentar'
public = [RP_DETAIL, RP_LIST]
list_field_names = ['mandato__legislatura',
'data_inicio',
'data_fim',
'tipo_afastamento']
class ListView(MasterDetailCrud.ListView):
ordering = ('-mandato__legislatura__numero', '-data_inicio')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
rows = context['rows']
coluna_coligacao = 2
coluna_votos_recebidos = 3
for row in rows:
if not row[coluna_coligacao][0]:
row[coluna_coligacao] = (' ', None)
if not row[coluna_votos_recebidos][0]:
row[coluna_votos_recebidos] = (' ', None)
return context
class CreateView(MasterDetailCrud.CreateView):
form_class = AfastamentoParlamentarForm
def get_initial(self):
parlamentar = Parlamentar.objects.get(pk=self.kwargs['pk'])
return {'parlamentar': parlamentar}
class UpdateView(MasterDetailCrud.UpdateView):
form_class = AfastamentoParlamentarForm

1
sapl/rules/map_rules.py

@ -287,6 +287,7 @@ rules_group_geral = {
(parlamentares.Bloco, __base__, __perms_publicas__), (parlamentares.Bloco, __base__, __perms_publicas__),
(parlamentares.CargoBloco, __base__, __perms_publicas__), (parlamentares.CargoBloco, __base__, __perms_publicas__),
(parlamentares.CargoBlocoPartido, __base__, __perms_publicas__), (parlamentares.CargoBlocoPartido, __base__, __perms_publicas__),
(parlamentares.AfastamentoParlamentar, __base__, __perms_publicas__),
(sessao.TipoSessaoPlenaria, __base__, __perms_publicas__), (sessao.TipoSessaoPlenaria, __base__, __perms_publicas__),
(sessao.TipoResultadoVotacao, __base__, __perms_publicas__), (sessao.TipoResultadoVotacao, __base__, __perms_publicas__),

6
sapl/templates/parlamentares/layouts.yaml

@ -151,3 +151,9 @@ CargoBloco:
- nome - nome
- unico - unico
- descricao - descricao
AfastamentoParlamentar:
{% trans 'Afastamento' %}:
- data_inicio data_fim
- mandato tipo_afastamento
- observacao

2
sapl/templates/parlamentares/subnav.yaml

@ -3,6 +3,8 @@
url: parlamentar_detail url: parlamentar_detail
- title: {% trans 'Mandatos' %} - title: {% trans 'Mandatos' %}
url: mandato_list url: mandato_list
- title: {% trans 'Afastamentos' %}
url: afastamentoparlamentar_list
- title: {% trans 'Matérias' %} - title: {% trans 'Matérias' %}
url: parlamentar_materias url: parlamentar_materias
- title: {% trans 'Filiações Partidárias' %} - title: {% trans 'Filiações Partidárias' %}

Loading…
Cancel
Save