diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index 267bb15cb..e45d00654 100755 --- a/sapl/parlamentares/forms.py +++ b/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 @@ -683,7 +632,7 @@ class CargoBlocoPartidoForm(ModelForm): class Meta: model = CargoBlocoPartido fields = ['cargo','parlamentar','data_inicio','data_fim'] - + def __init__(self, *args, **kwargs): super(CargoBlocoPartidoForm, self).__init__(*args, **kwargs) @@ -693,7 +642,7 @@ class CargoBlocoPartidoForm(ModelForm): partidos = self.bloco.partidos.all().values_list('id', flat=True) parlamentares_filiacao = Filiacao.objects.select_related('partido').filter(partido__in=partidos).values_list('parlamentar', flat=True) self.fields['parlamentar'].queryset = Parlamentar.objects.filter(id__in=parlamentares_filiacao) - + if self.instance and self.instance.pk: self.fields['parlamentar'].widget.attrs['disabled'] = 'disabled' self.fields['parlamentar'].required = False @@ -715,10 +664,10 @@ class CargoBlocoPartidoForm(ModelForm): vinculo.data_fim) and vinculo.cargo.unico and \ not(self.instance and self.instance.id == vinculo.id): raise ValidationError("Cargo unico já é utilizado nesse período.") - + if aux_data_fim <= cleaned_data['data_inicio']: raise ValidationError("Data Inicial deve ser anterior a data final.") - + if self.instance and self.instance.pk: self.cleaned_data['parlamentar'] = self.instance.parlamentar else: @@ -730,10 +679,197 @@ class CargoBlocoPartidoForm(ModelForm): cleaned_data['data_inicio'], aux_data_fim, mandato.legislatura.data_fim): - fora_de_mandato = False + fora_de_mandato = False if fora_de_mandato: raise ValidationError("Data de inicio e fim fora de periodo do mandato do parlamentar.") 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 diff --git a/sapl/parlamentares/migrations/0034_auto_20190604_1220.py b/sapl/parlamentares/migrations/0034_auto_20190604_1220.py new file mode 100644 index 000000000..c81d426e2 --- /dev/null +++ b/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', + ), + ] diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index eeab386ee..ebbed6946 100644 --- a/sapl/parlamentares/models.py +++ b/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) diff --git a/sapl/parlamentares/tests/test_parlamentares.py b/sapl/parlamentares/tests/test_parlamentares.py index 92fdbff54..1f308f54a 100644 --- a/sapl/parlamentares/tests/test_parlamentares.py +++ b/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() diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py index de0007239..0862378ab 100644 --- a/sapl/parlamentares/urls.py +++ b/sapl/parlamentares/urls.py @@ -22,19 +22,24 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud, lista_parlamentares, parlamentares_filiados, BlocoCrud, CargoBlocoCrud, - PesquisarParlamentarView, + PesquisarParlamentarView, VincularParlamentarView, deleta_historico_partido, 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() + @@ -78,7 +83,33 @@ urlpatterns = [ edita_vinculo_parlamentar_bloco,name='edita-vinculo-parlamentar-bloco'), url(r'^sistema/deleta-vinculo-parlamentar-bloco/(?P\d+)/', deleta_vinculo_parlamentar_bloco,name='deleta-vinculo-parlamentar-bloco'), - + + url(r'^sistema/bancada/(?P\d+)/membro/create/$', + MembroBancadaCreate.as_view(), + name='membrobancada_create'), + url(r'^sistema/bancada/(?P\d+)/membro/(?P\d+)/$', + MembroBancadaDetail.as_view(), + name='membrobancada_detail'), + url(r'^sistema/bancada/(?P\d+)/membro/(?P\d+)/update/$', + MembroBancadaUpdate.as_view(), + name='membrobancada_update'), + url(r'^sistema/bancada/(?P\d+)/membro/(?P\d+)/delete/$', + MembroBancadaDelete.as_view(), + name='membrobancada_delete'), + + url(r'^sistema/bancada/(?P\d+)/membro/(?P\d+)/cargo/create/$', + CargoMembroBancadaCreate.as_view(), + name='cargomembrobancada_create'), + url(r'^sistema/bancada/(?P\d+)/membro/(?P\d+)/cargo/(?P\d+)/$', + CargoMembroBancadaDetail.as_view(), + name='cargomembrobancada_detail'), + url(r'^sistema/bancada/(?P\d+)/membro/(?P\d+)/cargo/(?P\d+)/update/$', + CargoMembroBancadaUpdate.as_view(), + name='cargomembrobancada_update'), + url(r'^sistema/bancada/(?P\d+)/membro/(?P\d+)/cargo/(?P\d+)/delete/$', + CargoMembroBancadaDelete.as_view(), + name='cargomembrobancada_delete'), + url(r'^sistema/frente/', include(FrenteCrud.get_urls())), url(r'^sistema/frente/atualiza-lista-parlamentares', diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 6cd9a572f..aab151f0f 100644 --- a/sapl/parlamentares/views.py +++ b/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, + ParlamentarCreateForm, ParlamentarForm, VotanteForm, ParlamentarFilterSet, VincularParlamentarForm, BlocoForm, CargoBlocoForm, CargoBlocoPartidoForm, - BancadaForm) - -from .models import (Bancada, CargoBancada, CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, + BancadaForm, MembroBancadaForm, CargoMembroBancadaForm) + +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 @@ -1180,7 +1296,7 @@ def deleta_historico_partido(request, pk): historico = HistoricoPartido.objects.get(pk=pk) pk_partido = historico.partido.pk historico.delete() - + return HttpResponseRedirect( reverse( 'sapl.parlamentares:partido_detail', @@ -1235,11 +1351,11 @@ class BlocoCrud(CrudAux): context['vinculados'] = CargoBlocoPartido.objects.filter(bloco=self.object) return context - - + + class CargoBlocoCrud(CrudAux): model = CargoBloco - + class CreateView(CrudAux.CreateView): form_class = CargoBlocoForm diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index eb0be21b8..7197ea8b0 100644 --- a/sapl/rules/map_rules.py +++ b/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__), diff --git a/sapl/templates/parlamentares/bancada_detail.html b/sapl/templates/parlamentares/bancada_detail.html new file mode 100644 index 000000000..912ac98e6 --- /dev/null +++ b/sapl/templates/parlamentares/bancada_detail.html @@ -0,0 +1,36 @@ +{% extends "crud/detail.html" %} +{% load i18n %} +{% load common_tags %} + +{% block extra_actions %} + +{% endblock extra_actions %} + +{% block table_content %} +
+

Membros

+ {% if membros %} +
Total de Membros: {{ qntd }}
+ + + + + + + + + {% for membro in membros %} + + + + + {% endfor %} + + + {% else %} +

Nenhum membro encontrado.

+ {% endif %} +
+{% endblock table_content %} diff --git a/sapl/templates/parlamentares/cargomembrobancada_create.html b/sapl/templates/parlamentares/cargomembrobancada_create.html new file mode 100644 index 000000000..ab9f19520 --- /dev/null +++ b/sapl/templates/parlamentares/cargomembrobancada_create.html @@ -0,0 +1 @@ +{% extends "crud/form.html" %} \ No newline at end of file diff --git a/sapl/templates/parlamentares/cargomembrobancada_delete.html b/sapl/templates/parlamentares/cargomembrobancada_delete.html new file mode 100644 index 000000000..ca4dd562d --- /dev/null +++ b/sapl/templates/parlamentares/cargomembrobancada_delete.html @@ -0,0 +1,3 @@ +{% extends "crud/confirm_delete.html" %} + +{% block sections_nav %}{% endblock sections_nav %} diff --git a/sapl/templates/parlamentares/cargomembrobancada_detail.html b/sapl/templates/parlamentares/cargomembrobancada_detail.html new file mode 100644 index 000000000..c50958518 --- /dev/null +++ b/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 %}

Cargo {{ object.cargo }}

{% endblock title %} + +{% block extra_actions %} +
+ Voltar +
+{% endblock extra_actions %} + +{% block editions %} +
+ Editar + Excluir +
+{% endblock editions %} + +{% block detail_content %} +

Cargo

+
+
+

Nome do Membro da Bancada Parlamentar

+
+
+

Data Início de Membro

+
+
+

Data Fim de Membro

+
+
+
+ +
+
+ {{ object.membro.data_inicio }} +
+
+
+
+ {% if object.membro.data_fim %}{{ object.membro.data_fim }}{% else %}-{% endif %} +
+
+
+
+
+

Nome do Cargo da Bancada Parlamentar

+
+
+

Data Início no Cargo

+
+
+

Data Fim no Cargo

+
+
+
+ +
+
+ {{ object.data_inicio }} +
+
+
+
+ {% if object.data_fim %}{{ object.data_fim }}{% else %}-{% endif %} +
+
+
+{% endblock detail_content %} diff --git a/sapl/templates/parlamentares/cargomembrobancada_update.html b/sapl/templates/parlamentares/cargomembrobancada_update.html new file mode 100644 index 000000000..a658a80a6 --- /dev/null +++ b/sapl/templates/parlamentares/cargomembrobancada_update.html @@ -0,0 +1,3 @@ +{% extends "crud/form.html" %} + +{% block sections_nav %}{% endblock sections_nav %} diff --git a/sapl/templates/parlamentares/layouts.yaml b/sapl/templates/parlamentares/layouts.yaml index 4a717e559..b28cea12c 100644 --- a/sapl/templates/parlamentares/layouts.yaml +++ b/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' %}: diff --git a/sapl/templates/parlamentares/membrobancada_create.html b/sapl/templates/parlamentares/membrobancada_create.html new file mode 100644 index 000000000..ab9f19520 --- /dev/null +++ b/sapl/templates/parlamentares/membrobancada_create.html @@ -0,0 +1 @@ +{% extends "crud/form.html" %} \ No newline at end of file diff --git a/sapl/templates/parlamentares/membrobancada_delete.html b/sapl/templates/parlamentares/membrobancada_delete.html new file mode 100644 index 000000000..ca4dd562d --- /dev/null +++ b/sapl/templates/parlamentares/membrobancada_delete.html @@ -0,0 +1,3 @@ +{% extends "crud/confirm_delete.html" %} + +{% block sections_nav %}{% endblock sections_nav %} diff --git a/sapl/templates/parlamentares/membrobancada_detail.html b/sapl/templates/parlamentares/membrobancada_detail.html new file mode 100644 index 000000000..fa031aaf6 --- /dev/null +++ b/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 %}

Membro {{ object.parlamentar }}

{% endblock title %} + +{% block extra_actions %} + +{% endblock extra_actions %} +{% block editions %} +
+ Editar + Excluir +
+{% endblock editions %} + +{% block detail_content %} +

Membro

+
+
+

Nome do Membro da Bancada Parlamentar

+
+
+

Bancada Parlamentar

+
+
+ +
+
+

Legislatura

+
+
+

Data Início de Membro

+
+
+

Data Fim de Membro

+
+
+
+ +
+
+ {{ object.data_inicio }} +
+
+
+
+ {% if object.data_fim %}{{ object.data_fim }}{% else %}-{% endif %} +
+
+
+{% endblock detail_content %} + +{% block table_content %} +
+

Cargos

+ {% if cargos %} +
Total de Cargos: {{ qntd }}
+ + + + + + + + + + {% for cargo in cargos %} + + + + + + {% endfor %} + + + {% else %} +

Nenhum cargo encontrado.

+ {% endif %} +
+{% endblock table_content %} diff --git a/sapl/templates/parlamentares/membrobancada_update.html b/sapl/templates/parlamentares/membrobancada_update.html new file mode 100644 index 000000000..a658a80a6 --- /dev/null +++ b/sapl/templates/parlamentares/membrobancada_update.html @@ -0,0 +1,3 @@ +{% extends "crud/form.html" %} + +{% block sections_nav %}{% endblock sections_nav %} diff --git a/scripts/popula_bancada.py b/scripts/popula_bancada.py new file mode 100644 index 000000000..af06d7668 --- /dev/null +++ b/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()