From 9e3ca5b5087d505c612d76eab176ef4c300dfbcf Mon Sep 17 00:00:00 2001 From: VictorFabreF Date: Fri, 2 Feb 2018 15:22:09 -0200 Subject: [PATCH] fixes #1685 (#1686) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fixes #1685 * Ajusta teste de sessao * HOT-FIX * Automatiza criação de autor para comissão --- sapl/comissoes/forms.py | 38 +++++++++++++- sapl/comissoes/views.py | 16 ++---- sapl/materia/forms.py | 24 ++++++++- sapl/materia/views.py | 9 ++-- sapl/parlamentares/forms.py | 26 ++++++++++ sapl/parlamentares/views.py | 26 ++-------- sapl/sessao/forms.py | 49 ++++++++++++++++++- .../migrations/0016_auto_20180131_1708.py | 25 ++++++++++ sapl/sessao/models.py | 4 +- sapl/sessao/tests/test_sessao.py | 3 +- sapl/sessao/views.py | 24 +++++++-- 11 files changed, 198 insertions(+), 46 deletions(-) create mode 100644 sapl/sessao/migrations/0016_auto_20180131_1708.py diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py index f5075ef07..b54da78bf 100644 --- a/sapl/comissoes/forms.py +++ b/sapl/comissoes/forms.py @@ -1,7 +1,12 @@ from django.db.models import Q from django import forms +from django.core.exceptions import ValidationError +from django.contrib.contenttypes.models import ContentType +from django.db import transaction +from django.utils.translation import ugettext_lazy as _ -from sapl.comissoes.models import Participacao, Composicao +from sapl.base.models import Autor, TipoAutor +from sapl.comissoes.models import Participacao, Composicao, Comissao from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato @@ -89,3 +94,34 @@ class ParticipacaoForm(forms.ModelForm): lista = list(set(lista)) return lista + +class ComissaoForm(forms.ModelForm): + + class Meta: + model = Comissao + fields = '__all__' + + def clean(self): + super(ComissaoForm, self).clean() + + 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): + comissao = super(ComissaoForm, self).save(commit) + content_type = ContentType.objects.get_for_model(Comissao) + object_id = comissao.pk + tipo = TipoAutor.objects.get(descricao='Comissão') + nome = comissao.sigla+' - '+comissao.nome + Autor.objects.create( + content_type=content_type, + object_id=object_id, + tipo=tipo, + nome=nome + ) + return comissao diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py index 147d65cc2..c84bb6b4a 100644 --- a/sapl/comissoes/views.py +++ b/sapl/comissoes/views.py @@ -8,6 +8,7 @@ from sapl.comissoes.forms import ParticipacaoForm from sapl.crud.base import RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud from sapl.materia.models import MateriaLegislativa, Tramitacao +from .forms import ComissaoForm from .models import (CargoComissao, Comissao, Composicao, Participacao, Periodo, TipoComissao) @@ -100,18 +101,11 @@ class ComissaoCrud(Crud): 'data_criacao', 'data_extincao', 'ativa'] ordering = '-ativa', 'sigla' - class ListView(Crud.ListView): - - @xframe_options_exempt - def get(self, request, *args, **kwargs): - return super().get(request, *args, **kwargs) - - class DetailView(Crud.DetailView): - - @xframe_options_exempt - def get(self, request, *args, **kwargs): - return super().get(request, *args, **kwargs) + class CreateView(Crud.CreateView): + form_class = ComissaoForm + def form_valid(self, form): + return super(Crud.CreateView, self).form_valid(form) class MateriasTramitacaoListView(ListView): template_name = "comissoes/materias_em_tramitacao.html" diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index bf700de71..97aaa3d59 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -31,7 +31,7 @@ from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, to_row) from sapl.materia.models import (AssuntoMateria, MateriaAssunto, MateriaLegislativa, RegimeTramitacao, - TipoDocumento, TipoProposicao) + TipoDocumento, TipoProposicao, Orgao) from sapl.norma.models import (LegislacaoCitada, NormaJuridica, TipoNormaJuridica) from sapl.protocoloadm.models import Protocolo @@ -77,6 +77,28 @@ class AdicionarVariasAutoriasFilterSet(django_filters.FilterSet): ) +class OrgaoForm(ModelForm): + + class Meta: + model = Orgao + fields = ['nome', 'sigla', 'unidade_deliberativa', + 'endereco', 'telefone'] + + @transaction.atomic + def save(self, commit=True): + orgao = super(OrgaoForm, self).save(commit) + content_type = ContentType.objects.get_for_model(Orgao) + object_id = orgao.pk + tipo = TipoAutor.objects.get(descricao='Órgão') + nome = orgao.nome+' - '+orgao.sigla + Autor.objects.create( + content_type=content_type, + object_id=object_id, + tipo=tipo, + nome=nome + ) + return orgao + class ReceberProposicaoForm(Form): cod_hash = forms.CharField(label='Código do Documento', required=True) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 918749a3d..289976beb 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -38,7 +38,7 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm, ConfirmarProposicaoForm, LegislacaoCitadaForm, ProposicaoForm, TipoProposicaoForm, TramitacaoForm, TramitacaoUpdateForm, - DevolverProposicaoForm) + DevolverProposicaoForm, OrgaoForm) from sapl.norma.models import LegislacaoCitada from sapl.protocoloadm.models import Protocolo from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, @@ -296,10 +296,13 @@ def recuperar_materia(request): return response - -OrgaoCrud = CrudAux.build(Orgao, 'orgao') StatusTramitacaoCrud = CrudAux.build(StatusTramitacao, 'status_tramitacao') +class OrgaoCrud(Crud): + model = Orgao + + class CreateView(Crud.CreateView): + form_class = OrgaoForm class TipoProposicaoCrud(CrudAux): model = TipoProposicao diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index 0f004be14..77be6ac80 100644 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -5,6 +5,7 @@ from crispy_forms.layout import Fieldset, Layout from django import forms from django.contrib.auth import get_user_model from django.contrib.auth.models import Group, User +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.db import transaction from django.db.models import Q @@ -16,6 +17,7 @@ from floppyforms.widgets import ClearableFileInput from sapl.crispy_layout_mixin import form_actions, to_row from sapl.rules import SAPL_GROUP_VOTANTE +from sapl.base.models import Autor, TipoAutor from .models import (ComposicaoColigacao, Filiacao, Frente, Legislatura, Mandato, Parlamentar, Votante) @@ -152,8 +154,18 @@ class ParlamentarCreateForm(ParlamentarForm): Mandato.objects.create( parlamentar=parlamentar, legislatura=legislatura, + data_inicio_mandato=legislatura.data_inicio, data_fim_mandato=legislatura.data_fim, data_expedicao_diploma=self.cleaned_data['data_expedicao_diploma']) + content_type = ContentType.objects.get_for_model(Parlamentar) + object_id = parlamentar.pk + tipo = TipoAutor.objects.get(descricao='Parlamentar') + Autor.objects.create( + content_type = content_type, + object_id = object_id, + tipo = tipo, + nome = parlamentar.nome_parlamentar + ) return parlamentar @@ -280,6 +292,20 @@ class FrenteForm(ModelForm): model = Frente fields = '__all__' + @transaction.atomic + def save(self, commit=True): + frente = super(FrenteForm, self).save(commit) + content_type = ContentType.objects.get_for_model(Frente) + object_id = frente.pk + tipo = TipoAutor.objects.get(descricao='Frente Parlamentar') + Autor.objects.create( + content_type=content_type, + object_id=object_id, + tipo=tipo, + nome=frente.nome + ) + return frente + class VotanteForm(ModelForm): diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 3e79770a3..e708af3f5 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -27,7 +27,7 @@ from sapl.parlamentares.apps import AppConfig from sapl.utils import parlamentares_ativos from .forms import (FiliacaoForm, LegislaturaForm, MandatoForm, - ParlamentarCreateForm, ParlamentarForm, VotanteForm) + ParlamentarCreateForm, ParlamentarForm, VotanteForm, FrenteForm) from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, Dependente, Filiacao, Frente, Legislatura, Mandato, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, @@ -276,27 +276,11 @@ class FrenteCrud(CrudAux): public = [RP_DETAIL, RP_LIST] list_field_names = ['nome', 'data_criacao', 'parlamentares'] - class CreateView(CrudAux.CreateView): - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - - # Update view é um indicador para o javascript - # de que esta não é uma tela de edição de frente - context['update_view'] = 0 - - return context - - class UpdateView(CrudAux.UpdateView): - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - - # Update view é um indicador para o javascript - # de que esta não é uma tela de edição de frente - context['update_view'] = 1 + class CreateView(Crud.CreateView): + form_class = FrenteForm - return context + def form_valid(self, form): + return super(Crud.CreateView, self).form_valid(form) class MandatoCrud(MasterDetailCrud): diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index a9c0bc164..b6496f557 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -4,10 +4,13 @@ import django_filters from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button, Fieldset, Layout from django import forms +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist, ValidationError +from django.db import transaction from django.forms import ModelForm from django.utils.translation import ugettext_lazy as _ +from sapl.base.models import Autor, TipoAutor from sapl.crispy_layout_mixin import form_actions, to_row from sapl.materia.forms import MateriaLegislativaFilterSet from sapl.materia.models import (MateriaLegislativa, StatusTramitacao, @@ -18,7 +21,7 @@ from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES, autor_modal, timezone) from .models import (Bancada, ExpedienteMateria, Orador, OradorExpediente, - OrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, TipoResultadoVotacao) + OrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, TipoResultadoVotacao, Bloco) def recupera_anos(): @@ -112,6 +115,50 @@ class BancadaForm(ModelForm): 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(descricao='Bancada Parlamentar') + Autor.objects.create( + content_type=content_type, + object_id=object_id, + tipo=tipo, + nome=bancada.nome + ) + 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 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(descricao='Bloco Parlamentar') + Autor.objects.create( + content_type=content_type, + object_id=object_id, + tipo=tipo, + nome=bloco.nome + ) + return bloco class ExpedienteMateriaForm(ModelForm): diff --git a/sapl/sessao/migrations/0016_auto_20180131_1708.py b/sapl/sessao/migrations/0016_auto_20180131_1708.py new file mode 100644 index 000000000..54e9b5113 --- /dev/null +++ b/sapl/sessao/migrations/0016_auto_20180131_1708.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2018-01-31 19:08 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0015_sessaoplenaria_painel_aberto'), + ] + + operations = [ + migrations.AlterField( + model_name='bancada', + name='data_criacao', + field=models.DateField(null=True, verbose_name='Data Criação'), + ), + migrations.AlterField( + model_name='bloco', + name='data_criacao', + field=models.DateField(null=True, verbose_name='Data Criação'), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 7d87ecef2..69e2cf57f 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -42,7 +42,7 @@ class Bancada(models.Model): null=True, on_delete=models.PROTECT, verbose_name=_('Partido')) - data_criacao = models.DateField(blank=True, null=True, + 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')) @@ -498,7 +498,7 @@ class Bloco(models.Model): partidos = models.ManyToManyField( Partido, blank=True, verbose_name=_('Partidos')) data_criacao = models.DateField( - blank=True, null=True, verbose_name=_('Data Criação')) + 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')) diff --git a/sapl/sessao/tests/test_sessao.py b/sapl/sessao/tests/test_sessao.py index 038ad7424..38f89acfe 100644 --- a/sapl/sessao/tests/test_sessao.py +++ b/sapl/sessao/tests/test_sessao.py @@ -81,8 +81,9 @@ def test_valida_campos_obrigatorios_bancada_form(): 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) == 2 + assert len(errors) == 3 @pytest.mark.django_db(transaction=False) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 49573332b..357a500fd 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -41,7 +41,7 @@ from .forms import (AdicionarVariasMateriasFilterSet, ExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, - VotacaoNominalForm) + VotacaoNominalForm, BancadaForm, BlocoForm) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, ExpedienteSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, @@ -53,10 +53,7 @@ TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente') CargoBancadaCrud = CrudAux.build(CargoBancada, '') -BlocoCrud = CrudAux.build( - Bloco, '', list_field_names=['nome', 'data_criacao', 'partidos']) -BancadaCrud = CrudAux.build( - Bancada, '', list_field_names=['nome', 'legislatura']) + TipoResultadoVotacaoCrud = CrudAux.build( TipoResultadoVotacao, 'tipo_resultado_votacao') @@ -575,6 +572,23 @@ class OradorCrud(OradorCrud): return reverse('sapl.sessao:orador_list', kwargs={'pk': self.kwargs['pk']}) +class BancadaCrud(Crud): + model = Bancada + + class CreateView(Crud.CreateView): + form_class = BancadaForm + + def get_success_url(self): + return reverse('sapl.sessao:bancada_list') + +class BlocoCrud(Crud): + model = Bloco + + class CreateView(Crud.CreateView): + form_class = BlocoForm + + def get_success_url(self): + return reverse('sapl.sessao:bloco_list') def recuperar_numero_sessao(request): try: