diff --git a/sapl/sessao/migrations/0026_auto_20181016_1944.py b/sapl/sessao/migrations/0026_auto_20181016_1944.py new file mode 100644 index 000000000..97ae02603 --- /dev/null +++ b/sapl/sessao/migrations/0026_auto_20181016_1944.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2018-10-16 22:44 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0025_auto_20180919_1116'), + ] + + operations = [ + migrations.AlterField( + model_name='expedientesessao', + name='sessao_plenaria', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'), + ), + migrations.AlterField( + model_name='integrantemesa', + name='sessao_plenaria', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'), + ), + migrations.AlterField( + model_name='orador', + name='sessao_plenaria', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'), + ), + migrations.AlterField( + model_name='oradorexpediente', + name='sessao_plenaria', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'), + ), + migrations.AlterField( + model_name='presencaordemdia', + name='sessao_plenaria', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'), + ), + migrations.AlterField( + model_name='registrovotacao', + name='expediente', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.ExpedienteMateria'), + ), + migrations.AlterField( + model_name='registrovotacao', + name='materia', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='materia.MateriaLegislativa'), + ), + migrations.AlterField( + model_name='registrovotacao', + name='ordem', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.OrdemDia'), + ), + migrations.AlterField( + model_name='sessaoplenaria', + name='sessao_legislativa', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.SessaoLegislativa', verbose_name='Sessão Legislativa'), + ), + migrations.AlterField( + model_name='sessaoplenariapresenca', + name='sessao_plenaria', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 7f8ea0882..824d9ad2d 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -121,7 +121,7 @@ class SessaoPlenaria(models.Model): verbose_name=_('Tipo')) sessao_legislativa = models.ForeignKey( SessaoLegislativa, - on_delete=models.PROTECT, + on_delete=models.CASCADE, verbose_name=_('Sessão Legislativa')) legislatura = models.ForeignKey(Legislatura, on_delete=models.PROTECT, @@ -288,7 +288,7 @@ class TipoExpediente(models.Model): @reversion.register() class ExpedienteSessao(models.Model): # ExpedienteSessaoPlenaria sessao_plenaria = models.ForeignKey(SessaoPlenaria, - on_delete=models.PROTECT) + on_delete=models.CASCADE) tipo = models.ForeignKey(TipoExpediente, on_delete=models.PROTECT) conteudo = models.TextField( blank=True, verbose_name=_('Conteúdo do expediente')) @@ -319,7 +319,7 @@ class OcorrenciaSessao(models.Model): # OcorrenciaSessaoPlenaria @reversion.register() class IntegranteMesa(models.Model): # MesaSessaoPlenaria sessao_plenaria = models.ForeignKey(SessaoPlenaria, - on_delete=models.PROTECT) + on_delete=models.CASCADE) cargo = models.ForeignKey(CargoMesa, on_delete=models.PROTECT) parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) @@ -334,7 +334,7 @@ class IntegranteMesa(models.Model): # MesaSessaoPlenaria @reversion.register() class AbstractOrador(models.Model): # Oradores sessao_plenaria = models.ForeignKey(SessaoPlenaria, - on_delete=models.PROTECT) + on_delete=models.CASCADE) parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT, verbose_name=_('Parlamentar')) @@ -387,7 +387,7 @@ class OrdemDia(AbstractOrdemDia): @reversion.register() class PresencaOrdemDia(models.Model): # OrdemDiaPresenca sessao_plenaria = models.ForeignKey(SessaoPlenaria, - on_delete=models.PROTECT) + on_delete=models.CASCADE) parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) class Meta: @@ -427,15 +427,15 @@ class RegistroVotacao(models.Model): TipoResultadoVotacao, on_delete=models.PROTECT, verbose_name=_('Resultado da Votação')) - materia = models.ForeignKey(MateriaLegislativa, on_delete=models.PROTECT) + materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) ordem = models.ForeignKey(OrdemDia, blank=True, null=True, - on_delete=models.PROTECT) + on_delete=models.CASCADE) expediente = models.ForeignKey(ExpedienteMateria, blank=True, null=True, - on_delete=models.PROTECT) + on_delete=models.CASCADE) numero_votos_sim = models.PositiveIntegerField(verbose_name=_('Sim')) numero_votos_nao = models.PositiveIntegerField(verbose_name=_('Não')) numero_abstencoes = models.PositiveIntegerField( @@ -476,7 +476,7 @@ class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar ''' votacao = models.ForeignKey(RegistroVotacao, blank=True, - null=True) + null=True,on_delete=models.CASCADE) parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) voto = models.CharField(max_length=10) @@ -496,10 +496,10 @@ class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar ordem = models.ForeignKey(OrdemDia, blank=True, - null=True) + null=True, on_delete=models.CASCADE) expediente = models.ForeignKey(ExpedienteMateria, blank=True, - null=True) + null=True, on_delete=models.CASCADE) class Meta: verbose_name = _('Registro de Votação de Parlamentar') @@ -513,7 +513,7 @@ class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar @reversion.register() class SessaoPlenariaPresenca(models.Model): sessao_plenaria = models.ForeignKey(SessaoPlenaria, - on_delete=models.PROTECT) + on_delete=models.CASCADE) parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) data_sessao = models.DateField(blank=True, null=True) diff --git a/sapl/sessao/tests/test_sessao.py b/sapl/sessao/tests/test_sessao.py index c1af4fc7e..3ed1e47f6 100644 --- a/sapl/sessao/tests/test_sessao.py +++ b/sapl/sessao/tests/test_sessao.py @@ -5,11 +5,14 @@ from django.utils.translation import ugettext_lazy as _ from model_mommy import mommy from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa -from sapl.parlamentares.models import Legislatura, Partido, SessaoLegislativa +from sapl.parlamentares.models import Legislatura, Parlamentar, Partido,SessaoLegislativa from sapl.sessao import forms -from sapl.sessao.models import (ExpedienteMateria, OrdemDia, RegistroVotacao, - SessaoPlenaria, TipoSessaoPlenaria) - +from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, + IntegranteMesa, Orador, OrdemDia, + PresencaOrdemDia, RegistroVotacao, + SessaoPlenaria, SessaoPlenariaPresenca, + TipoResultadoVotacao, TipoSessaoPlenaria, + VotoParlamentar) def test_valida_campos_obrigatorios_sessao_plenaria_form(): form = forms.SessaoPlenariaForm(data={}) @@ -170,3 +173,124 @@ def test_registro_votacao_tem_ordem_xor_expediente(): # a validação NÃO funciona quando ambos são preenchidos with pytest.raises(ValidationError): registro_votacao_com(ordem, expediente).full_clean() + +def create_sessao_plenaria(): + legislatura = mommy.make(Legislatura) + sessao = mommy.make(SessaoLegislativa) + tipo = mommy.make(TipoSessaoPlenaria) + return mommy.make(SessaoPlenaria, + legislatura=legislatura, + sessao_legislativa=sessao, + tipo=tipo, + numero=1) + +def create_materia_legislativa(): + tipo_materia = mommy.make(TipoMateriaLegislativa) + return mommy.make(MateriaLegislativa, tipo=tipo_materia) + +@pytest.mark.django_db(transaction=False) +def test_delete_sessao_plenaria_cascade_registro_votacao_ordemdia(): + materia = create_materia_legislativa() + sessao_plenaria = create_sessao_plenaria() + ordem = mommy.make(OrdemDia, + sessao_plenaria=sessao_plenaria, + materia=materia, + tipo_votacao='2') + tipo_resultado_votacao = mommy.make(TipoResultadoVotacao, + nome='ok', + natureza="A") + registro = mommy.make(RegistroVotacao, + tipo_resultado_votacao=tipo_resultado_votacao, + materia=materia, + ordem=ordem) + presenca = mommy.make(PresencaOrdemDia, + sessao_plenaria=sessao_plenaria) + parlamentar = mommy.make(Parlamentar) + voto_parlamentar = mommy.make(VotoParlamentar, + votacao=registro, + parlamentar=parlamentar, + ordem=ordem) + sessao_plenaria.delete() + presenca_filter = PresencaOrdemDia.objects.filter( + sessao_plenaria=sessao_plenaria).exists() + ordem_filter = OrdemDia.objects.filter( + sessao_plenaria=sessao_plenaria).exists() + registro_filter = RegistroVotacao.objects.filter( + tipo_resultado_votacao=tipo_resultado_votacao, + materia=materia, + ordem=ordem).exists() + materia_filter = MateriaLegislativa.objects.filter(id=materia.id).exists() + parlamentar_filter = Parlamentar.objects.exists() + voto_parlamentar_filter = VotoParlamentar.objects.filter( + ordem=ordem).exists() + assert not registro_filter + assert not ordem_filter + assert not presenca_filter + assert not voto_parlamentar_filter + assert materia_filter # Não exclui materia + assert parlamentar_filter # Não exclui Parlamentar + +@pytest.mark.django_db(transaction=False) +def test_delete_sessao_plenaria_cascade_registro_votacao_expediente(): + materia = create_materia_legislativa() + sessao_plenaria = create_sessao_plenaria() + expediente = mommy.make(ExpedienteMateria, + sessao_plenaria=sessao_plenaria, + materia=materia, + tipo_votacao='2') + tipo_resultado_votacao = mommy.make(TipoResultadoVotacao, + nome='ok', + natureza="A") + registro = mommy.make(RegistroVotacao, + tipo_resultado_votacao=tipo_resultado_votacao, + materia=materia, + expediente=expediente) + presenca = mommy.make(SessaoPlenariaPresenca, + sessao_plenaria=sessao_plenaria) + parlamentar = mommy.make(Parlamentar) + voto_parlamentar = mommy.make(VotoParlamentar, + votacao=registro, + parlamentar=parlamentar, + expediente=expediente) + sessao_plenaria.delete() + expediente_filter = ExpedienteMateria.objects.filter( + sessao_plenaria=sessao_plenaria).exists() + registro_filter = RegistroVotacao.objects.filter( + tipo_resultado_votacao=tipo_resultado_votacao, + materia=materia, + expediente=expediente).exists() + presenca_filter = SessaoPlenariaPresenca.objects.filter( + sessao_plenaria=sessao_plenaria).exists() + parlamentar_filter = Parlamentar.objects.exists() + voto_parlamentar_filter = VotoParlamentar.objects.filter( + expediente=expediente).exists() + assert not registro_filter + assert not expediente_filter + assert not presenca_filter + assert not voto_parlamentar_filter + assert parlamentar_filter # Não exclui Parlamentar + + +@pytest.mark.django_db(transaction=False) +def test_delete_sessao_plenaria_cascade_integrante_mesa(): + sessao_plenaria = create_sessao_plenaria() + mesa = mommy.make(IntegranteMesa,sessao_plenaria=sessao_plenaria) + sessao_plenaria.delete() + mesa_filter = IntegranteMesa.objects.filter(sessao_plenaria=sessao_plenaria).exists() + assert not mesa_filter + +@pytest.mark.django_db(transaction=False) +def test_delete_sessao_plenaria_cascade_expedientesessao(): + sessao_plenaria = create_sessao_plenaria() + expediente_sessao = mommy.make(ExpedienteSessao, sessao_plenaria=sessao_plenaria) + sessao_plenaria.delete() + expediente_sessao_filter = ExpedienteSessao.objects.filter(sessao_plenaria=sessao_plenaria).exists() + assert not expediente_sessao_filter + +@pytest.mark.django_db(transaction=False) +def test_delete_sessao_plenaria_cascade_orador(): + sessao_plenaria = create_sessao_plenaria() + expediente_sessao = mommy.make(Orador, sessao_plenaria=sessao_plenaria) + sessao_plenaria.delete() + orador_filter = Orador.objects.filter(sessao_plenaria=sessao_plenaria).exists() + assert not orador_filter