From ad1483ca04b48705848807f0ce439da7c7954ff7 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Thu, 19 May 2016 11:21:10 -0300 Subject: [PATCH] Fix #375 crud composicao (#471) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Init crud composição * Muda listagem de composicao * Muda listagem de participação para detail * Cria crud de participação * Conserta links dos botões * Fix qa * Arruma links quando está no detalhe do parlamentar --- comissoes/forms.py | 69 ------- comissoes/layouts.yaml | 11 ++ comissoes/tests/test_comissoes.py | 33 +--- comissoes/urls.py | 22 +-- comissoes/views.py | 208 +++++++-------------- templates/comissoes/composicao.html | 52 ------ templates/comissoes/composicao_detail.html | 31 +++ templates/comissoes/subnav.yaml | 2 +- 8 files changed, 119 insertions(+), 309 deletions(-) delete mode 100644 templates/comissoes/composicao.html create mode 100644 templates/comissoes/composicao_detail.html diff --git a/comissoes/forms.py b/comissoes/forms.py index a3e637e1a..e69de29bb 100644 --- a/comissoes/forms.py +++ b/comissoes/forms.py @@ -1,69 +0,0 @@ -from crispy_forms.helper import FormHelper -from crispy_forms.layout import Fieldset, Layout -from django import forms -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 parlamentares.models import Filiacao - -from .models import Participacao - - -class ComposicaoForm(forms.Form): - periodo = forms.CharField() - - -class ParticipacaoCadastroForm(ModelForm): - - YES_OR_NO = ( - (True, 'Sim'), - (False, 'Não') - ) - - parlamentar_id = forms.ModelChoiceField( - label='Parlamentar', - required=True, - queryset=Filiacao.objects.filter( - data_desfiliacao__isnull=True, parlamentar__ativo=True).order_by( - 'parlamentar__nome_parlamentar'), - empty_label='Selecione', - ) - - class Meta: - model = Participacao - fields = ['parlamentar_id', - 'cargo', - 'titular', - 'data_designacao', - 'data_desligamento', - 'motivo_desligamento', - 'observacao'] - - def __init__(self, *args, **kwargs): - self.helper = FormHelper() - - row1 = crispy_layout_mixin.to_row( - [('parlamentar_id', 4), - ('cargo', 4), - ('titular', 4)]) - - row2 = crispy_layout_mixin.to_row( - [('data_designacao', 6), - ('data_desligamento', 6)]) - - row3 = crispy_layout_mixin.to_row( - [('motivo_desligamento', 12)]) - - row4 = crispy_layout_mixin.to_row( - [('observacao', 12)]) - - self.helper.layout = Layout( - Fieldset( - _('Cadastro de Parlamentar em Comissão'), - row1, row2, row3, row4 - ), - form_actions() - ) - super(ParticipacaoCadastroForm, self).__init__(*args, **kwargs) diff --git a/comissoes/layouts.yaml b/comissoes/layouts.yaml index 3a2d38a08..22ffa0f98 100644 --- a/comissoes/layouts.yaml +++ b/comissoes/layouts.yaml @@ -24,3 +24,14 @@ Comissao: Temporária: - apelido_temp:8 data_instalacao_temp - data_final_prevista_temp data_prorrogada_temp data_fim_comissao + +Composicao: + Composição: + - periodo + +Participacao: + Participação: + - parlamentar cargo titular + - data_designacao data_desligamento + - motivo_desligamento + - observacao diff --git a/comissoes/tests/test_comissoes.py b/comissoes/tests/test_comissoes.py index 5c76c342d..bad7b45a1 100644 --- a/comissoes/tests/test_comissoes.py +++ b/comissoes/tests/test_comissoes.py @@ -44,44 +44,17 @@ def make_filiacao(): return Filiacao.objects.first() -@pytest.mark.django_db(transaction=False) -def test_incluir_parlamentar_submit(client): - comissao = make_comissao() - composicao = make_composicao(comissao) - filiacao = make_filiacao() - cargo = mommy.make(CargoComissao, - nome='Cargo', - unico=True) - - response = client.post(reverse('comissoes:comissao_parlamentar', - kwargs={'pk': comissao.pk, - 'id': composicao.pk}), - {'parlamentar_id': filiacao.pk, - 'cargo': cargo.pk, - 'data_designacao': '2016-03-22', - 'titular': True, - 'salvar': 'salvar'}, - follow=True) - assert response.status_code == 200 - - participacao = Participacao.objects.first() - assert participacao.parlamentar == filiacao.parlamentar - assert participacao.cargo.nome == 'Cargo' - assert participacao.composicao == composicao - - @pytest.mark.django_db(transaction=False) def test_incluir_parlamentar_errors(client): comissao = make_comissao() composicao = make_composicao(comissao) - response = client.post(reverse('comissoes:comissao_parlamentar', - kwargs={'pk': comissao.pk, - 'id': composicao.pk}), + response = client.post(reverse('comissoes:participacao_create', + kwargs={'pk': composicao.pk}), {'salvar': 'salvar'}, follow=True) - assert (response.context_data['form'].errors['parlamentar_id'] == + assert (response.context_data['form'].errors['parlamentar'] == ['Este campo é obrigatório.']) assert (response.context_data['form'].errors['cargo'] == ['Este campo é obrigatório.']) diff --git a/comissoes/urls.py b/comissoes/urls.py index edefa5efd..075d3604d 100644 --- a/comissoes/urls.py +++ b/comissoes/urls.py @@ -1,31 +1,21 @@ from django.conf.urls import include, url -from comissoes.views import (CargoCrud, ComissaoCrud, - ComissaoParlamentarEditView, - ComissaoParlamentarIncluirView, ComposicaoView, - MateriasTramitacaoListView, PeriodoComposicaoCrud, - TipoComissaoCrud) +from comissoes.views import (CargoCrud, ComissaoCrud, ComposicaoCrud, + MateriasTramitacaoListView, ParticipacaoCrud, + PeriodoComposicaoCrud, TipoComissaoCrud) from .apps import AppConfig app_name = AppConfig.name urlpatterns = [ - url(r'^comissao/', include(ComissaoCrud.get_urls())), + url(r'^comissao/', include(ComissaoCrud.get_urls() + + ComposicaoCrud.get_urls() + + ParticipacaoCrud.get_urls())), - url(r'^comissao/(?P\d+)/composicao$', - ComposicaoView.as_view(), name='composicao'), url(r'^comissao/(?P\d+)/materias-em-tramitacao$', MateriasTramitacaoListView.as_view(), name='materias_em_tramitacao'), - url(r'^comissao/(?P\d+)/composicao/(?P\d+)/parlamentar$', - ComissaoParlamentarIncluirView.as_view(), - name='comissao_parlamentar'), - url(r'''^comissao/(?P\d+)/composicao/(?P\d+)/ - parlamentar/(?P\d+)/edit$''', - ComissaoParlamentarEditView.as_view(), - name='comissao_parlamentar_edit'), - url(r'^sistema/comissao/cargo/', include(CargoCrud.get_urls())), url(r'^sistema/comissao/periodo-composicao/', include(PeriodoComposicaoCrud.get_urls())), diff --git a/comissoes/views.py b/comissoes/views.py index 09bdd137d..4b4cacc96 100644 --- a/comissoes/views.py +++ b/comissoes/views.py @@ -1,14 +1,12 @@ -from django.contrib import messages from django.core.urlresolvers import reverse -from django.utils.translation import ugettext_lazy as _ -from django.views.generic import FormView, ListView +from django.views.generic import ListView import crud.base +import crud.masterdetail from crud.base import Crud +from crud.masterdetail import MasterDetailCrud from materia.models import Tramitacao -from parlamentares.models import Filiacao -from .forms import ComposicaoForm, ParticipacaoCadastroForm from .models import (CargoComissao, Comissao, Composicao, Participacao, Periodo, TipoComissao) @@ -17,6 +15,70 @@ PeriodoComposicaoCrud = Crud.build(Periodo, 'periodo_composicao_comissao') TipoComissaoCrud = Crud.build(TipoComissao, 'tipo_comissao') +def pegar_url_composicao(pk): + participacao = Participacao.objects.get(id=pk) + comp_pk = participacao.composicao.pk + url = reverse('comissoes:composicao_detail', kwargs={'pk': comp_pk}) + return url + + +class ParticipacaoCrud(MasterDetailCrud): + model = Participacao + parent_field = 'composicao' + help_path = '' + + class DetailView(MasterDetailCrud.DetailView): + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + context = self.get_context_data(object=self.object) + context['root_pk'] = self.object.composicao.comissao.pk + return self.render_to_response(context) + + class CreateView(MasterDetailCrud.CreateView): + + def get_success_url(self): + return reverse( + 'comissoes:composicao_detail', kwargs={'pk': self.kwargs['pk']} + ) + + def cancel_url(self): + return reverse( + 'comissoes:composicao_detail', kwargs={'pk': self.kwargs['pk']} + ) + + class UpdateView(MasterDetailCrud.UpdateView): + + def get_success_url(self): + return pegar_url_composicao(self.kwargs['pk']) + + def cancel_url(self): + return pegar_url_composicao(self.kwargs['pk']) + + class DeleteView(MasterDetailCrud.DeleteView): + + def get_success_url(self): + return pegar_url_composicao(self.kwargs['pk']) + + def cancel_url(self): + return pegar_url_composicao(self.kwargs['pk']) + + +class ComposicaoCrud(MasterDetailCrud): + model = Composicao + parent_field = 'comissao' + help_path = '' + + class DetailView(MasterDetailCrud.DetailView): + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + context = self.get_context_data(object=self.object) + composicao = Composicao.objects.get(id=self.kwargs['pk']) + context['participacoes'] = composicao.participacao_set.all() + return self.render_to_response(context) + + class ComissaoCrud(Crud): model = Comissao help_path = 'modulo_comissoes' @@ -25,142 +87,6 @@ class ComissaoCrud(Crud): list_field_names = ['nome', 'sigla', 'tipo', 'data_criacao'] -class ComposicaoView(FormView): - template_name = 'comissoes/composicao.html' - - def get(self, request, *args, **kwargs): - form = ComposicaoForm() - composicoes = Composicao.objects.filter( - comissao_id=self.kwargs['pk']).order_by('-periodo') - participacoes = Participacao.objects.all().order_by('parlamentar') - - if composicoes: - composicao_id = composicoes.first().id - msg = '' - else: - composicao_id = 0 - msg = _('Ainda não há uma composição formada!') - messages.add_message(request, messages.INFO, msg) - - return self.render_to_response({ - 'participacoes': participacoes, - 'composicoes': composicoes, - 'composicao_id': composicao_id, - 'form': form, - 'pk': self.kwargs['pk'], - 'object': Comissao.objects.get(id=self.kwargs['pk'])}) - - def post(self, request, *args, **kwargs): - form = ComposicaoForm(request.POST) - - composicoes = Composicao.objects.filter( - comissao_id=self.kwargs['pk']).order_by('-periodo') - participacoes = Participacao.objects.all() - - return self.render_to_response({ - 'participacoes': participacoes, - 'composicoes': composicoes, - 'composicao_id': int(form.data['periodo']), - 'form': form, - 'pk': self.kwargs['pk'], - 'object': Comissao.objects.get(id=self.kwargs['pk'])}) - - -class ComissaoParlamentarIncluirView(FormView): - template_name = "comissoes/comissao_parlamentar.html" - - def get(self, request, *args, **kwargs): - form = ParticipacaoCadastroForm() - comissao = Comissao.objects.get(id=self.kwargs['pk']) - return self.render_to_response({'form': form, - 'composicao_id': self.kwargs['id'], - 'comissao': comissao}) - - def post(self, request, *args, **kwargs): - composicao = Composicao.objects.get(id=self.kwargs['id']) - form = ParticipacaoCadastroForm(request.POST) - comissao = Comissao.objects.get(id=self.kwargs['pk']) - - if form.is_valid(): - cargo = form.cleaned_data['cargo'] - if cargo.nome == 'Presidente': - for p in Participacao.objects.filter(composicao=composicao): - if p.cargo.nome == 'Presidente': - msg = _('Esse cargo já está sendo ocupado!') - messages.add_message(request, messages.INFO, msg) - return self.render_to_response( - {'form': form, - 'composicao_id': self.kwargs['id'], - 'comissao': comissao}) - else: - # Pensar em forma melhor para não duplicar código - participacao = form.save(commit=False) - participacao.composicao = composicao - participacao.parlamentar = ( - form.cleaned_data['parlamentar_id'].parlamentar) - - participacao.save() - else: - participacao = form.save(commit=False) - participacao.composicao = composicao - participacao.parlamentar = ( - form.cleaned_data['parlamentar_id'].parlamentar) - - participacao.save() - return self.form_valid(form) - else: - return self.render_to_response( - {'form': form, - 'composicao_id': self.kwargs['id'], - 'comissao': comissao}) - - def get_success_url(self): - pk = self.kwargs['pk'] - return reverse('comissoes:composicao', kwargs={'pk': pk}) - - -class ComissaoParlamentarEditView(FormView): - template_name = "comissoes/comissao_parlamentar_edit.html" - - def get(self, request, *args, **kwargs): - participacao_id = kwargs['id'] - participacao = Participacao.objects.get(id=participacao_id) - comissao = Comissao.objects.get(id=self.kwargs['pk']) - id_parlamentar = Filiacao.objects.filter( - parlamentar__id=participacao.parlamentar.id).order_by('data') - id_parlamentar = id_parlamentar.last().id - form = ParticipacaoCadastroForm( - initial={'parlamentar_id': id_parlamentar}, - instance=participacao) - return self.render_to_response({'form': form, - 'comissao': comissao, - 'composicao_id': self.kwargs['id']}) - - def post(self, request, *args, **kwargs): - form = ParticipacaoCadastroForm(request.POST) - if form.is_valid(): - participacao = ParticipacaoCadastroForm( - request.POST, - request.FILES, - instance=Participacao.objects.get(id=kwargs['id']) - ).save(commit=False) - - participacao.composicao = Composicao.objects.get( - id=kwargs['cd']) - participacao.parlamentar = ( - form.cleaned_data['parlamentar_id'].parlamentar) - participacao.save() - return self.form_valid(form) - else: - return self.render_to_response( - {'form': form, - 'composicao_id': self.kwargs['id']}) - - def get_success_url(self): - pk = self.kwargs['pk'] - return reverse('comissoes:composicao', kwargs={'pk': pk}) - - class MateriasTramitacaoListView(ListView): template_name = "comissoes/materias_em_tramitacao.html" paginate_by = 10 diff --git a/templates/comissoes/composicao.html b/templates/comissoes/composicao.html deleted file mode 100644 index ff6569780..000000000 --- a/templates/comissoes/composicao.html +++ /dev/null @@ -1,52 +0,0 @@ -{% extends "crud/detail.html" %} -{% load i18n %} -{% load crispy_forms_tags %} -{% block actions %} {% endblock %} -{% block detail_content %} - - {% if composicao_id != 0 %} - - - - - - - - - - - - - - - - {% csrf_token %} - - -
- {% for participacao in participacoes %} - {% if participacao.composicao_id == composicao_id %} - - - - - - - - - - {% endif %} - {% endfor %} - -
NomeCargoTitularDesignaçãoDesligamentoMotivoObservação
{{participacao.parlamentar.nome_parlamentar}}{{participacao.cargo}}{{participacao.titular|yesno:"Sim,Não"}}{{participacao.data_designacao|date:"d/m/Y"}}{{participacao.data_desligamento|date:"d/m/Y"|default:"-"}}{{participacao.motivo_desligamento|default:"-"}}{{participacao.observacao|default:"-"}}
- - Incluir Parlamentar - {% endif %} - -{% endblock detail_content %} diff --git a/templates/comissoes/composicao_detail.html b/templates/comissoes/composicao_detail.html new file mode 100644 index 000000000..bacfef3de --- /dev/null +++ b/templates/comissoes/composicao_detail.html @@ -0,0 +1,31 @@ +{% extends "crud/detail.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% block detail_content %} + + + + + + + + + + + + + {% for participacao in participacoes %} + + + + + + + + + + {% endfor %} +
NomeCargoTitularDesignaçãoDesligamentoMotivoObservação
{{participacao.parlamentar.nome_parlamentar}}{{participacao.cargo}}{{participacao.titular|yesno:"Sim,Não"}}{{participacao.data_designacao|date:"d/m/Y"}}{{participacao.data_desligamento|date:"d/m/Y"|default:"-"}}{{participacao.motivo_desligamento|default:"-"}}{{participacao.observacao|default:"-"}}
+ + Incluir Parlamentar +{% endblock detail_content %} diff --git a/templates/comissoes/subnav.yaml b/templates/comissoes/subnav.yaml index 97526cb9e..8ee080406 100644 --- a/templates/comissoes/subnav.yaml +++ b/templates/comissoes/subnav.yaml @@ -1,6 +1,6 @@ - title: Início url: comissao_detail - title: Composição - url: composicao + url: composicao_list - title: Matérias em Tramitação url: materias_em_tramitacao