From 54c6b384abaa3314143206da204d7828d0f5fd72 Mon Sep 17 00:00:00 2001 From: Ulysses Lara Date: Fri, 3 May 2019 12:34:54 -0300 Subject: [PATCH 1/2] 1798 mover model bloco para app parlamentares (#2760) * Migrando model de bloco de sessao para parlamentar * Migrando views e forms de bancada para app de parlamentares --- sapl/legacy/test_renames.py | 4 +- sapl/parlamentares/forms.py | 37 ++++++++++++++++++- sapl/parlamentares/migrations/0026_bloco.py | 37 +++++++++++++++++++ .../migrations/0027_auto_20190430_0839.py | 19 ++++++++++ sapl/parlamentares/models.py | 34 +++++++++++++++++ sapl/parlamentares/urls.py | 8 ++-- sapl/parlamentares/views.py | 18 ++++++++- sapl/rules/map_rules.py | 3 +- sapl/sessao/forms.py | 37 +------------------ .../migrations/0039_auto_20190430_0825.py | 22 +++++++++++ sapl/sessao/models.py | 34 ----------------- sapl/sessao/urls.py | 6 +-- sapl/sessao/views.py | 14 +------ sapl/templates/menu_tabelas_auxiliares.yaml | 2 +- sapl/templates/parlamentares/layouts.yaml | 7 ++++ sapl/templates/sessao/layouts.yaml | 7 ---- 16 files changed, 186 insertions(+), 103 deletions(-) create mode 100644 sapl/parlamentares/migrations/0026_bloco.py create mode 100644 sapl/parlamentares/migrations/0027_auto_20190430_0839.py create mode 100644 sapl/sessao/migrations/0039_auto_20190430_0825.py diff --git a/sapl/legacy/test_renames.py b/sapl/legacy/test_renames.py index b92c5d0ac..9a5c4ebaf 100644 --- a/sapl/legacy/test_renames.py +++ b/sapl/legacy/test_renames.py @@ -13,9 +13,9 @@ from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio, from sapl.norma.models import (AnexoNormaJuridica, NormaJuridica, NormaRelacionada, TipoVinculoNormaJuridica) from sapl.parlamentares.models import (Frente, Mandato, Parlamentar, Partido, - TipoAfastamento, Votante) + TipoAfastamento, Votante, Bloco) from sapl.protocoloadm.models import DocumentoAdministrativo -from sapl.sessao.models import (Bancada, Bloco, CargoBancada, +from sapl.sessao.models import (Bancada, CargoBancada, ExpedienteMateria, Orador, OradorExpediente, OrdemDia, RegistroVotacao, ResumoOrdenacao, SessaoPlenaria, TipoResultadoVotacao, diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index f52cea871..90d6e150c 100755 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -23,7 +23,7 @@ from sapl.rules import SAPL_GROUP_VOTANTE import django_filters from .models import (ComposicaoColigacao, Filiacao, Frente, Legislatura, - Mandato, Parlamentar, Votante) + Mandato, Parlamentar, Votante, Bloco) class ImageThumbnailFileInput(ClearableFileInput): @@ -568,3 +568,38 @@ class VincularParlamentarForm(forms.Form): raise ValidationError(_('Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.')) return cleaned_data + + +class BlocoForm(ModelForm): + + class Meta: + model = Bloco + fields = ['nome', 'partidos', 'data_criacao', + 'data_extincao', 'descricao'] + + def clean(self): + super(BlocoForm, self).clean() + + if not self.is_valid(): + return self.cleaned_data + + 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): + bloco = super(BlocoForm, self).save(commit) + content_type = ContentType.objects.get_for_model(Bloco) + object_id = bloco.pk + tipo = TipoAutor.objects.get(content_type=content_type) + Autor.objects.create( + content_type=content_type, + object_id=object_id, + tipo=tipo, + nome=bloco.nome + ) + return bloco \ No newline at end of file diff --git a/sapl/parlamentares/migrations/0026_bloco.py b/sapl/parlamentares/migrations/0026_bloco.py new file mode 100644 index 000000000..2ba9f2c07 --- /dev/null +++ b/sapl/parlamentares/migrations/0026_bloco.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-04-30 11:28 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0025_auto_20180924_1724'), + ('sessao', '0039_auto_20190430_0825') + ] + + state_operations = [ + migrations.CreateModel( + name='Bloco', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nome', models.CharField(max_length=80, verbose_name='Nome do Bloco')), + ('data_criacao', models.DateField(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')), + ('partidos', models.ManyToManyField(blank=True, to='parlamentares.Partido', verbose_name='Partidos')), + ], + options={ + 'db_table': 'parlamentares_bloco', + 'verbose_name': 'Bloco Parlamentar', + 'verbose_name_plural': 'Blocos Parlamentares', + }, + bases=(models.Model,), + ), + ] + + operations = [ + migrations.SeparateDatabaseAndState(state_operations=state_operations) + ] diff --git a/sapl/parlamentares/migrations/0027_auto_20190430_0839.py b/sapl/parlamentares/migrations/0027_auto_20190430_0839.py new file mode 100644 index 000000000..454101416 --- /dev/null +++ b/sapl/parlamentares/migrations/0027_auto_20190430_0839.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-04-30 11:39 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0026_bloco'), + ] + + operations = [ + migrations.AlterModelTable( + name='bloco', + table=None, + ), + ] diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index d88f2fd87..d50600eba 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -568,3 +568,37 @@ class Votante(models.Model): def __str__(self): return self.user.username + + +@reversion.register() +class Bloco(models.Model): + ''' + * blocos podem existir por mais de uma legislatura + ''' + nome = models.CharField( + max_length=80, verbose_name=_('Nome do Bloco')) + partidos = models.ManyToManyField( + Partido, blank=True, verbose_name=_('Partidos')) + data_criacao = models.DateField( + 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')) + + # 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='bloco_set', + fields_search=( + ('nome', '__icontains'), + ('descricao', '__icontains'), + ('partidos__sigla', '__icontains'), + ('partidos__nome', '__icontains'), + )) + + class Meta: + verbose_name = _('Bloco Parlamentar') + verbose_name_plural = _('Blocos Parlamentares') + + def __str__(self): + return self.nome diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py index 51fb856b4..4c1434333 100644 --- a/sapl/parlamentares/urls.py +++ b/sapl/parlamentares/urls.py @@ -18,7 +18,7 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud, insere_parlamentar_composicao, parlamentares_frente_selected, remove_parlamentar_composicao, - parlamentares_filiados, + parlamentares_filiados, BlocoCrud, PesquisarParlamentarView, VincularParlamentarView) from .apps import AppConfig @@ -46,8 +46,9 @@ urlpatterns = [ url(r'^sistema/coligacao/', include(ColigacaoCrud.get_urls() + - ComposicaoColigacaoCrud.get_urls())), - + ComposicaoColigacaoCrud.get_urls())), + url(r'^sistema/bloco/', + include(BlocoCrud.get_urls())), url(r'^sistema/frente/', include(FrenteCrud.get_urls())), url(r'^sistema/frente/atualiza-lista-parlamentares', @@ -89,4 +90,5 @@ urlpatterns = [ url(r'^mesa-diretora/remove-parlamentar-composicao/$', remove_parlamentar_composicao, name='remove_parlamentar_composicao'), + ] diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index ed2ef44c1..f5777824c 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -34,11 +34,15 @@ 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, ParlamentarFilterSet, VincularParlamentarForm) + ParlamentarCreateForm, ParlamentarForm, VotanteForm, + ParlamentarFilterSet, VincularParlamentarForm, + BlocoForm) + from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, Dependente, Filiacao, Frente, Legislatura, Mandato, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, - SituacaoMilitar, TipoAfastamento, TipoDependente, Votante) + SituacaoMilitar, TipoAfastamento, TipoDependente, Votante, + Bloco) CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa') @@ -1164,3 +1168,13 @@ class VincularParlamentarView(PermissionRequiredMixin, FormView): mandato.save() return HttpResponseRedirect(self.get_success_url()) + + +class BlocoCrud(CrudAux): + model = Bloco + + class CreateView(CrudAux.CreateView): + form_class = BlocoForm + + def get_success_url(self): + return reverse('sapl.parlamentares:bloco_list') \ No newline at end of file diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index a82ef2c3f..75fc76f33 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -278,6 +278,8 @@ rules_group_geral = { (parlamentares.ComposicaoMesa, __base__, __perms_publicas__), (parlamentares.Frente, __base__, __perms_publicas__), (parlamentares.Votante, __base__, __perms_publicas__), + (parlamentares.Bloco, __base__, __perms_publicas__), + (sessao.CargoBancada, __base__, __perms_publicas__), (sessao.Bancada, __base__, __perms_publicas__), @@ -286,7 +288,6 @@ rules_group_geral = { (sessao.TipoExpediente, __base__, __perms_publicas__), (sessao.TipoJustificativa, __base__, __perms_publicas__), (sessao.JustificativaAusencia, __base__, __perms_publicas__), - (sessao.Bloco, __base__, __perms_publicas__), (sessao.ResumoOrdenacao, __base__, __perms_publicas__), (sessao.TipoRetiradaPauta, __base__, __perms_publicas__), diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 451f2b990..1e14b0f45 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -23,7 +23,7 @@ from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES, autor_modal, timezone, choice_anos_com_sessaoplenaria, FileFieldCheckMixin) -from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia, +from .models import (Bancada, ExpedienteMateria, JustificativaAusencia, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, TipoResultadoVotacao, OcorrenciaSessao, RetiradaPauta, TipoRetiradaPauta, OradorOrdemDia, ORDENACAO_RESUMO, @@ -316,41 +316,6 @@ class BancadaForm(ModelForm): return bancada -class BlocoForm(ModelForm): - - class Meta: - model = Bloco - fields = ['nome', 'partidos', 'data_criacao', - 'data_extincao', 'descricao'] - - def clean(self): - super(BlocoForm, self).clean() - - if not self.is_valid(): - return self.cleaned_data - - 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): - bloco = super(BlocoForm, self).save(commit) - content_type = ContentType.objects.get_for_model(Bloco) - object_id = bloco.pk - tipo = TipoAutor.objects.get(content_type=content_type) - Autor.objects.create( - content_type=content_type, - object_id=object_id, - tipo=tipo, - nome=bloco.nome - ) - return bloco - - class ExpedienteMateriaForm(ModelForm): _model = ExpedienteMateria diff --git a/sapl/sessao/migrations/0039_auto_20190430_0825.py b/sapl/sessao/migrations/0039_auto_20190430_0825.py new file mode 100644 index 000000000..5a1c717f5 --- /dev/null +++ b/sapl/sessao/migrations/0039_auto_20190430_0825.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-04-30 11:25 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0038_merge_20190415_1800'), + ] + + database_operations = [migrations.AlterModelTable('Bloco', 'parlamentares_bloco')] + + state_operations = [migrations.DeleteModel('Bloco')] + + operations = [ + migrations.SeparateDatabaseAndState( + database_operations=database_operations, + state_operations=state_operations) + ] \ No newline at end of file diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 3d7c98186..53721499b 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -550,40 +550,6 @@ class SessaoPlenariaPresenca(models.Model): ordering = ['parlamentar__nome_parlamentar'] -@reversion.register() -class Bloco(models.Model): - ''' - * blocos podem existir por mais de uma legislatura - ''' - nome = models.CharField( - max_length=80, verbose_name=_('Nome do Bloco')) - partidos = models.ManyToManyField( - Partido, blank=True, verbose_name=_('Partidos')) - data_criacao = models.DateField( - 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')) - - # 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='bloco_set', - fields_search=( - ('nome', '__icontains'), - ('descricao', '__icontains'), - ('partidos__sigla', '__icontains'), - ('partidos__nome', '__icontains'), - )) - - class Meta: - verbose_name = _('Bloco Parlamentar') - verbose_name_plural = _('Blocos Parlamentares') - - def __str__(self): - return self.nome - - ORDENACAO_RESUMO = [ ('id_basica', 'Identificação Básica'), ('cont_mult', 'Conteúdo Multimídia'), diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 00add810a..d5d709967 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -2,8 +2,8 @@ from django.conf.urls import include, url from sapl.sessao.views import (AdicionarVariasMateriasExpediente, AdicionarVariasMateriasOrdemDia, BancadaCrud, - BlocoCrud, CargoBancadaCrud, - ExpedienteMateriaCrud, ExpedienteView, JustificativaAusenciaCrud, + CargoBancadaCrud, ExpedienteMateriaCrud, + ExpedienteView, JustificativaAusenciaCrud, OcorrenciaSessaoView, MateriaOrdemDiaCrud, OradorOrdemDiaCrud, MesaView, OradorCrud, OradorExpedienteCrud, PainelView, @@ -96,8 +96,6 @@ urlpatterns = [ include(TipoRetiradaPautaCrud.get_urls())), url(r'^sistema/bancada/', include(BancadaCrud.get_urls())), - url(r'^sistema/bloco/', - include(BlocoCrud.get_urls())), url(r'^sistema/cargo-bancada/', include(CargoBancadaCrud.get_urls())), url(r'^sistema/resumo-ordenacao/', diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 8961a27b4..191de0b8f 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -37,13 +37,13 @@ from sapl.sessao.apps import AppConfig from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm from sapl.utils import show_results_filter_set, remover_acentos, get_client_ip -from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm, +from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, ExpedienteForm, JustificativaAusenciaForm, OcorrenciaSessaoForm, ListMateriaForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, VotacaoNominalForm, RetiradaPautaForm, OradorOrdemDiaForm) -from .models import (Bancada, Bloco, CargoBancada, CargoMesa, +from .models import (Bancada, CargoBancada, CargoMesa, ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, @@ -679,16 +679,6 @@ class BancadaCrud(CrudAux): return reverse('sapl.sessao:bancada_list') -class BlocoCrud(CrudAux): - model = Bloco - - class CreateView(CrudAux.CreateView): - form_class = BlocoForm - - def get_success_url(self): - return reverse('sapl.sessao:bloco_list') - - def recuperar_numero_sessao(request): try: sessao = SessaoPlenaria.objects.filter( diff --git a/sapl/templates/menu_tabelas_auxiliares.yaml b/sapl/templates/menu_tabelas_auxiliares.yaml index 4f690ca00..9a9c40d8d 100644 --- a/sapl/templates/menu_tabelas_auxiliares.yaml +++ b/sapl/templates/menu_tabelas_auxiliares.yaml @@ -78,7 +78,7 @@ url: sapl.parlamentares:frente_list css_class: btn btn-link - title: {% trans 'Bloco Parlamentar' %} - url: sapl.sessao:bloco_list + url: sapl.parlamentares:bloco_list css_class: btn btn-link - title: {% trans 'Módulo Proposições' %} css_class: head_title diff --git a/sapl/templates/parlamentares/layouts.yaml b/sapl/templates/parlamentares/layouts.yaml index 030e32758..7c3e59908 100644 --- a/sapl/templates/parlamentares/layouts.yaml +++ b/sapl/templates/parlamentares/layouts.yaml @@ -127,3 +127,10 @@ Votante: {% trans 'Votante' %}: - parlamentar user - data + +Bloco: + {% trans 'Bloco' %}: + - nome + - data_criacao data_extincao + - partidos + - descricao \ No newline at end of file diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml index 98307d74d..16e353910 100644 --- a/sapl/templates/sessao/layouts.yaml +++ b/sapl/templates/sessao/layouts.yaml @@ -84,13 +84,6 @@ CargoBancada: {% trans 'Cargo de Bancada' %}: - nome_cargo:8 cargo_unico -Bloco: - {% trans 'Bloco' %}: - - nome - - data_criacao data_extincao - - partidos - - descricao - TipoJustificativa: {% trans 'Tipo de Justificativa' %}: - descricao From 820c346db64d48a586ddb912c688b117da004d75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rodrigues?= Date: Fri, 3 May 2019 12:35:28 -0300 Subject: [PATCH 2/2] =?UTF-8?q?Fix=20#2751=20e=20Automatiza=20a=20altera?= =?UTF-8?q?=C3=A7=C3=A3o=20do=20campo=20"Em=20Tramita=C3=A7=C3=A3o=3F"=20d?= =?UTF-8?q?as=20Mat=C3=A9rias=20Legislativas=20(#2752)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Automatizar Em Tramitação? e tramitação anexados * Automatizar Em Tramitação? - Edição direta * Atualizar sapl/materia/forms.py * Atualizar sapl/materia/views.py * Adicionar teste função lista_anexadas --- sapl/materia/forms.py | 30 +++++++++++++--- sapl/materia/tests/test_materia.py | 56 ++++++++++++++++++++++++++++++ sapl/materia/views.py | 29 +++++++++------- 3 files changed, 98 insertions(+), 17 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 82dd8248a..3c5533345 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -553,17 +553,39 @@ class TramitacaoForm(ModelForm): def save(self, commit=True): tramitacao = super(TramitacaoForm, self).save(commit) materia = tramitacao.materia - for ma in materia.anexadas.all(): - if not ma.tramitacao_set.all() \ - or ma.tramitacao_set.last().unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local: + + materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True + materia.save() + + anexadas = lista_anexadas(materia) + for anexada in anexadas: + if not anexada.tramitacao_set.all() \ + or anexada.tramitacao_set.last().unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local: tramitacao_nova = tramitacao tramitacao_nova.pk = None - tramitacao_nova.materia = ma + tramitacao_nova.materia = anexada tramitacao_nova.save() + anexada.em_tramitacao = False if tramitacao.status.indicador == "F" else True + anexada.save() + return tramitacao +def lista_anexadas(materia_principal): + materias_anexadas = [] + anexadas_principal = Anexada.objects.filter(materia_principal=materia_principal) + while anexadas_principal: + anexadas = [] + for anexada in anexadas_principal: + materias_anexadas.append(anexada.materia_anexada) + anexadas_anexada = Anexada.objects.filter(materia_principal=anexada.materia_anexada) + anexadas.extend(anexadas_anexada) + anexadas_principal = anexadas + + return materias_anexadas + + class TramitacaoUpdateForm(TramitacaoForm): unidade_tramitacao_local = forms.ModelChoiceField( queryset=UnidadeTramitacao.objects.all(), diff --git a/sapl/materia/tests/test_materia.py b/sapl/materia/tests/test_materia.py index 80f3f244f..048d528c5 100644 --- a/sapl/materia/tests/test_materia.py +++ b/sapl/materia/tests/test_materia.py @@ -14,12 +14,68 @@ from sapl.materia.models import (Anexada, Autoria, DespachoInicial, StatusTramitacao, TipoDocumento, TipoMateriaLegislativa, TipoProposicao, Tramitacao, UnidadeTramitacao) +from sapl.materia.forms import lista_anexadas from sapl.norma.models import (LegislacaoCitada, NormaJuridica, TipoNormaJuridica) from sapl.parlamentares.models import Legislatura from sapl.utils import models_with_gr_for_model +@pytest.mark.django_db(transaction=False) +def test_lista_anexadas(): + tipo_materia = mommy.make( + TipoMateriaLegislativa, + descricao="Tipo_Teste" + ) + regime_tramitacao = mommy.make( + RegimeTramitacao, + descricao="Regime_Teste" + ) + materia_principal = mommy.make( + MateriaLegislativa, + numero=20, + ano=2018, + data_apresentacao="2018-01-04", + regime_tramitacao=regime_tramitacao, + tipo=tipo_materia + ) + materia_anexada = mommy.make( + MateriaLegislativa, + numero=21, + ano=2019, + data_apresentacao="2019-05-04", + regime_tramitacao=regime_tramitacao, + tipo=tipo_materia + ) + materia_anexada_anexada = mommy.make( + MateriaLegislativa, + numero=22, + ano=2020, + data_apresentacao="2020-01-05", + regime_tramitacao=regime_tramitacao, + tipo=tipo_materia + ) + + mommy.make( + Anexada, + materia_principal=materia_principal, + materia_anexada=materia_anexada, + data_anexacao="2019-05-11" + ) + mommy.make( + Anexada, + materia_principal=materia_anexada, + materia_anexada=materia_anexada_anexada, + data_anexacao="2020-11-05" + ) + + lista = lista_anexadas(materia_principal) + + assert len(lista) == 2 + assert lista[0] == materia_anexada + assert lista[1] == materia_anexada_anexada + + @pytest.mark.django_db(transaction=False) def make_unidade_tramitacao(descricao): # Cria uma comissão para ser a unidade de tramitação diff --git a/sapl/materia/views.py b/sapl/materia/views.py index ec0561838..f38f72dbd 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -47,7 +47,8 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm, ConfirmarProposicaoForm, DevolverProposicaoForm, LegislacaoCitadaForm, OrgaoForm, ProposicaoForm, TipoProposicaoForm, - TramitacaoForm, TramitacaoUpdateForm, MateriaPesquisaSimplesForm) + TramitacaoForm, TramitacaoUpdateForm, MateriaPesquisaSimplesForm, + lista_anexadas) from sapl.norma.models import LegislacaoCitada from sapl.parlamentares.models import Legislatura from sapl.protocoloadm.models import Protocolo @@ -1233,12 +1234,6 @@ class TramitacaoCrud(MasterDetailCrud): self.object = form.save() username = self.request.user.username - if form.instance.status.indicador == 'F': - form.instance.materia.em_tramitacao = False - else: - form.instance.materia.em_tramitacao = True - form.instance.materia.save() - try: self.logger.debug("user=" + username + ". Tentando enviar Tramitacao (sender={}, post={}, request={})." .format(Tramitacao, self.object, self.request)) @@ -1272,12 +1267,6 @@ class TramitacaoCrud(MasterDetailCrud): self.object = form.save() username = self.request.user.username - if form.instance.status.indicador == 'F': - form.instance.materia.em_tramitacao = False - else: - form.instance.materia.em_tramitacao = True - form.instance.materia.save() - try: self.logger.debug("user=" + username + ". Tentando enviar Tramitacao (sender={}, post={}, request={}" .format(Tramitacao, self.object, self.request)) @@ -1611,6 +1600,20 @@ class MateriaLegislativaCrud(Crud): form_class = MateriaLegislativaForm + def form_valid(self, form): + self.object = form.save() + username = self.request.user.username + + if Anexada.objects.filter(materia_principal=self.kwargs['pk']).exists(): + materia = MateriaLegislativa.objects.get(pk=self.kwargs['pk']) + anexadas = lista_anexadas(materia) + + for anexada in anexadas: + anexada.em_tramitacao = True if form.instance.em_tramitacao else False + anexada.save() + + return super().form_valid(form) + @property def cancel_url(self): return self.search_url