From 7f58dc7344b211df4a63ce60f1b73946df65fd22 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 5 Apr 2016 09:43:44 -0300 Subject: [PATCH 1/6] Ajusta imports --- materia/test_materia_urls.py | 1 - 1 file changed, 1 deletion(-) diff --git a/materia/test_materia_urls.py b/materia/test_materia_urls.py index 0ff4aba0e..9814612a7 100644 --- a/materia/test_materia_urls.py +++ b/materia/test_materia_urls.py @@ -1,6 +1,5 @@ import pytest from django.core.urlresolvers import reverse -import pytest @pytest.mark.parametrize("test_input,kwargs,expected", [ From 892babda5f11135e863f58b4c0ad17823ddcf05c Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 5 Apr 2016 10:02:43 -0300 Subject: [PATCH 2/6] Usa crud simples de parlamentar como base --- parlamentares/forms.py | 154 +--------------------------- parlamentares/urls.py | 19 ++-- parlamentares/views.py | 123 +--------------------- templates/base.html | 2 +- templates/parlamentares/subnav.yaml | 2 +- 5 files changed, 10 insertions(+), 290 deletions(-) diff --git a/parlamentares/forms.py b/parlamentares/forms.py index 43377bbe6..1252e4cdc 100644 --- a/parlamentares/forms.py +++ b/parlamentares/forms.py @@ -1,165 +1,13 @@ 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.forms import ModelForm from django.utils.translation import ugettext_lazy as _ import crispy_layout_mixin from crispy_layout_mixin import form_actions -from sapl.settings import MAX_IMAGE_UPLOAD_SIZE -from .models import Dependente, Filiacao, Legislatura, Mandato, Parlamentar - - -class ParlamentaresListForm(forms.Form): - periodo = forms.CharField() - - -class ParlamentaresForm (ModelForm): - ativo = forms.TypedChoiceField( - coerce=lambda x: x == 'True', - choices=((True, 'Sim'), (False, 'Não')), - ) - - def clean_fotografia(self): - fotografia = self.cleaned_data.get('fotografia', False) - if fotografia: - if fotografia.size > MAX_IMAGE_UPLOAD_SIZE: - raise ValidationError('Imagem muito grande. ( > 2mb )') - return fotografia - - class Meta: - model = Parlamentar - fields = ['nome_parlamentar', - 'ativo', - 'nome_completo', - 'nivel_instrucao', - 'sexo', - 'cpf', - 'rg', - 'titulo_eleitor', - 'data_nascimento', - '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'] - - 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("""
- {% if not form.fotografia.errors %} - {% if form.fotografia.value %} - -

- - {% endif %} - {% endif %} -
""", ), - 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(' '), - Submit('excluir', 'Excluir', - css_class='btn btn-primary')]) +from .models import Dependente, Filiacao, Legislatura, Mandato class MandatoForm(ModelForm): diff --git a/parlamentares/urls.py b/parlamentares/urls.py index c7a9f922c..6e0ebb975 100644 --- a/parlamentares/urls.py +++ b/parlamentares/urls.py @@ -4,19 +4,19 @@ from parlamentares.views import (CargoMesaCrud, ColigacaoCrud, FiliacaoEditView, FiliacaoView, LegislaturaCrud, MandatoEditView, MandatoView, MesaDiretoraView, NivelInstrucaoCrud, - ParlamentaresCadastroView, + ParlamentarCrud, ParlamentaresDependentesEditView, - ParlamentaresDependentesView, - ParlamentaresEditarView, ParlamentaresView, - PartidoCrud, SessaoLegislativaCrud, - TipoAfastamentoCrud, TipoDependenteCrud, - TipoMilitarCrud) + ParlamentaresDependentesView, PartidoCrud, + SessaoLegislativaCrud, TipoAfastamentoCrud, + TipoDependenteCrud, TipoMilitarCrud) from .apps import AppConfig app_name = AppConfig.name urlpatterns = [ + url(r'^parlamentares/', include(ParlamentarCrud.get_urls())), + url(r'^sistema/parlamentares/legislatura/', include(LegislaturaCrud.get_urls())), url(r'^sistema/parlamentares/tipo-dependente/', @@ -36,10 +36,6 @@ urlpatterns = [ url(r'^sistema/mesa-diretora/cargo-mesa/', include(CargoMesaCrud.get_urls())), - url(r'^parlamentares/$', - ParlamentaresView.as_view(), name='parlamentares'), - url(r'^parlamentares/(?P\d+)/cadastro$', - ParlamentaresCadastroView.as_view(), name='parlamentares_cadastro'), url(r'^parlamentares/(?P\d+)/dependentes$', ParlamentaresDependentesView.as_view(), name='parlamentares_dependentes'), @@ -59,9 +55,6 @@ urlpatterns = [ MandatoEditView.as_view(), name='parlamentares_mandato_edit'), - url(r'^parlamentares/(?P\d+)/editar$', - ParlamentaresEditarView.as_view(), name='parlamentares_editar'), - url(r'^mesa-diretora/$', MesaDiretoraView.as_view(), name='mesa_diretora'), ] diff --git a/parlamentares/views.py b/parlamentares/views.py index f0e5ae54e..a419db2d9 100644 --- a/parlamentares/views.py +++ b/parlamentares/views.py @@ -1,5 +1,3 @@ -import os - from django.contrib import messages from django.core.urlresolvers import reverse, reverse_lazy from django.http import HttpResponseRedirect @@ -10,9 +8,7 @@ from django.views.generic import CreateView, FormView, UpdateView from crud.base import Crud from .forms import (DependenteEditForm, DependenteForm, FiliacaoEditForm, - FiliacaoForm, MandatoEditForm, MandatoForm, - ParlamentaresEditForm, ParlamentaresForm, - ParlamentaresListForm) + FiliacaoForm, MandatoEditForm, MandatoForm) from .models import (CargoMesa, Coligacao, ComposicaoMesa, Dependente, Filiacao, Legislatura, Mandato, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, SituacaoMilitar, @@ -95,123 +91,6 @@ def validate(form, parlamentar, filiacao, request): 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): template_name = "parlamentares/parlamentares_dependentes.html" form_class = DependenteForm diff --git a/templates/base.html b/templates/base.html index 85f491306..27d96c4a7 100644 --- a/templates/base.html +++ b/templates/base.html @@ -49,7 +49,7 @@ - + diff --git a/templates/parlamentares/subnav.yaml b/templates/parlamentares/subnav.yaml index bfef5bc0d..efb862f91 100644 --- a/templates/parlamentares/subnav.yaml +++ b/templates/parlamentares/subnav.yaml @@ -1,5 +1,5 @@ - title: Início - url: parlamentares_editar + url: parlamentar_detail - title: Mandatos url: parlamentares_mandato - title: Filiações Partidárias From 2de3cea10ebb55b552e16908b41a97e94f6adaa8 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 5 Apr 2016 13:45:28 -0300 Subject: [PATCH 3/6] =?UTF-8?q?Adiciona=20cria=C3=A7=C3=A3o=20de=20parlame?= =?UTF-8?q?ntar=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'] From 0802e4031741ce17c7cde175d2bee63eb3f56e2f Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Wed, 6 Apr 2016 10:30:23 -0300 Subject: [PATCH 4/6] Usa crud para listagem de parlamentares --- crud/base.py | 22 ++++--- parlamentares/views.py | 57 +++++++++++++++++-- templates/crud/list.html | 3 + .../parlamentares/parlamentares_cadastro.html | 7 --- .../parlamentares/parlamentares_detail.html | 2 +- .../parlamentares/parlamentares_list.html | 28 +-------- 6 files changed, 74 insertions(+), 45 deletions(-) delete mode 100644 templates/parlamentares/parlamentares_cadastro.html diff --git a/crud/base.py b/crud/base.py index 48bcb1e62..c14671a4d 100644 --- a/crud/base.py +++ b/crud/base.py @@ -107,6 +107,13 @@ class CrudListView(ListView): paginate_by = 10 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): return [ (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) # pagination - page_obj = context['page_obj'] - paginator = context['paginator'] - context['page_range'] = make_pagination( - page_obj.number, paginator.num_pages) + if self.paginate_by: + page_obj = context['page_obj'] + paginator = context['paginator'] + context['page_range'] = make_pagination( + page_obj.number, paginator.num_pages) # rows 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 return context diff --git a/parlamentares/views.py b/parlamentares/views.py index ab50cf8ec..03c49e68f 100644 --- a/parlamentares/views.py +++ b/parlamentares/views.py @@ -2,6 +2,7 @@ from django.contrib import messages from django.core.urlresolvers import reverse, reverse_lazy from django.http import HttpResponseRedirect 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 @@ -34,10 +35,6 @@ 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 @@ -45,6 +42,58 @@ class ParlamentarCrud(Crud): 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 = m.parlamentar.filiacao_set.last().partido.sigla + 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): data_filiacao = form.cleaned_data['data'] diff --git a/templates/crud/list.html b/templates/crud/list.html index 297be1c3d..0d98cbdd2 100644 --- a/templates/crud/list.html +++ b/templates/crud/list.html @@ -10,6 +10,9 @@ {% block more_buttons %}{% endblock more_buttons %} +

+{% block extra_content %} {% endblock %} + {% if not rows %}

{{ NO_ENTRIES_MSG }}

{% else %} diff --git a/templates/parlamentares/parlamentares_cadastro.html b/templates/parlamentares/parlamentares_cadastro.html deleted file mode 100644 index 354d3aa46..000000000 --- a/templates/parlamentares/parlamentares_cadastro.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "parlamentares/parlamentares_detail.html" %} -{% load i18n %} -{% load crispy_forms_tags %} -{% block actions %}{% endblock %} -{% block detail_content %} - {% crispy form %} -{% endblock %} \ No newline at end of file diff --git a/templates/parlamentares/parlamentares_detail.html b/templates/parlamentares/parlamentares_detail.html index 3eed3c3dd..5f2f0a8d1 100644 --- a/templates/parlamentares/parlamentares_detail.html +++ b/templates/parlamentares/parlamentares_detail.html @@ -3,7 +3,7 @@ {% block actions %}
{% if legislatura_id != 0 %} - {% trans 'Incluir Parlamentar' %} + {% trans 'Incluir Parlamentar' %} {% endif %}
{% endblock actions %} diff --git a/templates/parlamentares/parlamentares_list.html b/templates/parlamentares/parlamentares_list.html index 3d00cce02..bd8fd613d 100644 --- a/templates/parlamentares/parlamentares_list.html +++ b/templates/parlamentares/parlamentares_list.html @@ -1,10 +1,10 @@ -{% extends "parlamentares/parlamentares_detail.html" %} +{% extends "crud/list.html" %} {% load i18n %} {% load crispy_forms_tags %} -{% block detail_content %} +{% block extra_content %}
Selecione o Período -
+ {% csrf_token %} {% for l in legislaturas %}