Browse Source

Merge pull request #341 from interlegis/338-Crud-Filiacao

Fix #338 crud filiacao
pull/346/head
Edward 9 years ago
parent
commit
750a7b4a72
  1. 99
      parlamentares/forms.py
  2. 4
      parlamentares/tests/test_parlamentares.py
  3. 12
      parlamentares/urls.py
  4. 160
      parlamentares/views.py
  5. 2
      protocoloadm/views.py
  6. 30
      templates/parlamentares/parlamentar_filiacao.html
  7. 7
      templates/parlamentares/parlamentar_filiacao_edit.html
  8. 2
      templates/parlamentares/subnav.yaml

99
parlamentares/forms.py

@ -1,14 +1,11 @@
from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Fieldset, Layout, Submit
from django import forms
from django.core.exceptions import ValidationError
from django.db import transaction
from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _
from floppyforms.widgets import ClearableFileInput
import crispy_layout_mixin
import sapl
from crispy_layout_mixin import form_actions
from .models import Filiacao, Legislatura, Mandato, Parlamentar
@ -53,6 +50,65 @@ class ParlamentarCreateForm(ParlamentarForm):
return parlamentar
def validate(data, data_desfiliacao, parlamentar, filiacao):
data_filiacao = data
data_desfiliacao = data_desfiliacao
# Dá erro caso a data de desfiliação seja anterior a de filiação
if data_desfiliacao and data_desfiliacao < data_filiacao:
error_msg = _("A data de desfiliação não pode anterior \
à data de filiação")
return [False, error_msg]
# Esse bloco garante que não haverá intersecção entre os
# períodos de filiação
id_filiacao_atual = filiacao.pk
todas_filiacoes = parlamentar.filiacao_set.all()
for filiacoes in todas_filiacoes:
if (not filiacoes.data_desfiliacao and
filiacoes.id != id_filiacao_atual):
error_msg = _("O parlamentar não pode se filiar a algum partido \
sem antes se desfiliar do partido anterior")
return [False, error_msg]
error_msg = None
for filiacoes in todas_filiacoes:
if filiacoes.id != id_filiacao_atual:
data_init = filiacoes.data
data_fim = filiacoes.data_desfiliacao
if data_init <= data_filiacao < data_fim:
error_msg = _("A data de filiação e \
desfiliação não podem estar no intervalo \
de outro período de filiação")
break
if (data_desfiliacao and
data_init < data_desfiliacao < data_fim):
error_msg = _("A data de filiação e \
desfiliação não podem estar no intervalo \
de outro período de filiação")
break
if (data_desfiliacao and
data_filiacao <= data_init and
data_desfiliacao >= data_fim):
error_msg = _("A data de filiação e \
desfiliação não podem estar no intervalo \
de outro período de filiação")
break
if error_msg:
return [False, error_msg]
return [True, '']
class FiliacaoForm(ModelForm):
class Meta:
@ -61,30 +117,17 @@ class FiliacaoForm(ModelForm):
'data',
'data_desfiliacao']
def __init__(self, *args, **kwargs):
row1 = crispy_layout_mixin.to_row(
[('partido', 4),
('data', 4),
('data_desfiliacao', 4)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(_('Adicionar Filiação'), row1,
form_actions())
)
super(FiliacaoForm, self).__init__(
*args, **kwargs)
def clean(self):
if self.errors:
return self.errors
class FiliacaoEditForm(FiliacaoForm):
filiacao = super(FiliacaoForm, self).save(commit=False)
validacao = validate(self.cleaned_data['data'],
self.cleaned_data['data_desfiliacao'],
filiacao.parlamentar,
filiacao)
def __init__(self, *args, **kwargs):
super(FiliacaoEditForm, self).__init__(
*args, **kwargs)
if not validacao[0]:
raise ValidationError(validacao[1])
self.helper.layout[0][-1:] = form_actions(more=[
HTML('&nbsp;'),
Submit('excluir', 'Excluir',
css_class='btn btn-primary')])
return self.cleaned_data

4
parlamentares/tests/test_parlamentares.py

@ -53,7 +53,7 @@ def test_filiacao_submit(client):
mommy.make(Parlamentar, pk=14)
mommy.make(Partido, pk=32)
client.post(reverse('parlamentares:parlamentar_filiacao',
client.post(reverse('parlamentares:filiacao_create',
kwargs={'pk': 14}),
{'partido': 32,
'data': '2016-03-22',
@ -103,7 +103,7 @@ def test_form_errors_dependente(client):
def test_form_errors_filiacao(client):
mommy.make(Parlamentar, pk=14)
response = client.post(reverse('parlamentares:parlamentar_filiacao',
response = client.post(reverse('parlamentares:filiacao_create',
kwargs={'pk': 14}),
{'partido': '',
'salvar': 'salvar'},

12
parlamentares/urls.py

@ -1,8 +1,7 @@
from django.conf.urls import include, url
from parlamentares.views import (CargoMesaCrud, ColigacaoCrud, DependenteCrud,
FiliacaoEditView, FiliacaoView,
LegislaturaCrud, MandatoCrud,
FiliacaoCrud, LegislaturaCrud, MandatoCrud,
MesaDiretoraView, NivelInstrucaoCrud,
ParlamentarCrud, PartidoCrud,
SessaoLegislativaCrud, TipoAfastamentoCrud,
@ -15,7 +14,7 @@ app_name = AppConfig.name
urlpatterns = [
url(r'^parlamentar/', include(
ParlamentarCrud.get_urls() + DependenteCrud.get_urls() +
MandatoCrud.get_urls()
FiliacaoCrud.get_urls() + MandatoCrud.get_urls()
)),
url(r'^sistema/parlamentar/legislatura/',
@ -37,13 +36,6 @@ urlpatterns = [
url(r'^sistema/mesa-diretora/cargo-mesa/',
include(CargoMesaCrud.get_urls())),
url(r'^parlamentar/(?P<pk>\d+)/filiacao$',
FiliacaoView.as_view(),
name='parlamentar_filiacao'),
url(r'^parlamentar/(?P<pk>\d+)/filiacao/(?P<dk>\d+)$',
FiliacaoEditView.as_view(),
name='parlamentar_filiacao_edit'),
url(r'^mesa-diretora/$',
MesaDiretoraView.as_view(), name='mesa_diretora'),
]

160
parlamentares/views.py

@ -1,17 +1,16 @@
from django.contrib import messages
from django.core.urlresolvers import reverse, reverse_lazy
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse_lazy
from django.shortcuts import redirect
from django.utils.datastructures import MultiValueDictKeyError
from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, FormView, UpdateView
from django.views.generic import FormView
import crud.base
import crud.masterdetail
from crud.base import Crud
from crud.masterdetail import MasterDetailCrud
from .forms import (FiliacaoEditForm, FiliacaoForm, ParlamentarCreateForm,
ParlamentarForm)
from .forms import FiliacaoForm, ParlamentarCreateForm, ParlamentarForm
from .models import (CargoMesa, Coligacao, ComposicaoMesa, Dependente,
Filiacao, Legislatura, Mandato, NivelInstrucao,
Parlamentar, Partido, SessaoLegislativa, SituacaoMilitar,
@ -22,8 +21,6 @@ LegislaturaCrud = Crud.build(Legislatura, 'tabelas_auxiliares#legislatura')
ColigacaoCrud = Crud.build(Coligacao, 'coligacao')
PartidoCrud = Crud.build(Partido, 'partidos')
SessaoLegislativaCrud = Crud.build(SessaoLegislativa, 'sessao_legislativa')
FiliacaoCrud = Crud.build(Filiacao, '')
MandatoCrud = Crud.build(Mandato, '')
TipoDependenteCrud = Crud.build(TipoDependente, 'tipo_dependente')
NivelInstrucaoCrud = Crud.build(NivelInstrucao, 'nivel_instrucao')
TipoAfastamentoCrud = Crud.build(TipoAfastamento, 'tipo_afastamento')
@ -33,6 +30,18 @@ DependenteCrud = MasterDetailCrud.build(Dependente, 'parlamentar', '')
MandatoCrud = MasterDetailCrud.build(Mandato, 'parlamentar', '')
class FiliacaoCrud(MasterDetailCrud):
model = Filiacao
parent_field = 'parlamentar'
help_path = ''
class CreateView(MasterDetailCrud.CreateView):
form_class = FiliacaoForm
class UpdateView(MasterDetailCrud.UpdateView):
form_class = FiliacaoForm
class ParlamentarCrud(Crud):
model = Parlamentar
help_path = ''
@ -100,68 +109,6 @@ class ParlamentarCrud(Crud):
return context
def validate(form, parlamentar, filiacao, request):
data_filiacao = form.cleaned_data['data']
data_desfiliacao = form.cleaned_data['data_desfiliacao']
# Dá erro caso a data de desfiliação seja anterior a de filiação
if data_desfiliacao and data_desfiliacao < data_filiacao:
error_msg = _("A data de filiação não pode anterior \
à data de desfiliação")
messages.add_message(request, messages.ERROR, error_msg)
return False
# Esse bloco garante que não haverá intersecção entre os
# períodos de filiação
id_filiacao_atual = filiacao.pk
todas_filiacoes = parlamentar.filiacao_set.all()
for filiacoes in todas_filiacoes:
if (not filiacoes.data_desfiliacao and
filiacoes.id != id_filiacao_atual):
error_msg = _("O parlamentar não pode se filiar a algum partido \
sem antes se desfiliar do partido anterior")
messages.add_message(request, messages.ERROR, error_msg)
return False
error_msg = None
for filiacoes in todas_filiacoes:
if filiacoes.id != id_filiacao_atual:
data_init = filiacoes.data
data_fim = filiacoes.data_desfiliacao
if data_init <= data_filiacao < data_fim:
error_msg = _("A data de filiação e \
desfiliação não podem estar no intervalo \
de outro período de filiação")
break
if (data_desfiliacao and
data_init < data_desfiliacao < data_fim):
error_msg = _("A data de filiação e \
desfiliação não podem estar no intervalo \
de outro período de filiação")
break
if (data_desfiliacao and
data_filiacao <= data_init and
data_desfiliacao >= data_fim):
error_msg = _("A data de filiação e \
desfiliação não podem estar no intervalo \
de outro período de filiação")
break
if error_msg:
messages.add_message(request, messages.ERROR, error_msg)
return False
else:
return True
class MesaDiretoraView(FormView):
template_name = "mesa_diretora/mesa_diretora.html"
success_url = reverse_lazy('parlamentares:mesa_diretora')
@ -274,78 +221,3 @@ class MesaDiretoraView(FormView):
'parlamentares': parlamentares_vagos,
'cargos_vagos': cargos_vagos
})
class FiliacaoView(CreateView):
template_name = "parlamentares/parlamentar_filiacao.html"
form_class = FiliacaoForm
model = Filiacao
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('parlamentares:parlamentar_filiacao',
kwargs={'pk': pk})
def get_context_data(self, **kwargs):
context = super(FiliacaoView, self).get_context_data(**kwargs)
pid = self.kwargs['pk']
parlamentar = Parlamentar.objects.get(id=pid)
filiacoes = Filiacao.objects.filter(parlamentar=parlamentar)
if len(parlamentar.mandato_set.all()) == 0:
legislatura_id = 0
else:
legislatura_id = parlamentar.mandato_set.last().legislatura.id
context.update(
{'object': parlamentar,
'filiacoes': filiacoes,
'legislatura_id': legislatura_id})
return context
def form_valid(self, form):
if 'salvar' in self.request.POST:
filiacao = form.save(commit=False)
parlamentar = Parlamentar.objects.get(id=self.kwargs['pk'])
filiacao.parlamentar = parlamentar
if not validate(form, parlamentar, filiacao, self.request):
return self.form_invalid(form)
filiacao.save()
return HttpResponseRedirect(self.get_success_url())
class FiliacaoEditView(UpdateView):
template_name = "parlamentares/parlamentar_filiacao_edit.html"
form_class = FiliacaoEditForm
model = Filiacao
pk_url_kwarg = 'dk'
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('parlamentares:parlamentar_filiacao',
kwargs={'pk': pk})
def get_context_data(self, **kwargs):
context = super(FiliacaoEditView, self).get_context_data(**kwargs)
parlamentar = Parlamentar.objects.get(id=self.kwargs['pk'])
context.update(
{'object': parlamentar,
'legislatura_id': parlamentar.mandato_set.last(
).legislatura_id})
return context
def form_valid(self, form):
filiacao = form.save(commit=False)
if 'excluir' in self.request.POST:
filiacao.delete()
elif 'salvar' in self.request.POST:
parlamentar = Parlamentar.objects.get(id=self.kwargs['pk'])
filiacao.parlamentar = parlamentar
if not validate(form, parlamentar, filiacao, self.request):
return self.form_invalid(form)
filiacao.save()
return HttpResponseRedirect(self.get_success_url())

2
protocoloadm/views.py

@ -3,7 +3,7 @@ from datetime import date, datetime
from braces.views import FormValidMessageMixin
from django.core.urlresolvers import reverse, reverse_lazy
from django.db.models import Max, Q
from django.db.models import Q, Max
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _

30
templates/parlamentares/parlamentar_filiacao.html

@ -1,30 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %}{% endblock %}
{% block detail_content %}
<h2><strong>Parlamentar: </strong>{{ object.nome_parlamentar }}</h2>
<fieldset>
<legend>Filiações</legend>
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<th><strong>Partido</strong></th>
<th><strong>Data Filiação</strong></th>
<th><strong>Data Desfiliação</strong></th>
</tr>
</thead>
{% for f in filiacoes %}
<tr>
<td><a href="{% url 'parlamentares:parlamentar_filiacao_edit' object.id f.id %}">{{f.partido.sigla}}</a></td>
<td>{{f.data}}</td>
<td>{{f.data_desfiliacao|default_if_none:""}}</td>
</tr>
{% endfor %}
</table>
</fieldset>
{% crispy form %}
{% endblock detail_content %}

7
templates/parlamentares/parlamentar_filiacao_edit.html

@ -1,7 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %}{% endblock %}
{% block detail_content %}
{% crispy form %}
{% endblock detail_content %}

2
templates/parlamentares/subnav.yaml

@ -3,6 +3,6 @@
- title: Mandatos
url: mandato_list
- title: Filiações Partidárias
url: parlamentar_filiacao
url: filiacao_list
- title: Dependentes
url: dependente_list

Loading…
Cancel
Save