From c93e2ecc5c20d2a85d420e2f4a1a1bab0de5a147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Cantu=C3=A1ria?= Date: Wed, 15 May 2019 12:20:38 -0300 Subject: [PATCH] =?UTF-8?q?Adiciona=20migra=C3=A7=C3=B5es=20de=20Bancada?= =?UTF-8?q?=20Parlamentar=20Fix=20#1936?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/parlamentares/forms.py | 29 +--- .../migrations/0031_auto_20190520_1326.py | 136 ++++++++++++++++++ sapl/parlamentares/models.py | 122 ++++++++++++---- .../parlamentares/tests/test_parlamentares.py | 41 +----- sapl/rules/map_rules.py | 2 + sapl/templates/parlamentares/layouts.yaml | 7 +- 6 files changed, 237 insertions(+), 100 deletions(-) create mode 100644 sapl/parlamentares/migrations/0031_auto_20190520_1326.py diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index 6f8b47c85..3cbdfc5ee 100755 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -624,8 +624,7 @@ class BancadaForm(ModelForm): class Meta: model = Bancada - fields = ['legislatura', 'nome', 'partido', 'data_criacao', - 'data_extincao', 'descricao'] + fields = ['nome', 'descricao', 'ativo'] def clean(self): super(BancadaForm, self).clean() @@ -633,32 +632,6 @@ class BancadaForm(ModelForm): 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) diff --git a/sapl/parlamentares/migrations/0031_auto_20190520_1326.py b/sapl/parlamentares/migrations/0031_auto_20190520_1326.py new file mode 100644 index 000000000..af2cee710 --- /dev/null +++ b/sapl/parlamentares/migrations/0031_auto_20190520_1326.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-05-20 16:26 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0030_auto_20190520_1542'), + ] + + operations = [ + migrations.RenameField( + model_name='cargobancada', + old_name='nome_cargo', + new_name='nome', + ), + 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(verbose_name='Data Fim do Membro no Cargo')), + ], + options={ + 'verbose_name': 'Cargo Membro Bancada Parlamentar', + 'verbose_name_plural': 'Cargos Membros Bancada Parlamentare', + }, + ), + 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(verbose_name='Data Fim de Membro')), + ], + options={ + 'verbose_name': 'Membro Bancada Parlamentar', + 'verbose_name_plural': 'Membros Bancada Parlamentare', + }, + ), + migrations.AlterModelOptions( + name='cargobancada', + options={'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=False, + 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', + field=models.CharField(max_length=30, verbose_name='Nome do Cargo'), + ), + 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='bancada', + options={'ordering': ('nome',), 'verbose_name': 'Bancada Parlamentar', + 'verbose_name_plural': 'Bancadas Parlamentares'}, + ), + migrations.AlterField( + 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.AlterModelOptions( + name='cargobancada', + options={'ordering': ('nome',), 'verbose_name': 'Cargo Bancada Parlamentar', + 'verbose_name_plural': 'Cargos Bancada Parlamentar'}, + ), + ] diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index 51e36765c..b96f3ee46 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -604,53 +604,113 @@ 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')) + 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'), - )) + + 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', ) + ordering = ('nome', ) def __str__(self): return self.nome -@reversion.register() +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') + ) + 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 Parlamentare') + + def __str__(self): + return '{} - {}'.format(self.parlamentar, self.bancada) + + class CargoBancada(models.Model): - nome_cargo = models.CharField(max_length=80, - verbose_name=_('Cargo de Bancada')) + 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 - cargo_unico = models.BooleanField(default=False, - choices=YES_NO_CHOICES, - verbose_name=_('Cargo Único ?')) + +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') + ) class Meta: db_table = 'parlamentares_cargobancada' @@ -658,4 +718,4 @@ class CargoBancada(models.Model): verbose_name_plural = _('Cargos de Bancada') def __str__(self): - return self.nome_cargo + return '{} - {}'.format(self.cargo, self.membro) diff --git a/sapl/parlamentares/tests/test_parlamentares.py b/sapl/parlamentares/tests/test_parlamentares.py index c640487cd..84122f948 100644 --- a/sapl/parlamentares/tests/test_parlamentares.py +++ b/sapl/parlamentares/tests/test_parlamentares.py @@ -360,49 +360,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/rules/map_rules.py b/sapl/rules/map_rules.py index 06e23bf1c..b5cb3a3a1 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -280,7 +280,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__), (sessao.TipoSessaoPlenaria, __base__, __perms_publicas__), diff --git a/sapl/templates/parlamentares/layouts.yaml b/sapl/templates/parlamentares/layouts.yaml index a2a1b3aab..3a45c6797 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' %}: