Browse Source

Merge pull request #298 from interlegis/293-crud-de-parlamentar-com-mandato

fix #293 crud de parlamentar com mandato
pull/195/head
Marcio Mazza 9 years ago
parent
commit
3329060acf
  1. 20
      crispy_layout_mixin.py
  2. 22
      crud/base.py
  3. 167
      parlamentares/forms.py
  4. 20
      parlamentares/layouts.yaml
  5. 18
      parlamentares/models.py
  6. 33
      parlamentares/test_mandato.py
  7. 69
      parlamentares/test_parlamentares.py
  8. 19
      parlamentares/urls.py
  9. 189
      parlamentares/views.py
  10. 6
      sapl/utils.py
  11. 2
      templates/base.html
  12. 3
      templates/crud/list.html
  13. 7
      templates/parlamentares/parlamentares_cadastro.html
  14. 2
      templates/parlamentares/parlamentares_detail.html
  15. 29
      templates/parlamentares/parlamentares_list.html
  16. 2
      templates/parlamentares/subnav.yaml

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:

22
crud/base.py

@ -107,6 +107,13 @@ class CrudListView(ListView):
paginate_by = 10 paginate_by = 10
no_entries_msg = _('Nenhum registro encontrado.') no_entries_msg = _('Nenhum registro encontrado.')
def get_rows(self, object_list):
return [self._as_row(obj) for obj in object_list]
def get_headers(self):
return [self.model._meta.get_field(fieldname).verbose_name
for fieldname in self.list_field_names]
def _as_row(self, obj): def _as_row(self, obj):
return [ return [
(get_field_display(obj, name)[1], obj.pk if i == 0 else None) (get_field_display(obj, name)[1], obj.pk if i == 0 else None)
@ -117,18 +124,17 @@ class CrudListView(ListView):
context.setdefault('title', self.verbose_name_plural) context.setdefault('title', self.verbose_name_plural)
# pagination # pagination
page_obj = context['page_obj'] if self.paginate_by:
paginator = context['paginator'] page_obj = context['page_obj']
context['page_range'] = make_pagination( paginator = context['paginator']
page_obj.number, paginator.num_pages) context['page_range'] = make_pagination(
page_obj.number, paginator.num_pages)
# rows # rows
object_list = context['object_list'] object_list = context['object_list']
context['rows'] = [self._as_row(obj) for obj in object_list] context['headers'] = self.get_headers()
context['rows'] = self.get_rows(object_list)
context['headers'] = [
self.model._meta.get_field(fieldname).verbose_name
for fieldname in self.list_field_names]
context['NO_ENTRIES_MSG'] = self.no_entries_msg context['NO_ENTRIES_MSG'] = self.no_entries_msg
return context return context

167
parlamentares/forms.py

@ -1,165 +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.core.exceptions import ValidationError 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 sapl.settings import MAX_IMAGE_UPLOAD_SIZE
from .models import Dependente, Filiacao, Legislatura, Mandato, Parlamentar from .models import Dependente, Filiacao, Legislatura, Mandato, Parlamentar
class ParlamentaresListForm(forms.Form): class ParlamentarCreateForm(ModelForm):
periodo = forms.CharField()
legislatura = forms.ModelChoiceField(
class ParlamentaresForm (ModelForm): label=_('Legislatura'),
ativo = forms.TypedChoiceField( required=True,
coerce=lambda x: x == 'True', queryset=Legislatura.objects.all().order_by('-data_inicio'),
choices=((True, 'Sim'), (False, 'Não')), empty_label='----------',
) )
def clean_fotografia(self): data_expedicao_diploma = forms.DateField(
fotografia = self.cleaned_data.get('fotografia', False) label=_('Expedição do Diploma'),
if fotografia: required=True,
if fotografia.size > MAX_IMAGE_UPLOAD_SIZE: )
raise ValidationError('Imagem muito grande. ( > 2mb )')
return fotografia
class Meta: class Meta:
model = Parlamentar model = Parlamentar
fields = ['nome_parlamentar', exclude = []
'ativo',
'nome_completo', @transaction.atomic
'nivel_instrucao', def save(self, commit=True):
'sexo', parlamentar = super(ParlamentarCreateForm, self).save(commit)
'cpf', legislatura = self.cleaned_data['legislatura']
'rg', Mandato.objects.create(
'titulo_eleitor', parlamentar=parlamentar,
'data_nascimento', legislatura=legislatura,
'situacao_militar', data_fim_mandato=legislatura.data_fim,
'profissao', data_expedicao_diploma=self.cleaned_data['data_expedicao_diploma'])
'endereco_web', return parlamentar
'email',
'numero_gab_parlamentar',
'telefone',
'fax',
'endereco_residencia',
'cep_residencia',
'municipio_residencia',
'telefone_residencia',
'fax_residencia',
'locais_atuacao',
'fotografia',
'biografia']
widgets = {
'cpf': forms.TextInput(attrs={'class': 'cpf'}),
'rg': forms.TextInput(attrs={'class': 'rg'}),
'titulo_eleitor': forms.TextInput(attrs={
'class': 'titulo_eleitor'}),
'telefone': forms.TextInput(attrs={'class': 'telefone'}),
'fax': forms.TextInput(attrs={'class': 'telefone'}),
'cep_residencia': forms.TextInput(attrs={'class': 'cep'}),
'telefone_residencia': forms.TextInput(attrs={
'class': 'telefone'}),
'fax_residencia': forms.TextInput(attrs={'class': 'telefone'}),
'fotografia': forms.FileInput,
'biografia': forms.Textarea(attrs={'id': 'biografia-parlamentar'})
}
def __init__(self, *args, **kwargs):
row1 = crispy_layout_mixin.to_row(
[('nome_parlamentar', 8), ('ativo', 4)])
row2 = crispy_layout_mixin.to_row(
[('nome_completo', 12)])
row3 = crispy_layout_mixin.to_row(
[('nivel_instrucao', 4),
('sexo', 4),
('data_nascimento', 4)])
row4 = crispy_layout_mixin.to_row(
[('cpf', 4),
('rg', 4),
('titulo_eleitor', 4)])
row5 = crispy_layout_mixin.to_row(
[('situacao_militar', 6),
('profissao', 6)])
row6 = crispy_layout_mixin.to_row(
[('endereco_web', 12)])
row7 = crispy_layout_mixin.to_row(
[('email', 12)])
row8 = crispy_layout_mixin.to_row(
[('numero_gab_parlamentar', 4),
('telefone', 4),
('fax', 4)])
row9 = crispy_layout_mixin.to_row(
[('endereco_residencia', 6),
('cep_residencia', 6)])
row10 = crispy_layout_mixin.to_row(
[('municipio_residencia', 12)])
row11 = crispy_layout_mixin.to_row(
[('telefone_residencia', 6),
('fax_residencia', 6)])
row12 = crispy_layout_mixin.to_row(
[('locais_atuacao', 12)])
row13 = crispy_layout_mixin.to_row(
[('fotografia', 12)])
row14 = crispy_layout_mixin.to_row(
[('biografia', 12)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(_('Cadastro do Parlamentar'),
row1, row2, row3, row4, row5,
row6, row7, row8, row9, row10,
row11, row12, row13,
HTML("""<div class="col-md-12">
{% if not form.fotografia.errors %}
{% if form.fotografia.value %}
<img class="img-responsive" width="225" height="300"
src="{{ MEDIA_URL }}{{ form.fotografia.value }}">
<br /><br />
<input type="submit"
name="remover-foto"
id="remover-foto"
class="btn btn-warning"
value="Remover Foto"/>
{% endif %}
{% endif %}
</div>""", ),
row14,
form_actions())
)
super(ParlamentaresForm, self).__init__(
*args, **kwargs)
class ParlamentaresEditForm(ParlamentaresForm):
def __init__(self, *args, **kwargs):
super(ParlamentaresEditForm, self).__init__(
*args, **kwargs)
self.helper.layout[0][-1:] = form_actions(more=[
HTML('&nbsp;'),
Submit('excluir', 'Excluir',
css_class='btn btn-primary')])
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

18
parlamentares/models.py

@ -1,10 +1,11 @@
import datetime from datetime import datetime
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from model_utils import Choices from model_utils import Choices
from sapl.utils import UF, YES_NO_CHOICES, restringe_tipos_de_arquivo_img from sapl.utils import (UF, YES_NO_CHOICES, intervalos_tem_intersecao,
restringe_tipos_de_arquivo_img)
class Legislatura(models.Model): class Legislatura(models.Model):
@ -18,7 +19,7 @@ class Legislatura(models.Model):
def __str__(self): def __str__(self):
# XXX Usar id mesmo? Ou criar campo para nº legislatura? # XXX Usar id mesmo? Ou criar campo para nº legislatura?
current_date = datetime.datetime.now().year current_date = datetime.now().year
if(self.data_inicio.year <= current_date and if(self.data_inicio.year <= current_date and
self.data_fim.year >= current_date): self.data_fim.year >= current_date):
current = ' (%s)' % _('Atual') current = ' (%s)' % _('Atual')
@ -356,6 +357,17 @@ class Mandato(models.Model):
'parlamentar': self.parlamentar, 'legislatura': self.legislatura 'parlamentar': self.parlamentar, 'legislatura': self.legislatura
} }
def get_partidos(self):
filicacoes = Filiacao.objects.filter(
parlamentar=self.parlamentar).order_by('data')
return [f.partido.sigla
for f in filicacoes
if intervalos_tem_intersecao(
self.legislatura.data_inicio,
self.legislatura.data_fim,
f.data,
f.data_desfiliacao or datetime.max.date())]
class CargoMesa(models.Model): class CargoMesa(models.Model):
# TODO M2M ???? # TODO M2M ????

33
parlamentares/test_mandato.py

@ -0,0 +1,33 @@
from datetime import datetime
import pytest
from model_mommy import mommy
from .models import Filiacao, Legislatura, Mandato
pytestmark = pytest.mark.django_db
def data(valor):
return datetime.strptime(valor, '%Y-%m-%d').date()
def test_filiacoes():
legislatura = mommy.make(Legislatura,
data_inicio=data('2001-01-01'),
data_fim=data('2001-12-31'),
)
mandato = mommy.make(Mandato, legislatura=legislatura)
f1_fora, f2, f3, f4 = [mommy.make(Filiacao,
parlamentar=mandato.parlamentar,
data=ini,
data_desfiliacao=fim)
for ini, fim in (
(data('2000-01-01'), data('2000-12-31')),
(data('2000-01-01'), data('2001-03-01')),
(data('2001-03-02'), data('2001-10-01')),
(data('2001-10-02'), None),
)]
assert mandato.get_partidos() == [f2.partido.sigla,
f3.partido.sigla,
f4.partido.sigla]

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.'])

19
parlamentares/urls.py

@ -4,19 +4,19 @@ from parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
FiliacaoEditView, FiliacaoView, FiliacaoEditView, FiliacaoView,
LegislaturaCrud, MandatoEditView, MandatoView, LegislaturaCrud, MandatoEditView, MandatoView,
MesaDiretoraView, NivelInstrucaoCrud, MesaDiretoraView, NivelInstrucaoCrud,
ParlamentaresCadastroView, ParlamentarCrud,
ParlamentaresDependentesEditView, ParlamentaresDependentesEditView,
ParlamentaresDependentesView, ParlamentaresDependentesView, PartidoCrud,
ParlamentaresEditarView, ParlamentaresView, SessaoLegislativaCrud, TipoAfastamentoCrud,
PartidoCrud, SessaoLegislativaCrud, TipoDependenteCrud, TipoMilitarCrud)
TipoAfastamentoCrud, TipoDependenteCrud,
TipoMilitarCrud)
from .apps import AppConfig from .apps import AppConfig
app_name = AppConfig.name app_name = AppConfig.name
urlpatterns = [ urlpatterns = [
url(r'^parlamentares/', include(ParlamentarCrud.get_urls())),
url(r'^sistema/parlamentares/legislatura/', url(r'^sistema/parlamentares/legislatura/',
include(LegislaturaCrud.get_urls())), include(LegislaturaCrud.get_urls())),
url(r'^sistema/parlamentares/tipo-dependente/', url(r'^sistema/parlamentares/tipo-dependente/',
@ -36,10 +36,6 @@ urlpatterns = [
url(r'^sistema/mesa-diretora/cargo-mesa/', url(r'^sistema/mesa-diretora/cargo-mesa/',
include(CargoMesaCrud.get_urls())), include(CargoMesaCrud.get_urls())),
url(r'^parlamentares/$',
ParlamentaresView.as_view(), name='parlamentares'),
url(r'^parlamentares/(?P<pk>\d+)/cadastro$',
ParlamentaresCadastroView.as_view(), name='parlamentares_cadastro'),
url(r'^parlamentares/(?P<pk>\d+)/dependentes$', url(r'^parlamentares/(?P<pk>\d+)/dependentes$',
ParlamentaresDependentesView.as_view(), ParlamentaresDependentesView.as_view(),
name='parlamentares_dependentes'), name='parlamentares_dependentes'),
@ -59,9 +55,6 @@ urlpatterns = [
MandatoEditView.as_view(), MandatoEditView.as_view(),
name='parlamentares_mandato_edit'), name='parlamentares_mandato_edit'),
url(r'^parlamentares/(?P<pk>\d+)/editar$',
ParlamentaresEditarView.as_view(), name='parlamentares_editar'),
url(r'^mesa-diretora/$', url(r'^mesa-diretora/$',
MesaDiretoraView.as_view(), name='mesa_diretora'), MesaDiretoraView.as_view(), name='mesa_diretora'),
] ]

189
parlamentares/views.py

@ -1,18 +1,17 @@
import os
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse, reverse_lazy from django.core.urlresolvers import reverse, reverse_lazy
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.datastructures import MultiValueDictKeyError
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,
ParlamentaresEditForm, ParlamentaresForm, ParlamentarCreateForm)
ParlamentaresListForm)
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,
@ -24,7 +23,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')
@ -33,6 +31,70 @@ 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 CreateView(crud.base.CrudCreateView):
form_class = ParlamentarCreateForm
@property
def layout_key(self):
return 'ParlamentarCreate'
class ListView(crud.base.CrudListView):
template_name = "parlamentares/parlamentares_list.html"
paginate_by = None
def take_legislatura_id(self):
legislaturas = Legislatura.objects.all().order_by(
'-data_inicio', '-data_fim')
try:
legislatura_id = int(self.request.GET['periodo'])
except MultiValueDictKeyError:
legislatura_id = legislaturas.first().id
return legislatura_id
def get_queryset(self):
mandatos = Mandato.objects.filter(
legislatura_id=self.take_legislatura_id())
return mandatos
def get_rows(self, object_list):
parlamentares = []
for m in object_list:
if m.parlamentar.filiacao_set.last():
partido = ', '.join(str(p) for p in m.get_partidos())
else:
partido = _('Sem Registro')
parlamentar = [
(m.parlamentar.nome_parlamentar, m.parlamentar.id),
(partido, None),
('Sim' if m.parlamentar.ativo else 'Não', None)
]
parlamentares.append(parlamentar)
return parlamentares
def get_headers(self):
return ['Parlamentar', 'Partido', 'Ativo?']
def get_context_data(self, **kwargs):
context = super(ParlamentarCrud.ListView, self
).get_context_data(**kwargs)
context.setdefault('title', self.verbose_name_plural)
# Adiciona legislatura para filtrar parlamentares
legislaturas = Legislatura.objects.all().order_by(
'-data_inicio', '-data_fim')
context['legislaturas'] = legislaturas
context['legislatura_id'] = self.take_legislatura_id()
return context
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']
@ -95,123 +157,6 @@ def validate(form, parlamentar, filiacao, request):
return True return True
class ParlamentaresView(FormView):
template_name = "parlamentares/parlamentares_list.html"
def get(self, request, *args, **kwargs):
form = ParlamentaresListForm()
if not Legislatura.objects.all():
mensagem = _('Cadastre alguma Legislatura antes'
' de cadastrar algum Parlamentar')
messages.add_message(request, messages.INFO, mensagem)
return self.render_to_response(
{'legislaturas': [],
'legislatura_id': 0,
'form': form,
})
legislaturas = Legislatura.objects.all().order_by(
'-data_inicio', '-data_fim')
mandatos = Mandato.objects.filter(
legislatura_id=legislaturas.first().id)
parlamentares = []
dict_parlamentar = {}
for m in mandatos:
if m.parlamentar.filiacao_set.last():
partido = m.parlamentar.filiacao_set.last().partido.sigla
else:
partido = _('Sem Registro')
dict_parlamentar = {
'id': m.parlamentar.id,
'nome': m.parlamentar.nome_parlamentar,
'partido': partido,
'ativo': m.parlamentar.ativo}
parlamentares.append(dict_parlamentar)
return self.render_to_response(
{'legislaturas': legislaturas,
'legislatura_id': legislaturas.first().id,
'form': form,
'parlamentares': parlamentares})
def post(self, request, *args, **kwargs):
form = ParlamentaresListForm(request.POST)
mandatos = Mandato.objects.filter(
legislatura_id=int(form.data['periodo']))
parlamentares = []
dict_parlamentar = {}
for m in mandatos:
if m.parlamentar.filiacao_set.last():
partido = m.parlamentar.filiacao_set.last().partido.sigla
else:
partido = _('Sem Registro')
dict_parlamentar = {
'id': m.parlamentar.id,
'nome': m.parlamentar.nome_parlamentar,
'partido': partido,
'ativo': m.parlamentar.ativo}
parlamentares.append(dict_parlamentar)
return self.render_to_response(
{'legislaturas': Legislatura.objects.all().order_by(
'-data_inicio', '-data_fim'),
'legislatura_id': int(form.data['periodo']),
'form': form,
'parlamentares': parlamentares})
class ParlamentaresCadastroView(CreateView):
template_name = "parlamentares/parlamentares_cadastro.html"
form_class = ParlamentaresForm
model = Parlamentar
def get_success_url(self):
return reverse('parlamentares:parlamentares')
def get_context_data(self, **kwargs):
context = super(ParlamentaresCadastroView, self).get_context_data(
**kwargs)
legislatura_id = self.kwargs['pk']
context.update({'legislatura_id': legislatura_id})
return context
def form_valid(self, form):
form.save()
return redirect(self.get_success_url())
class ParlamentaresEditarView(UpdateView):
template_name = "parlamentares/parlamentares_cadastro.html"
form_class = ParlamentaresEditForm
model = Parlamentar
success_url = reverse_lazy('parlamentares:parlamentares')
def form_valid(self, form):
parlamentar = form.instance
if 'salvar' in self.request.POST:
form.save()
elif 'excluir' in self.request.POST:
Mandato.objects.get(parlamentar=parlamentar).delete()
parlamentar.delete()
elif "remover-foto" in self.request.POST:
try:
os.unlink(parlamentar.fotografia.path)
except OSError:
pass # Should log this error!!!!!
parlamentar.fotografia = None
parlamentar.save()
return HttpResponseRedirect(self.get_success_url())
class ParlamentaresDependentesView(CreateView): class ParlamentaresDependentesView(CreateView):
template_name = "parlamentares/parlamentares_dependentes.html" template_name = "parlamentares/parlamentares_dependentes.html"
form_class = DependenteForm form_class = DependenteForm

6
sapl/utils.py

@ -184,3 +184,9 @@ restringe_tipos_de_arquivo_txt = fabrica_validador_de_tipos_de_arquivo(
TIPOS_TEXTO_PERMITIDOS, 'restringe_tipos_de_arquivo_txt') TIPOS_TEXTO_PERMITIDOS, 'restringe_tipos_de_arquivo_txt')
restringe_tipos_de_arquivo_img = fabrica_validador_de_tipos_de_arquivo( restringe_tipos_de_arquivo_img = fabrica_validador_de_tipos_de_arquivo(
TIPOS_IMG_PERMITIDOS, 'restringe_tipos_de_arquivo_img') TIPOS_IMG_PERMITIDOS, 'restringe_tipos_de_arquivo_img')
def intervalos_tem_intersecao(a_inicio, a_fim, b_inicio, b_fim):
maior_inicio = max(a_inicio, b_inicio)
menor_fim = min(a_fim, b_fim)
return maior_inicio <= menor_fim

2
templates/base.html

@ -49,7 +49,7 @@
<li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'parlamentares:mesa_diretora' %}">Mesa Diretora</a></li> <li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'parlamentares:mesa_diretora' %}">Mesa Diretora</a></li>
<li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'comissoes:comissao_list' %}">Comissões</a></li> <li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'comissoes:comissao_list' %}">Comissões</a></li>
<!-- <li class="nav__sub-item"><a class="nav__sub-link" href="#">Bancadas</a></li> --> <!-- <li class="nav__sub-item"><a class="nav__sub-link" href="#">Bancadas</a></li> -->
<li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'parlamentares:parlamentares' %}">Parlamentares</a></li> <li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'parlamentares:parlamentar_list' %}">Parlamentares</a></li>
</ul> </ul>
</li> </li>

3
templates/crud/list.html

@ -10,6 +10,9 @@
{% block more_buttons %}{% endblock more_buttons %} {% block more_buttons %}{% endblock more_buttons %}
</div> </div>
<br/><br/>
{% block extra_content %} {% endblock %}
{% if not rows %} {% if not rows %}
<p>{{ NO_ENTRIES_MSG }}</p> <p>{{ NO_ENTRIES_MSG }}</p>
{% else %} {% else %}

7
templates/parlamentares/parlamentares_cadastro.html

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

2
templates/parlamentares/parlamentares_detail.html

@ -3,7 +3,7 @@
{% block actions %} {% block actions %}
<div class="actions btn-group pull-right" role="group"> <div class="actions btn-group pull-right" role="group">
{% if legislatura_id != 0 %} {% if legislatura_id != 0 %}
<a href="{% url 'parlamentares:parlamentares_cadastro' legislatura_id %}" id="incluir-parlamentar" class="btn btn-default">{% trans 'Incluir Parlamentar' %}</a> <a href="{% url 'parlamentares:parlamentar_create'%}" id="incluir-parlamentar" class="btn btn-default">{% trans 'Incluir Parlamentar' %}</a>
{% endif %} {% endif %}
</div> </div>
{% endblock actions %} {% endblock actions %}

29
templates/parlamentares/parlamentares_list.html

@ -1,11 +1,10 @@
{% extends "parlamentares/parlamentares_detail.html" %} {% extends "crud/list.html" %}
{% load i18n %} {% load i18n %}
{% load crispy_forms_tags %} {% load crispy_forms_tags %}
{% block detail_content %} {% block extra_content %}
<fieldset class="form-group"> <fieldset class="form-group">
<legend>Selecione o Período</legend> <legend>Selecione o Período</legend>
<form method="POST"> <form method="GET">
{% csrf_token %}
<select name="periodo" class="form-control" onChange="form.submit();"> <select name="periodo" class="form-control" onChange="form.submit();">
{% for l in legislaturas %} {% for l in legislaturas %}
<option value="{{l.id}}" {% if l.id == legislatura_id %} selected {% endif %}> <option value="{{l.id}}" {% if l.id == legislatura_id %} selected {% endif %}>
@ -16,26 +15,4 @@
</form> </form>
</fieldset> </fieldset>
<br/> <br/>
<fieldset class="form-group">
<legend>Parlamentares</legend>
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<th>Nome do Parlamentar</th>
<th>Partido</th>
<th>Ativo?</th>
</tr>
</thead>
{% for p in parlamentares %}
<tr>
<td>
<a href="{% url 'parlamentares:parlamentares_editar' p.id %}"> {{p.nome}}</a>
</td>
<td>{{p.partido}}</td>
<td>{{p.ativo|yesno:"Sim,Não"}}</td>
</tr>
{% endfor %}
</table>
</fieldset>
{% endblock %} {% endblock %}

2
templates/parlamentares/subnav.yaml

@ -1,5 +1,5 @@
- title: Início - title: Início
url: parlamentares_editar url: parlamentar_detail
- title: Mandatos - title: Mandatos
url: parlamentares_mandato url: parlamentares_mandato
- title: Filiações Partidárias - title: Filiações Partidárias

Loading…
Cancel
Save