From 2de3cea10ebb55b552e16908b41a97e94f6adaa8 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 5 Apr 2016 13:45:28 -0300 Subject: [PATCH] =?UTF-8?q?Adiciona=20cria=C3=A7=C3=A3o=20de=20parlamentar?= =?UTF-8?q?=20com=20mandato?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reformulado usando o crud --- crispy_layout_mixin.py | 20 ++++++--- parlamentares/forms.py | 33 +++++++++++++- parlamentares/layouts.yaml | 20 +++++++++ parlamentares/test_parlamentares.py | 69 +++++++++++++++-------------- parlamentares/views.py | 21 ++++++++- 5 files changed, 121 insertions(+), 42 deletions(-) diff --git a/crispy_layout_mixin.py b/crispy_layout_mixin.py index 46dadf7a7..fb05de47f 100644 --- a/crispy_layout_mixin.py +++ b/crispy_layout_mixin.py @@ -67,18 +67,28 @@ def get_field_display(obj, fieldname): class CrispyLayoutFormMixin: + @property + def layout_key(self): + if hasattr(super(CrispyLayoutFormMixin, self), 'layout_key'): + return super(CrispyLayoutFormMixin, self).layout_key + else: + return self.model.__name__ + def get_layout(self): filename = join( dirname(self.model._meta.app_config.models_module.__file__), 'layouts.yaml') - return read_layout_from_yaml(filename, self.model.__name__) + return read_layout_from_yaml(filename, self.layout_key) @property def fields(self): - '''Returns all fields in the layout''' - return [fieldname for legend_rows in self.get_layout() - for row in legend_rows[1:] - for fieldname, span in row] + if hasattr(self, 'form_class') and self.form_class: + return None + else: + '''Returns all fields in the layout''' + return [fieldname for legend_rows in self.get_layout() + for row in legend_rows[1:] + for fieldname, span in row] def get_form(self, form_class=None): try: diff --git a/parlamentares/forms.py b/parlamentares/forms.py index 1252e4cdc..9a3c1ab3c 100644 --- a/parlamentares/forms.py +++ b/parlamentares/forms.py @@ -1,13 +1,44 @@ from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Fieldset, Layout, Submit from django import forms +from django.db import transaction from django.forms import ModelForm from django.utils.translation import ugettext_lazy as _ import crispy_layout_mixin from crispy_layout_mixin import form_actions -from .models import Dependente, Filiacao, Legislatura, Mandato +from .models import Dependente, Filiacao, Legislatura, Mandato, Parlamentar + + +class ParlamentarCreateForm(ModelForm): + + legislatura = forms.ModelChoiceField( + label=_('Legislatura'), + required=True, + queryset=Legislatura.objects.all().order_by('-data_inicio'), + empty_label='----------', + ) + + data_expedicao_diploma = forms.DateField( + label=_('Expedição do Diploma'), + required=True, + ) + + class Meta: + model = Parlamentar + exclude = [] + + @transaction.atomic + def save(self, commit=True): + parlamentar = super(ParlamentarCreateForm, self).save(commit) + legislatura = self.cleaned_data['legislatura'] + Mandato.objects.create( + parlamentar=parlamentar, + legislatura=legislatura, + data_fim_mandato=legislatura.data_fim, + data_expedicao_diploma=self.cleaned_data['data_expedicao_diploma']) + return parlamentar class MandatoForm(ModelForm): diff --git a/parlamentares/layouts.yaml b/parlamentares/layouts.yaml index 9a224a622..d4d342231 100644 --- a/parlamentares/layouts.yaml +++ b/parlamentares/layouts.yaml @@ -42,6 +42,26 @@ Parlamentar: - fotografia - biografia +ParlamentarCreate: + Dados do Mandato: + - legislatura data_expedicao_diploma + Cadastro do Parlamentar: + - nome_parlamentar:8 ativo + - nome_completo + - nivel_instrucao sexo data_nascimento + - cpf rg titulo_eleitor + - situacao_militar profissao + - endereco_web + - email + - numero_gab_parlamentar telefone fax + - endereco_residencia cep_residencia + - municipio_residencia + - telefone_residencia fax_residencia + - locais_atuacao + - fotografia + - biografia + + Filiacao: 'Filiações Partidárias ': - partido data data_desfiliacao diff --git a/parlamentares/test_parlamentares.py b/parlamentares/test_parlamentares.py index 944985b95..e61aaf958 100644 --- a/parlamentares/test_parlamentares.py +++ b/parlamentares/test_parlamentares.py @@ -6,26 +6,46 @@ from .models import (Dependente, Filiacao, Legislatura, Mandato, Parlamentar, Partido, TipoDependente) -# vamos refazer a funcionalidade adicionando os campos ogrigatórios de mandato @pytest.mark.django_db(transaction=False) -def TODO_DESLIGADO_RELIGAR_test_cadastro_parlamentar(client): - mommy.make(Legislatura, pk=5) +def test_cadastro_parlamentar(client): + legislatura = mommy.make(Legislatura) - response = client.get(reverse('parlamentares:parlamentares_cadastro', - kwargs={'pk': 5})) + url = reverse('parlamentares:parlamentar_create') + response = client.get(url) assert response.status_code == 200 - response = client.post(reverse('parlamentares:parlamentares_cadastro', - kwargs={'pk': 5}), - {'nome_completo': 'Teresa Barbosa', - 'nome_parlamentar': 'Terezinha', - 'sexo': 'F', - 'ativo': 'True'}, follow=True) + response = client.post(url, {'nome_completo': 'Teresa Barbosa', + 'nome_parlamentar': 'Terezinha', + 'sexo': 'F', + 'ativo': 'True', + 'legislatura': legislatura.id, + 'data_expedicao_diploma': '2001-01-01'}, + follow=True) + + [parlamentar] = Parlamentar.objects.all() + assert parlamentar.nome_parlamentar == 'Terezinha' + assert parlamentar.sexo == 'F' + assert parlamentar.ativo is True + # o primeiro mandato é criado + [mandato] = Mandato.objects.all() + assert mandato.parlamentar == parlamentar + assert str(mandato.data_expedicao_diploma) == '2001-01-01' + assert mandato.legislatura == legislatura + assert mandato.data_fim_mandato == legislatura.data_fim - parlamentar = Parlamentar.objects.first() - assert "Terezinha" == parlamentar.nome_parlamentar - if not parlamentar.ativo: - pytest.fail("Parlamentar deve estar ativo") + +@pytest.mark.django_db(transaction=False) +def test_incluir_parlamentar_errors(client): + url = reverse('parlamentares:parlamentar_create') + response = client.post(url) + erros_esperados = {campo: ['Este campo é obrigatório.'] + for campo in ['legislatura', + 'data_expedicao_diploma', + 'nome_parlamentar', + 'nome_completo', + 'sexo', + ]} + assert response.context_data['form'].errors == erros_esperados @pytest.mark.django_db(transaction=False) @@ -128,22 +148,3 @@ def test_form_errors_mandato(client): ['Este campo é obrigatório.']) assert (response.context_data['form'].errors['data_expedicao_diploma'] == ['Este campo é obrigatório.']) - - -@pytest.mark.django_db(transaction=False) -def test_incluir_parlamentar_errors(client): - mommy.make(Legislatura, pk=5) - - response = client.post(reverse('parlamentares:parlamentares_cadastro', - kwargs={'pk': 5}), - {'salvar': 'salvar'}, - follow=True) - - assert (response.context_data['form'].errors['nome_parlamentar'] == - ['Este campo é obrigatório.']) - assert (response.context_data['form'].errors['nome_completo'] == - ['Este campo é obrigatório.']) - assert (response.context_data['form'].errors['sexo'] == - ['Este campo é obrigatório.']) - assert (response.context_data['form'].errors['ativo'] == - ['Este campo é obrigatório.']) diff --git a/parlamentares/views.py b/parlamentares/views.py index a419db2d9..ab50cf8ec 100644 --- a/parlamentares/views.py +++ b/parlamentares/views.py @@ -5,10 +5,12 @@ from django.shortcuts import redirect from django.utils.translation import ugettext_lazy as _ from django.views.generic import CreateView, FormView, UpdateView +import crud.base from crud.base import Crud from .forms import (DependenteEditForm, DependenteForm, FiliacaoEditForm, - FiliacaoForm, MandatoEditForm, MandatoForm) + FiliacaoForm, MandatoEditForm, MandatoForm, + ParlamentarCreateForm) from .models import (CargoMesa, Coligacao, ComposicaoMesa, Dependente, Filiacao, Legislatura, Mandato, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, SituacaoMilitar, @@ -20,7 +22,6 @@ ColigacaoCrud = Crud.build(Coligacao, 'coligacao') PartidoCrud = Crud.build(Partido, 'partidos') DependenteCrud = Crud.build(Dependente, '') SessaoLegislativaCrud = Crud.build(SessaoLegislativa, 'sessao_legislativa') -ParlamentarCrud = Crud.build(Parlamentar, '') FiliacaoCrud = Crud.build(Filiacao, '') MandatoCrud = Crud.build(Mandato, '') TipoDependenteCrud = Crud.build(TipoDependente, 'tipo_dependente') @@ -29,6 +30,22 @@ TipoAfastamentoCrud = Crud.build(TipoAfastamento, 'tipo_afastamento') TipoMilitarCrud = Crud.build(SituacaoMilitar, 'tipo_situa_militar') +class ParlamentarCrud(Crud): + model = Parlamentar + help_path = '' + + class BaseMixin(crud.base.BaseMixin): + # TODO: partido... + list_field_names = ['nome_parlamentar', 'ativo'] + + class CreateView(crud.base.CrudCreateView): + form_class = ParlamentarCreateForm + + @property + def layout_key(self): + return 'ParlamentarCreate' + + def validate(form, parlamentar, filiacao, request): data_filiacao = form.cleaned_data['data'] data_desfiliacao = form.cleaned_data['data_desfiliacao']