Browse Source

Fix #375 crud composicao (#471)

* 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
pull/480/head
Eduardo Edson Batista Cordeiro Alves 9 years ago
committed by Edward
parent
commit
ad1483ca04
  1. 69
      comissoes/forms.py
  2. 11
      comissoes/layouts.yaml
  3. 33
      comissoes/tests/test_comissoes.py
  4. 22
      comissoes/urls.py
  5. 208
      comissoes/views.py
  6. 52
      templates/comissoes/composicao.html
  7. 31
      templates/comissoes/composicao_detail.html
  8. 2
      templates/comissoes/subnav.yaml

69
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)

11
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

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

22
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<pk>\d+)/composicao$',
ComposicaoView.as_view(), name='composicao'),
url(r'^comissao/(?P<pk>\d+)/materias-em-tramitacao$',
MateriasTramitacaoListView.as_view(), name='materias_em_tramitacao'),
url(r'^comissao/(?P<pk>\d+)/composicao/(?P<id>\d+)/parlamentar$',
ComissaoParlamentarIncluirView.as_view(),
name='comissao_parlamentar'),
url(r'''^comissao/(?P<pk>\d+)/composicao/(?P<cd>\d+)/
parlamentar/(?P<id>\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())),

208
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

52
templates/comissoes/composicao.html

@ -1,52 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %} {% endblock %}
{% block detail_content %}
{% if composicao_id != 0 %}
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<th>Nome</th>
<th>Cargo</th>
<th>Titular</th>
<th>Designação</th>
<th>Desligamento</th>
<th>Motivo</th>
<th>Observação</th>
</tr>
</thead>
<form method="POST">
{% csrf_token %}
<select id="periodo" name="periodo" class="form-control" onChange="form.submit();">
{% for c in composicoes %}
<option value="{{c.id}}" {% if composicao_id == c.id %} selected {% endif %}>
{{ c.periodo.data_inicio|date:"d/m/Y" }} - {{ c.periodo.data_fim|date:"d/m/Y" }}
</option>
{% endfor %}
</select>
</form>
<br />
{% for participacao in participacoes %}
{% if participacao.composicao_id == composicao_id %}
<tr>
<td><a href="{% url 'comissoes:comissao_parlamentar_edit' pk composicao_id participacao.id %}">{{participacao.parlamentar.nome_parlamentar}}</a></td>
<td>{{participacao.cargo}}</td>
<td>{{participacao.titular|yesno:"Sim,Não"}}</td>
<td>{{participacao.data_designacao|date:"d/m/Y"}}</td>
<td>{{participacao.data_desligamento|date:"d/m/Y"|default:"-"}}</td>
<td>{{participacao.motivo_desligamento|default:"-"}}</td>
<td>{{participacao.observacao|default:"-"}}</td>
</tr>
{% endif %}
{% endfor %}
</table>
<a href="{% url 'comissoes:comissao_parlamentar' pk composicao_id %}" class="btn btn-primary">Incluir Parlamentar</a>
{% endif %}
{% endblock detail_content %}

31
templates/comissoes/composicao_detail.html

@ -0,0 +1,31 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<table class="table table-striped">
<thead class="thead-default">
<tr>
<th>Nome</th>
<th>Cargo</th>
<th>Titular</th>
<th>Designação</th>
<th>Desligamento</th>
<th>Motivo</th>
<th>Observação</th>
</tr>
</thead>
{% for participacao in participacoes %}
<tr>
<td><a href="{% url 'comissoes:participacao_detail' participacao.pk %}">{{participacao.parlamentar.nome_parlamentar}}</a></td>
<td>{{participacao.cargo}}</td>
<td>{{participacao.titular|yesno:"Sim,Não"}}</td>
<td>{{participacao.data_designacao|date:"d/m/Y"}}</td>
<td>{{participacao.data_desligamento|date:"d/m/Y"|default:"-"}}</td>
<td>{{participacao.motivo_desligamento|default:"-"}}</td>
<td>{{participacao.observacao|default:"-"}}</td>
</tr>
{% endfor %}
</table>
<a href="{% url 'comissoes:participacao_create' composicao.pk %}" class="btn btn-primary">Incluir Parlamentar</a>
{% endblock detail_content %}

2
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

Loading…
Cancel
Save