Browse Source

Adiciona criação de parlamentar com mandato

Reformulado usando o crud
pull/298/head
Marcio Mazza 9 years ago
parent
commit
2de3cea10e
  1. 20
      crispy_layout_mixin.py
  2. 33
      parlamentares/forms.py
  3. 20
      parlamentares/layouts.yaml
  4. 69
      parlamentares/test_parlamentares.py
  5. 21
      parlamentares/views.py

20
crispy_layout_mixin.py

@ -67,18 +67,28 @@ def get_field_display(obj, fieldname):
class CrispyLayoutFormMixin: 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): def get_layout(self):
filename = join( filename = join(
dirname(self.model._meta.app_config.models_module.__file__), dirname(self.model._meta.app_config.models_module.__file__),
'layouts.yaml') 'layouts.yaml')
return read_layout_from_yaml(filename, self.model.__name__) return read_layout_from_yaml(filename, self.layout_key)
@property @property
def fields(self): def fields(self):
'''Returns all fields in the layout''' if hasattr(self, 'form_class') and self.form_class:
return [fieldname for legend_rows in self.get_layout() return None
for row in legend_rows[1:] else:
for fieldname, span in row] '''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): def get_form(self, form_class=None):
try: try:

33
parlamentares/forms.py

@ -1,13 +1,44 @@
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Fieldset, Layout, Submit from crispy_forms.layout import HTML, Fieldset, Layout, Submit
from django import forms from django import forms
from django.db import transaction
from django.forms import ModelForm from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import crispy_layout_mixin import crispy_layout_mixin
from crispy_layout_mixin import form_actions 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): class MandatoForm(ModelForm):

20
parlamentares/layouts.yaml

@ -42,6 +42,26 @@ Parlamentar:
- fotografia - fotografia
- biografia - 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: Filiacao:
'Filiações Partidárias ': 'Filiações Partidárias ':
- partido data data_desfiliacao - partido data data_desfiliacao

69
parlamentares/test_parlamentares.py

@ -6,26 +6,46 @@ from .models import (Dependente, Filiacao, Legislatura, Mandato, Parlamentar,
Partido, TipoDependente) Partido, TipoDependente)
# vamos refazer a funcionalidade adicionando os campos ogrigatórios de mandato
@pytest.mark.django_db(transaction=False) @pytest.mark.django_db(transaction=False)
def TODO_DESLIGADO_RELIGAR_test_cadastro_parlamentar(client): def test_cadastro_parlamentar(client):
mommy.make(Legislatura, pk=5) legislatura = mommy.make(Legislatura)
response = client.get(reverse('parlamentares:parlamentares_cadastro', url = reverse('parlamentares:parlamentar_create')
kwargs={'pk': 5})) response = client.get(url)
assert response.status_code == 200 assert response.status_code == 200
response = client.post(reverse('parlamentares:parlamentares_cadastro', response = client.post(url, {'nome_completo': 'Teresa Barbosa',
kwargs={'pk': 5}), 'nome_parlamentar': 'Terezinha',
{'nome_completo': 'Teresa Barbosa', 'sexo': 'F',
'nome_parlamentar': 'Terezinha', 'ativo': 'True',
'sexo': 'F', 'legislatura': legislatura.id,
'ativo': 'True'}, follow=True) '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 @pytest.mark.django_db(transaction=False)
if not parlamentar.ativo: def test_incluir_parlamentar_errors(client):
pytest.fail("Parlamentar deve estar ativo") 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) @pytest.mark.django_db(transaction=False)
@ -128,22 +148,3 @@ def test_form_errors_mandato(client):
['Este campo é obrigatório.']) ['Este campo é obrigatório.'])
assert (response.context_data['form'].errors['data_expedicao_diploma'] == assert (response.context_data['form'].errors['data_expedicao_diploma'] ==
['Este campo é obrigatório.']) ['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.'])

21
parlamentares/views.py

@ -5,10 +5,12 @@ from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, FormView, UpdateView from django.views.generic import CreateView, FormView, UpdateView
import crud.base
from crud.base import Crud from crud.base import Crud
from .forms import (DependenteEditForm, DependenteForm, FiliacaoEditForm, from .forms import (DependenteEditForm, DependenteForm, FiliacaoEditForm,
FiliacaoForm, MandatoEditForm, MandatoForm) FiliacaoForm, MandatoEditForm, MandatoForm,
ParlamentarCreateForm)
from .models import (CargoMesa, Coligacao, ComposicaoMesa, Dependente, from .models import (CargoMesa, Coligacao, ComposicaoMesa, Dependente,
Filiacao, Legislatura, Mandato, NivelInstrucao, Filiacao, Legislatura, Mandato, NivelInstrucao,
Parlamentar, Partido, SessaoLegislativa, SituacaoMilitar, Parlamentar, Partido, SessaoLegislativa, SituacaoMilitar,
@ -20,7 +22,6 @@ ColigacaoCrud = Crud.build(Coligacao, 'coligacao')
PartidoCrud = Crud.build(Partido, 'partidos') PartidoCrud = Crud.build(Partido, 'partidos')
DependenteCrud = Crud.build(Dependente, '') DependenteCrud = Crud.build(Dependente, '')
SessaoLegislativaCrud = Crud.build(SessaoLegislativa, 'sessao_legislativa') SessaoLegislativaCrud = Crud.build(SessaoLegislativa, 'sessao_legislativa')
ParlamentarCrud = Crud.build(Parlamentar, '')
FiliacaoCrud = Crud.build(Filiacao, '') FiliacaoCrud = Crud.build(Filiacao, '')
MandatoCrud = Crud.build(Mandato, '') MandatoCrud = Crud.build(Mandato, '')
TipoDependenteCrud = Crud.build(TipoDependente, 'tipo_dependente') TipoDependenteCrud = Crud.build(TipoDependente, 'tipo_dependente')
@ -29,6 +30,22 @@ TipoAfastamentoCrud = Crud.build(TipoAfastamento, 'tipo_afastamento')
TipoMilitarCrud = Crud.build(SituacaoMilitar, 'tipo_situa_militar') 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): def validate(form, parlamentar, filiacao, request):
data_filiacao = form.cleaned_data['data'] data_filiacao = form.cleaned_data['data']
data_desfiliacao = form.cleaned_data['data_desfiliacao'] data_desfiliacao = form.cleaned_data['data_desfiliacao']

Loading…
Cancel
Save