Browse Source

Fix #446 crud matéria expediente (#448)

* Init crud explicações pessoais

* Ordena listagem por ordem de pronunciamento e nome do parlamentar

* Crud orador expediente

* Remove duplicidade do crud

* Fix qa

* Remove templates não utilizados

* Init crud expediente matéria

* Coloca botão de abrir/registrar votação

* Muda urls de sucesso das votações

* Adiciona link para cancelar votação

* Muda resultado ao cancelar votação
pull/447/head
Eduardo Edson Batista Cordeiro Alves 9 years ago
committed by Edward
parent
commit
51ad1e50c4
  1. 20
      materia/forms.py
  2. 30
      materia/views.py
  3. 2
      parlamentares/forms.py
  4. 2
      parlamentares/views.py
  5. 67
      sessao/forms.py
  6. 21
      sessao/layouts.yaml
  7. 38
      sessao/urls.py
  8. 706
      sessao/views.py
  9. 21
      templates/sessao/delete_explicacao.html
  10. 21
      templates/sessao/delete_orador.html
  11. 39
      templates/sessao/edit_explicacao.html
  12. 39
      templates/sessao/edit_orador.html
  13. 70
      templates/sessao/explicacao.html
  14. 70
      templates/sessao/orador_expediente.html
  15. 6
      templates/sessao/subnav.yaml

20
materia/forms.py

@ -146,26 +146,6 @@ class RelatoriaForm(ModelForm):
return cleaned_data
class Meta:
model = Relatoria
fields = ['data_designacao_relator', 'comissao', 'parlamentar',
'data_destituicao_relator', 'tipo_fim_relatoria']
widgets = {'comissao': forms.Select(attrs={'disabled': 'disabled'})}
def clean(self):
cleaned_data = self.cleaned_data
try:
comissao = Comissao.objects.get(id=self.initial['comissao'])
except ObjectDoesNotExist:
msg = _('A localização atual deve ser uma comissão.')
raise ValidationError(msg)
else:
cleaned_data['comissao'] = comissao
return cleaned_data
class TramitacaoForm(ModelForm):

30
materia/views.py

@ -1,7 +1,6 @@
from datetime import datetime
from random import choice
from string import ascii_letters, digits
from crispy_layout_mixin import form_actions
from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Button
@ -133,35 +132,6 @@ class RelatoriaCrud(MasterDetailCrud):
form_class = RelatoriaForm
class RelatoriaCrud(MasterDetailCrud):
model = Relatoria
parent_field = 'materia'
help_path = ''
class CreateView(MasterDetailCrud.CreateView):
form_class = RelatoriaForm
def get_initial(self):
materia = MateriaLegislativa.objects.get(id=self.kwargs['pk'])
loc_atual = Tramitacao.objects.filter(
materia=materia).last()
if loc_atual is None:
localizacao = 0
else:
comissao = loc_atual.unidade_tramitacao_destino.comissao
if comissao:
localizacao = comissao.pk
else:
localizacao = 0
return {'comissao': localizacao}
class UpdateView(MasterDetailCrud.UpdateView):
form_class = RelatoriaForm
class TramitacaoCrud(MasterDetailCrud):
model = Tramitacao
parent_field = 'materia'

2
parlamentares/forms.py

@ -71,7 +71,7 @@ def validar_datas(data_filiacao, data_desfiliacao, parlamentar, filiacao):
ultima_filiacao = todas_filiacoes.last()
# Se ultima filiacao aberta e insercao posterior a esta filiacao
if (not ultima_filiacao.data_desfiliacao and
data_filiacao >= ultima_filiacao.data):
data_filiacao >= ultima_filiacao.data):
error_msg = _("O parlamentar não pode se filiar \
a novo partido sem antes se \
desfiliar do partido anterior")

2
parlamentares/views.py

@ -28,6 +28,7 @@ TipoMilitarCrud = Crud.build(SituacaoMilitar, 'tipo_situa_militar')
DependenteCrud = MasterDetailCrud.build(Dependente, 'parlamentar', '')
class MandatoCrud(MasterDetailCrud):
model = Mandato
parent_field = 'parlamentar'
@ -36,6 +37,7 @@ class MandatoCrud(MasterDetailCrud):
class ListView(MasterDetailCrud.ListView):
ordering = ('-legislatura__data_inicio')
class FiliacaoCrud(MasterDetailCrud):
model = Filiacao
parent_field = 'parlamentar'

67
sessao/forms.py

@ -1,5 +1,60 @@
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.forms import ModelForm
from .models import ExpedienteMateria
from materia.models import TipoMateriaLegislativa, MateriaLegislativa
from datetime import datetime
from django.core.exceptions import ObjectDoesNotExist, ValidationError
class ExpedienteMateriaForm(ModelForm):
tipo_materia = forms.ModelChoiceField(
label=_('Tipo Matéria'),
required=True,
queryset=TipoMateriaLegislativa.objects.all(),
empty_label='Selecione',
)
numero_materia = forms.CharField(
label='Número Matéria', required=True)
ano_materia = forms.CharField(
label='Ano Matéria', required=True)
data_ordem = forms.CharField(
initial=datetime.now().strftime('%d/%m/%Y'),
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
class Meta:
model = ExpedienteMateria
fields = ['data_ordem', 'numero_ordem', 'tipo_materia', 'observacao',
'numero_materia', 'ano_materia', 'tipo_votacao']
def clean_data_ordem(self):
return datetime.now()
def clean(self):
cleaned_data = self.cleaned_data
try:
materia = MateriaLegislativa.objects.get(
numero=self.cleaned_data['numero_materia'],
ano=self.cleaned_data['ano_materia'],
tipo=self.cleaned_data['tipo_materia'])
except ObjectDoesNotExist:
msg = _('A matéria a ser inclusa não existe no cadastro'
' de matérias legislativas.')
raise ValidationError(msg)
else:
cleaned_data['materia'] = materia
return cleaned_data
def save(self, commit=False):
expediente = super(ExpedienteMateriaForm, self).save(commit)
expediente.materia = self.cleaned_data['materia']
expediente.save()
return expediente
class PresencaForm(forms.Form):
@ -28,18 +83,6 @@ class MateriaOrdemDiaForm(forms.Form):
error_message = forms.CharField(required=False, label=_('Matéria'))
class OradorForm(forms.Form):
numero_ordem = forms.IntegerField(
required=True,
label=_('Ordem de pronunciamento'))
parlamentar = forms.CharField(required=False, max_length=20)
url_discurso = forms.CharField(required=False, max_length=100)
class OradorDeleteForm(forms.Form):
pass
class MesaForm(forms.Form):
parlamentar = forms.IntegerField(required=True)
cargo = forms.IntegerField(required=True)

21
sessao/layouts.yaml

@ -39,3 +39,24 @@ RegistroVotacao:
- votacao_branco_FIXME ind_votacao_presidente_FIXME
- tipo_resultado_votacao
- observacao
Orador:
Orador das Explicações Pessoais:
- numero_ordem parlamentar url_discurso
OradorExpediente:
Orador do Expediente:
- numero_ordem parlamentar url_discurso
ExpedienteMateria:
Matéria do Expediente:
- data_ordem numero_ordem
- tipo_materia numero_materia ano_materia
- tipo_votacao
- observacao
ExpedienteMateriaDetail:
Matérias do Expediente:
- materia
- tipo_votacao
- observacao

38
sessao/urls.py

@ -2,13 +2,11 @@ from django.conf.urls import include, url
from django.views.static import serve
from sapl import settings
from sessao.views import (EditExpedienteOrdemDiaView, EditMateriaOrdemDiaView,
ExpedienteOrdemDiaView, ExpedienteView,
ExplicacaoDelete, ExplicacaoEdit, ExplicacaoView,
ListExpedienteOrdemDiaView, ListMateriaOrdemDiaView,
MateriaOrdemDiaView, MesaView,
OradorExpedienteDelete, OradorExpedienteEdit,
OradorExpedienteView, PainelView,
from sessao.views import (EditMateriaOrdemDiaView,
ExpedienteView,
ListMateriaOrdemDiaView,
MateriaOrdemDiaView, MesaView, OradorCrud,
OradorExpedienteCrud, PainelView,
PautaExpedienteDetail, PautaOrdemDetail,
PautaSessaoDetailView, PautaSessaoListView,
PresencaOrdemDiaView, PresencaView, ResumoView,
@ -18,7 +16,7 @@ from sessao.views import (EditExpedienteOrdemDiaView, EditMateriaOrdemDiaView,
VotacaoExpedienteView, VotacaoNominalEditView,
VotacaoNominalExpedienteEditView,
VotacaoNominalExpedienteView, VotacaoNominalView,
VotacaoView)
VotacaoView, ExpedienteMateriaCrud, abrir_votacao_view)
from .apps import AppConfig
@ -29,7 +27,11 @@ sessao_rest = [
]
urlpatterns = [
url(r'^sessao/', include(SessaoCrud.get_urls())),
url(r'^sessao/', include(SessaoCrud.get_urls() + OradorCrud.get_urls() +
OradorExpedienteCrud.get_urls() + ExpedienteMateriaCrud.get_urls())),
url(r'^(?P<pk>\d+)/(?P<spk>\d+)/abrir-votacao$', abrir_votacao_view,
name="abrir_votacao"),
url(r'^media/(?P<path>.*)$', serve,
{'document_root': settings.MEDIA_ROOT}),
@ -61,12 +63,6 @@ urlpatterns = [
url(r'^(?P<pk>\d+)/presencaordemdia$',
PresencaOrdemDiaView.as_view(),
name='presencaordemdia'),
url(r'^(?P<pk>\d+)/oradorexpediente$',
OradorExpedienteView.as_view(), name='oradorexpediente'),
url(r'^(?P<pk>\d+)/oradorexpediente/excluir/(?P<oid>\d+)$',
OradorExpedienteDelete.as_view(), name='oradorexcluir'),
url(r'^(?P<pk>\d+)/oradorexpediente/editar/(?P<oid>\d+)$',
OradorExpedienteEdit.as_view(), name='oradoreditar'),
url(r'^(?P<pk>\d+)/mesa$', MesaView.as_view(), name='mesa'),
url(r'^(?P<pk>\d+)/materiaordemdia/list$',
ListMateriaOrdemDiaView.as_view(), name='materiaordemdia_list'),
@ -76,20 +72,8 @@ urlpatterns = [
EditMateriaOrdemDiaView.as_view(), name='materiaordemdia_edit'),
url(r'^(?P<pk>\d+)/materiaordemdia/create$',
MateriaOrdemDiaView.as_view(), name='materiaordemdia_create'),
url(r'^(?P<pk>\d+)/expedienteordemdia/list$',
ListExpedienteOrdemDiaView.as_view(), name='expedienteordemdia_list'),
url(r'^(?P<pk>\d+)/expedienteordemdia/edit/(?P<oid>\d+)$',
EditExpedienteOrdemDiaView.as_view(), name='expedienteordemdia_edit'),
url(r'^(?P<pk>\d+)/expedienteordemdia/create$',
ExpedienteOrdemDiaView.as_view(), name='expedienteordemdia_create'),
url(r'^(?P<pk>\d+)/resumo$',
ResumoView.as_view(), name='resumo'),
url(r'^(?P<pk>\d+)/explicacao$',
ExplicacaoView.as_view(), name='explicacao'),
url(r'^(?P<pk>\d+)/explicacao/excluir/(?P<oid>\d+)$',
ExplicacaoDelete.as_view(), name='explicacaoexcluir'),
url(r'^(?P<pk>\d+)/explicacao/editar/(?P<oid>\d+)$',
ExplicacaoEdit.as_view(), name='explicacaoeditar'),
url(r'^(?P<pk>\d+)/matordemdia/votnom/(?P<oid>\d+)/(?P<mid>\d+)$',
VotacaoNominalView.as_view(), name='votacaonominal'),
url(r'^(?P<pk>\d+)/matordemdia/votnom/edit/(?P<oid>\d+)/(?P<mid>\d+)$',

706
sessao/views.py

@ -2,7 +2,7 @@ from datetime import datetime
from re import sub
from django.contrib import messages
from django.core.exceptions import ObjectDoesNotExist
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.urlresolvers import reverse
from django.forms.utils import ErrorList
from django.utils.html import strip_tags
@ -12,16 +12,19 @@ from django.views.generic.edit import FormMixin
from rest_framework import generics
import crud.base
import crud.masterdetail
from crud.base import Crud, make_pagination
from crud.masterdetail import MasterDetailCrud
from materia.models import (Autoria, DocumentoAcessorio,
TipoMateriaLegislativa, Tramitacao)
from norma.models import NormaJuridica
from parlamentares.models import Parlamentar
from sessao.serializers import SessaoPlenariaSerializer
from django.http.response import HttpResponseRedirect
from .forms import (ExpedienteForm, ListMateriaForm, MateriaOrdemDiaForm,
MesaForm, OradorDeleteForm, OradorForm, PresencaForm,
VotacaoEditForm, VotacaoForm, VotacaoNominalForm)
MesaForm, PresencaForm, VotacaoEditForm, VotacaoForm,
VotacaoNominalForm, ExpedienteMateriaForm)
from .models import (CargoMesa, ExpedienteMateria, ExpedienteSessao,
IntegranteMesa, MateriaLegislativa, Orador,
OradorExpediente, OrdemDia, PresencaOrdemDia,
@ -30,7 +33,6 @@ from .models import (CargoMesa, ExpedienteMateria, ExpedienteSessao,
VotoParlamentar)
TipoSessaoCrud = Crud.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria')
ExpedienteMateriaCrud = Crud.build(ExpedienteMateria, '')
OrdemDiaCrud = Crud.build(OrdemDia, '')
TipoResultadoVotacaoCrud = Crud.build(
TipoResultadoVotacao, 'tipo_resultado_votacao')
@ -38,6 +40,132 @@ TipoExpedienteCrud = Crud.build(TipoExpediente, 'tipo_expediente')
RegistroVotacaoCrud = Crud.build(RegistroVotacao, '')
def abrir_votacao_view(request, pk, spk):
existe_votacao_aberta = ExpedienteMateria.objects.filter(
sessao_plenaria_id=spk, votacao_aberta=True
).exists()
if existe_votacao_aberta:
msg = _('Já existe uma matéria com votação aberta. Para abrir '
'outra, termine ou feche a votação existente.')
raise ValidationError(msg)
else:
expediente = ExpedienteMateria.objects.get(id=pk)
expediente.votacao_aberta = True
expediente.save()
return HttpResponseRedirect(
reverse('sessao:expedientemateria_list', kwargs={'pk': spk}))
class ExpedienteMateriaCrud(MasterDetailCrud):
model = ExpedienteMateria
parent_field = 'sessao_plenaria'
help_path = ''
class BaseMixin(MasterDetailCrud.BaseMixin):
list_field_names = ['numero_ordem', 'materia',
'observacao', 'resultado']
class ListView(MasterDetailCrud.ListView):
ordering = ['numero_ordem', 'materia', 'resultado']
def get_rows(self, object_list):
for obj in object_list:
if not obj.resultado:
if obj.votacao_aberta:
url = ''
if obj.tipo_votacao == 1:
url = reverse('sessao:votacaosimbolicaexp',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': obj.materia_id,
'mid': obj.pk})
elif obj.tipo_votacao == 2:
url = reverse('sessao:votacaonominalexp',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': obj.materia_id,
'mid': obj.pk})
elif obj.tipo_votacao == 3:
url = reverse('sessao:votacaosecretaexp',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': obj.materia_id,
'mid': obj.pk})
btn_registrar = '''
<a href="%s"
class="btn btn-primary"
role="button">Registrar Votação</a>''' % (url)
obj.resultado = btn_registrar
else:
url = reverse('sessao:abrir_votacao', kwargs={
'pk': obj.pk, 'spk': obj.sessao_plenaria_id})
btn_abrir = '''
Matéria não votada<br />
<a href="%s"
class="btn btn-primary"
role="button">Abrir Votação</a>''' % (url)
obj.resultado = btn_abrir
else:
url = ''
if obj.tipo_votacao == 1:
url = reverse('sessao:votacaosimbolicaexpedit',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': obj.materia_id,
'mid': obj.pk})
elif obj.tipo_votacao == 2:
url = reverse('sessao:votacaonominalexpedit',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': bj.materia_id,
'mid': obj.pk})
elif obj.tipo_votacao == 3:
url = reverse('sessao:votacaosecretaexpedit',
kwargs={
'pk': obj.sessao_plenaria_id,
'oid': obj.materia_id,
'mid': obj.pk})
obj.resultado = '<a href="%s">%s</a>' % (url,
obj.resultado)
return [self._as_row(obj) for obj in object_list]
class CreateView(MasterDetailCrud.CreateView):
form_class = ExpedienteMateriaForm
class UpdateView(MasterDetailCrud.UpdateView):
form_class = ExpedienteMateriaForm
def get_initial(self):
self.initial['tipo_materia'] = self.object.materia.tipo.id
self.initial['numero_materia'] = self.object.materia.numero
self.initial['ano_materia'] = self.object.materia.ano
return self.initial
class DetailView(MasterDetailCrud.DetailView):
@property
def layout_key(self):
return 'ExpedienteMateriaDetail'
class OradorCrud(MasterDetailCrud):
model = ''
parent_field = 'sessao_plenaria'
help_path = ''
class ListView(MasterDetailCrud.ListView):
ordering = ['numero_ordem', 'parlamentar']
class OradorExpedienteCrud(OradorCrud):
model = OradorExpediente
class OradorCrud(OradorCrud):
model = Orador
class SessaoCrud(Crud):
model = SessaoPlenaria
help_path = 'sessao_plenaria'
@ -263,107 +391,6 @@ class ListMateriaOrdemDiaView(FormMixin, SessaoCrud.CrudDetailView):
return self.get(self, request, args, kwargs)
class ListExpedienteOrdemDiaView(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/expediente_ordemdia_list.html'
form_class = ListMateriaForm
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
pk = self.kwargs['pk']
ordem = ExpedienteMateria.objects.filter(sessao_plenaria_id=pk)
materias_ordem = []
for o in ordem:
ementa = o.observacao
titulo = o.materia
numero = o.numero_ordem
autoria = Autoria.objects.filter(materia_id=o.materia_id)
autor = [str(a.autor) for a in autoria]
mat = {'pk': pk,
'oid': o.materia_id,
'ordem_id': o.id,
'ementa': ementa,
'titulo': titulo,
'numero': numero,
'resultado': o.resultado,
'autor': autor,
'votacao_aberta': o.votacao_aberta,
'tipo_votacao': o.tipo_votacao
}
materias_ordem.append(mat)
sorted(materias_ordem, key=lambda x: x['numero'])
context.update({'materias_ordem': materias_ordem})
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
pk = self.kwargs['pk']
form = ListMateriaForm(request.POST)
if 'materia_reorder' in request.POST:
expedientes = ExpedienteMateria.objects.filter(
sessao_plenaria_id=pk)
exp_num = 1
for e in expedientes:
e.numero_ordem = exp_num
e.save()
exp_num += 1
elif 'abrir-votacao' in request.POST:
existe_votacao_aberta = ExpedienteMateria.objects.filter(
sessao_plenaria_id=pk, votacao_aberta=True
).exists()
if existe_votacao_aberta:
context = self.get_context_data(object=self.object)
form._errors = {'error_message': 'error_message'}
context.update({'form': form})
pk = self.kwargs['pk']
ordem = ExpedienteMateria.objects.filter(
sessao_plenaria_id=pk)
materias_ordem = []
for o in ordem:
ementa = o.observacao
titulo = o.materia
numero = o.numero_ordem
autoria = Autoria.objects.filter(materia_id=o.materia_id)
autor = [str(a.autor) for a in autoria]
mat = {'pk': pk,
'oid': o.materia_id,
'ordem_id': o.id,
'ementa': ementa,
'titulo': titulo,
'numero': numero,
'resultado': o.resultado,
'autor': autor,
'votacao_aberta': o.votacao_aberta,
'tipo_votacao': o.tipo_votacao
}
materias_ordem.append(mat)
sorted(materias_ordem, key=lambda x: x['numero'])
context.update({'materias_ordem': materias_ordem})
return self.render_to_response(context)
else:
ordem_id = request.POST['ordem_id']
ordem = ExpedienteMateria.objects.get(id=ordem_id)
ordem.votacao_aberta = True
ordem.save()
return self.get(self, request, args, kwargs)
class MateriaOrdemDiaView(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/materia_ordemdia.html'
form_class = MateriaOrdemDiaForm
@ -539,310 +566,6 @@ class EditMateriaOrdemDiaView(FormMixin, SessaoCrud.CrudDetailView):
kwargs={'pk': pk})
class ExpedienteOrdemDiaView(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/materia_ordemdia.html'
form_class = MateriaOrdemDiaForm
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
now = datetime.now()
tipo_materia = TipoMateriaLegislativa.objects.all()
data_sessao = now
tipo_sessao = TipoSessaoPlenaria.objects.all()
tipo_votacao = ExpedienteMateria.TIPO_VOTACAO_CHOICES
ano_materia = now.year
context.update({'data_sessao': data_sessao,
'tipo_sessao': tipo_sessao,
'tipo_materia': tipo_materia,
'tipo_votacao': tipo_votacao,
'ano_materia': ano_materia,
'error_message': '', })
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
form = MateriaOrdemDiaForm(request.POST)
if form.is_valid():
try:
materia = MateriaLegislativa.objects.get(
numero=request.POST['numero_materia'],
tipo_id=request.POST['tipo_materia'],
ano=request.POST['ano_materia'])
except ObjectDoesNotExist:
form._errors["error_message"] = ErrorList([u""])
context.update({'form': form})
return self.render_to_response(context)
# TODO: barrar matérias não existentes
# TODO: barrar criação de ordemdia para materias já incluídas
ordemdia = ExpedienteMateria()
ordemdia.sessao_plenaria_id = self.object.id
ordemdia.materia_id = materia.id
ordemdia.numero_ordem = request.POST['numero_ordem']
ordemdia.data_ordem = datetime.now()
ordemdia.observacao = sub('&nbsp;', ' ',
strip_tags(request.POST['observacao']))
ordemdia.tipo_votacao = request.POST['tipo_votacao']
ordemdia.save()
return self.form_valid(form)
else:
context.update(
{'error_message': _("Não foi possível salvar formulário!")})
return self.form_invalid(form)
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:expedienteordemdia_list',
kwargs={'pk': pk})
class EditExpedienteOrdemDiaView(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/materia_ordemdia_edit.html'
form_class = MateriaOrdemDiaForm
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
pk = kwargs['pk']
oid = kwargs['oid']
ordem = ExpedienteMateria.objects.get(
sessao_plenaria_id=pk, materia_id=oid)
materia = MateriaLegislativa.objects.get(
id=ordem.materia_id)
data_ordem = ordem.data_ordem
tipo_votacao = ExpedienteMateria.TIPO_VOTACAO_CHOICES
tipo_sessao = TipoSessaoPlenaria.objects.all()
tipo_materia = TipoMateriaLegislativa.objects.all()
context.update({'data_sessao': data_ordem,
'tipo_sessao': tipo_sessao,
'tipo_sessao_selected': self.object.tipo,
'tipo_materia': tipo_materia,
'tipo_materia_selected': materia.tipo,
'tipo_votacao': tipo_votacao,
'tipo_votacao_selected': ordem.tipo_votacao,
'ano_materia': materia.ano,
'numero_ordem': ordem.numero_ordem,
'numero_materia': materia.numero,
'ordem_id': oid,
'oid': '',
'observacao': sub(
'&nbsp;', ' ', strip_tags(ordem.observacao)),
'error_message': '', })
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
form = MateriaOrdemDiaForm(request.POST)
pk = kwargs['pk']
oid = kwargs['oid']
ordemdia = ExpedienteMateria.objects.get(
sessao_plenaria_id=pk, materia_id=oid)
if 'update-ordemdia' in request.POST:
if form.is_valid():
try:
materia = MateriaLegislativa.objects.get(
numero=request.POST['numero_materia'],
tipo_id=request.POST['tipo_materia'],
ano=request.POST['ano_materia'])
except ObjectDoesNotExist:
context.update(
{'error_message': _("Matéria inexistente!")})
return self.form_invalid(form)
ordemdia.materia_id = materia.id
ordemdia.numero_ordem = request.POST['numero_ordem']
ordemdia.tipo_votacao = request.POST['tipo_votacao']
obs = strip_tags(request.POST['observacao'])
ordemdia.observacao = sub('&nbsp;', ' ', obs)
ordemdia.save()
return self.form_valid(form)
else:
context.update(
{'error_message': _(
"Não foi possível salvar formulário!")})
return self.form_invalid(form)
elif 'delete-ordemdia' in request.POST:
ordemdia.delete()
return self.form_valid(form)
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:expedienteordemdia_list',
kwargs={'pk': pk})
class OradorExpedienteDelete(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/delete_orador.html'
form_class = OradorDeleteForm
def post(self, request, *args, **kwargs):
self.object = self.get_object()
orador_id = kwargs['oid']
form = OradorDeleteForm(request.POST)
if form.is_valid():
orador = OradorExpediente.objects.get(
sessao_plenaria_id=self.object.id,
parlamentar_id=orador_id)
orador.delete()
return self.form_valid(form)
else:
return self.form_invalid(form)
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:oradorexpediente', kwargs={'pk': pk})
class OradorExpedienteEdit(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/edit_orador.html'
form_class = OradorForm
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = OradorForm(request.POST)
if form.is_valid():
orador_id = kwargs['oid']
orador = OradorExpediente.objects.get(
sessao_plenaria_id=self.object.id,
parlamentar_id=orador_id)
orador.delete()
orador = OradorExpediente()
orador.sessao_plenaria_id = self.object.id
orador.numero_ordem = request.POST['numero_ordem']
orador.parlamentar = Parlamentar.objects.get(
id=orador_id)
orador.url_discurso = request.POST['url_discurso']
orador.save()
return self.form_valid(form)
else:
context = self.get_context_data(object=self.object)
orador_id = kwargs['oid']
parlamentar = Parlamentar.objects.get(id=orador_id)
orador = OradorExpediente.objects.get(
sessao_plenaria=self.object, parlamentar=parlamentar)
orador = {'parlamentar': parlamentar,
'url_discurso': orador.url_discurso}
context.update({'orador': orador})
context.update({'form': form})
return self.render_to_response(context)
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
orador_id = kwargs['oid']
parlamentar = Parlamentar.objects.get(id=orador_id)
orador = OradorExpediente.objects.get(
sessao_plenaria=self.object, parlamentar=parlamentar)
orador = {'parlamentar': parlamentar, 'numero_ordem':
orador.numero_ordem, 'url_discurso': orador.url_discurso}
context.update({'orador': orador})
return self.render_to_response(context)
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:oradorexpediente', kwargs={'pk': pk})
class OradorExpedienteView(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/orador_expediente.html'
form_class = OradorForm
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = OradorForm(request.POST)
if 'adicionar' in request.POST:
if form.is_valid():
orador = OradorExpediente()
orador.sessao_plenaria_id = self.object.id
orador.numero_ordem = request.POST['numero_ordem']
orador.parlamentar = Parlamentar.objects.get(
id=request.POST['parlamentar'])
orador.url_discurso = request.POST['url_discurso']
orador.save()
return self.form_valid(form)
else:
return self.form_invalid(form)
elif 'reordenar' in request.POST:
orador = OradorExpediente.objects.filter(
sessao_plenaria_id=self.object.id)
ordem_num = 1
for o in orador:
o.numero_ordem = ordem_num
o.save()
ordem_num += 1
return self.get(self, request, args, kwargs)
def get_candidatos_orador(self):
self.object = self.get_object()
lista_parlamentares = []
lista_oradores = []
for parlamentar in Parlamentar.objects.all():
if parlamentar.ativo:
lista_parlamentares.append(parlamentar)
for orador in OradorExpediente.objects.filter(
sessao_plenaria_id=self.object.id):
parlamentar = Parlamentar.objects.get(
id=orador.parlamentar_id)
lista_oradores.append(parlamentar)
lista = list(set(lista_parlamentares) - set(lista_oradores))
lista.sort(key=lambda x: x.nome_parlamentar)
return lista
def get_oradores(self):
self.object = self.get_object()
for orador in OradorExpediente.objects.filter(
sessao_plenaria_id=self.object.id):
numero_ordem = orador.numero_ordem
url_discurso = orador.url_discurso
parlamentar = Parlamentar.objects.get(
id=orador.parlamentar_id)
yield(numero_ordem, url_discurso, parlamentar)
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:oradorexpediente', kwargs={'pk': pk})
class MesaView(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/mesa.html'
form_class = MesaForm
@ -1177,159 +900,6 @@ class ExpedienteView(FormMixin, SessaoCrud.CrudDetailView):
return reverse('sessao:expediente', kwargs={'pk': pk})
class ExplicacaoView(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/explicacao.html'
form_class = OradorForm
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = OradorForm(request.POST)
if 'adicionar' in request.POST:
if form.is_valid():
orador = Orador()
orador.sessao_plenaria_id = self.object.id
orador.numero_ordem = request.POST['numero_ordem']
orador.parlamentar = Parlamentar.objects.get(
id=request.POST['parlamentar'])
orador.url_discurso = request.POST['url_discurso']
orador.save()
return self.form_valid(form)
else:
return self.form_invalid(form)
elif 'reordenar' in request.POST:
orador = Orador.objects.filter(
sessao_plenaria_id=self.object.id)
ordem_num = 1
for o in orador:
o.numero_ordem = ordem_num
o.save()
ordem_num += 1
return self.get(self, request, args, kwargs)
def get_candidatos_orador(self):
self.object = self.get_object()
lista_parlamentares = []
lista_oradores = []
for parlamentar in Parlamentar.objects.all():
if parlamentar.ativo:
lista_parlamentares.append(parlamentar)
for orador in Orador.objects.filter(
sessao_plenaria_id=self.object.id):
parlamentar = Parlamentar.objects.get(
id=orador.parlamentar_id)
lista_oradores.append(parlamentar)
lista = list(set(lista_parlamentares) - set(lista_oradores))
lista.sort(key=lambda x: x.nome_parlamentar)
return lista
def get_oradores(self):
self.object = self.get_object()
for orador in Orador.objects.filter(
sessao_plenaria_id=self.object.id).order_by('numero_ordem'):
numero_ordem = orador.numero_ordem
url_discurso = orador.url_discurso
parlamentar = Parlamentar.objects.get(
id=orador.parlamentar_id)
yield(numero_ordem, url_discurso, parlamentar)
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:explicacao', kwargs={'pk': pk})
class ExplicacaoDelete(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/delete_explicacao.html'
form_class = OradorDeleteForm
def post(self, request, *args, **kwargs):
self.object = self.get_object()
oid = kwargs['oid']
form = OradorDeleteForm(request.POST)
if form.is_valid():
orador = Orador.objects.get(
sessao_plenaria_id=self.object.id,
parlamentar_id=oid)
orador.delete()
return self.form_valid(form)
else:
return self.form_invalid(form)
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:explicacao', kwargs={'pk': pk})
class ExplicacaoEdit(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/edit_explicacao.html'
form_class = OradorForm
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = OradorForm(request.POST)
pk = kwargs['pk']
oid = kwargs['oid']
if form.is_valid():
orador = Orador.objects.get(
sessao_plenaria_id=pk,
parlamentar_id=oid)
orador.delete()
orador = Orador()
orador.sessao_plenaria_id = pk
orador.numero_ordem = request.POST['numero_ordem']
orador.parlamentar = Parlamentar.objects.get(
id=oid)
orador.url_discurso = request.POST['url_discurso']
orador.save()
return self.form_valid(form)
else:
context = self.get_context_data(object=self.object)
parlamentar = Parlamentar.objects.get(id=oid)
orador = Orador.objects.get(
sessao_plenaria=self.object, parlamentar=parlamentar)
explicacao = {'parlamentar': parlamentar,
'url_discurso': orador.url_discurso}
context.update({'explicacao': explicacao})
context.update({'form': form})
return self.render_to_response(context)
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
oid = kwargs['oid']
parlamentar = Parlamentar.objects.get(id=oid)
orador = Orador.objects.get(
sessao_plenaria=self.object, parlamentar=parlamentar)
explicacao = {'parlamentar': parlamentar, 'numero_ordem':
orador.numero_ordem, 'url_discurso': orador.url_discurso}
context.update({'explicacao': explicacao})
return self.render_to_response(context)
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:explicacao', kwargs={'pk': pk})
class VotacaoEditView(FormMixin, SessaoCrud.CrudDetailView):
'''
@ -1847,7 +1417,7 @@ class VotacaoNominalExpedienteView(FormMixin, SessaoCrud.CrudDetailView):
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:expedienteordemdia_list',
return reverse('sessao:expedientemateria_list',
kwargs={'pk': pk})
@ -1902,7 +1472,7 @@ class VotacaoNominalExpedienteEditView(FormMixin, SessaoCrud.CrudDetailView):
expediente = ExpedienteMateria.objects.get(
sessao_plenaria_id=self.object.id,
materia_id=materia_id)
expediente.resultado = None
expediente.resultado = ''
expediente.votacao_aberta = False
expediente.save()
@ -1924,7 +1494,7 @@ class VotacaoNominalExpedienteEditView(FormMixin, SessaoCrud.CrudDetailView):
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:expedienteordemdia_list',
return reverse('sessao:expedientemateria_list',
kwargs={'pk': pk})
@ -2045,7 +1615,7 @@ class VotacaoExpedienteView(FormMixin, SessaoCrud.CrudDetailView):
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:expedienteordemdia_list',
return reverse('sessao:expedientemateria_list',
kwargs={'pk': pk})
@ -2060,7 +1630,7 @@ class VotacaoExpedienteEditView(FormMixin, SessaoCrud.CrudDetailView):
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sessao:expedienteordemdia_list',
return reverse('sessao:expedientemateria_list',
kwargs={'pk': pk})
def get_tipos_votacao(self):
@ -2118,7 +1688,7 @@ class VotacaoExpedienteEditView(FormMixin, SessaoCrud.CrudDetailView):
sessao_plenaria_id=self.object.id,
materia_id=materia_id)
expediente.votacao_aberta = False
expediente.resultado = None
expediente.resultado = ''
expediente.save()
return self.form_valid(form)

21
templates/sessao/delete_explicacao.html

@ -1,21 +0,0 @@
{% extends "base.html" %}
{% load i18n %}
{% block base_content %}
<form action="" method="post">{% csrf_token %}
<div class="callout panel text-center radius clearfix">
<p>
{% blocktrans %}
Tem certeza que deseja apagar o orador?
{% endblocktrans %}
</p>
<div class="button-group">
<a href="{{ view.detail_url }}" class="btn btn-primary">{% trans 'Cancelar' %}</a>
<input name="submit" value="{% trans 'Confirmar' %}" class="btn btn-danger" type="submit" ></li>
</div>
</div>
</form>
{% endblock %}

21
templates/sessao/delete_orador.html

@ -1,21 +0,0 @@
{% extends "base.html" %}
{% load i18n %}
{% block base_content %}
<form action="" method="post">{% csrf_token %}
<div class="callout panel text-center radius clearfix">
<p>
{% blocktrans %}
Tem certeza que deseja apagar o orador?
{% endblocktrans %}
</p>
<div class="button-group">
<a href="{{ view.detail_url }}" class="btn btn-primary">{% trans 'Cancelar' %}</a>
<input name="submit" value="{% trans 'Confirmar' %}" class="btn btn-danger" type="submit"></li>
</div>
</div>
</form>
{% endblock %}

39
templates/sessao/edit_explicacao.html

@ -1,39 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<fieldset class="form-group">
<legend>Editar Orador</legend>
{% if form.errors %}
<div class="alert-box alert">
<b><h4>Os seguintes erros foram encontrados:</h4></b>
<ul>
{% for field in form %}
{% if field.errors %}
<li>O campo <b>{{field.label}}</b> é obrigatório!</li>
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
<form method="POST" action="">
{% csrf_token %}
<div class="row">
<div class="col-md-4">Ordem de pronunciamento</div>
<div class="col-md-4">Parlamentar</div>
<div class="col-md-4">URL Discurso</div>
</div>
<div class="row">
<div class="col-md-4"><input type="text" id="numero_ordem" name="numero_ordem" value="{{explicacao.numero_ordem}}" class="form-control" /></div>
<div class="col-md-4"><input type="text" id="parlamentar" name="parlamentar" value="{{explicacao.parlamentar.nome_parlamentar}}" disabled class="form-control"/></div>
<div class="col-md-4"><input type="text" id="url_discurso" name="url_discurso" value="{{explicacao.url_discurso}}" class="form-control"/></div>
</div>
<br />
<input type="submit" value="Salvar Orador" class="btn btn-primary" />
</form>
</fieldset>
{% endblock detail_content %}

39
templates/sessao/edit_orador.html

@ -1,39 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<fieldset class="form-group">
<legend>Editar Orador</legend>
{% if form.errors %}
<div class="alert-box alert">
<b><h4>Os seguintes erros foram encontrados:</h4></b>
<ul>
{% for field in form %}
{% if field.errors %}
<li>O campo <b>{{field.label}}</b> é obrigatório!</li>
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
<form method="POST" action="">
{% csrf_token %}
<div class="row">
<div class="col-md-4">Ordem de pronunciamento</div>
<div class="col-md-4">Parlamentar</div>
<div class="col-md-4">URL Discurso</div>
</div>
<div class="row">
<div class="col-md-4"><input type="text" id="numero_ordem" name="numero_ordem" value="{{orador.numero_ordem}}" class="form-control"/></div>
<div class="col-md-4"><input type="text" id="parlamentar" name="parlamentar" value="{{orador.parlamentar.nome_parlamentar}}" disabled class="form-control"/></div>
<div class="col-md-4"><input type="text" id="url_discurso" name="url_discurso" value="{{orador.url_discurso}}" class="form-control"/></div>
</div>
<br />
<input type="submit" value="Salvar Orador" class="btn btn-primary" />
</form>
</fieldset>
{% endblock detail_content %}

70
templates/sessao/explicacao.html

@ -1,70 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<fieldset class="form-group">
<legend>Oradores das Explicações Pessoais</legend>
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<th>Ordem de pronunciamento</th>
<th>Parlamentar</th>
<th>URL Discurso</th>
<th>Editar/Excluir</th>
</tr>
</thead>
{% for numero_ordem, url_discurso, parlamentar in view.get_oradores %}
<tr>
<td>{{numero_ordem}}</td>
<td>{{parlamentar.nome_parlamentar }}</td>
<td>{% if not url_discurso %}Orador sem discurso cadastrado{% else %}{{url_discurso}}{% endif %}</td>
<td>
<a id="editar-orador" href="{% url 'sessao:explicacaoeditar' object.pk parlamentar.id %}" class="btn btn-primary btn-sm active">Editar</a>
<a id="excluir-orador" href="{% url 'sessao:explicacaoexcluir' object.pk parlamentar.id %}" class="btn btn-danger btn-sm active">Excluir</a>
</td>
</tr>
{% endfor %}
</table>
</fieldset>
<fieldset class="form-group">
<legend>Adicionar Orador</legend>
{% if form.errors %}
<div class="alert-box alert">
<b><h4>Os seguintes erros foram encontrados:</h4></b>
<ul>
{% for field in form %}
{% if field.errors %}
<li>O campo <b>{{field.label}}</b> é obrigatório!</li>
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
<form method="POST" action="">
{% csrf_token %}
<div class="row">
<div class="col-md-4">Ordem de pronunciamento</div>
<div class="col-md-4">Parlamentar</div>
<div class="col-md-4">URL Discurso</div>
</div>
<div class="row">
<div class="col-md-4"><input type="text" id="numero_ordem" name="numero_ordem" class="form-control"/></div>
<div class="col-md-4"><select name="parlamentar" id="parlamentar" class="form-control">
{% for parlamentar in view.get_candidatos_orador %}
<option value="{{parlamentar.id}}">{{parlamentar.nome_parlamentar}}</option>
{% endfor %}
</select></div>
<div class="col-md-4"><input type="text" id="url_discurso" name="url_discurso" class="form-control"/></div>
</div>
<br />
<input type="submit" value="Adicionar Orador" name="adicionar" id="adicionar" class="btn btn-primary" />
<input type="submit" value="Reordenar Oradores" name="reordenar" id="reordenar" class="btn btn-primary" />
</form>
</fieldset>
{% endblock detail_content %}

70
templates/sessao/orador_expediente.html

@ -1,70 +0,0 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block detail_content %}
<fieldset>
<legend>Oradores do Expediente</legend>
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<th>Ordem de pronunciamento</th>
<th>Parlamentar</th>
<th>URL Discurso</th>
<th>Editar/Excluir</th>
</tr>
</thead>
{% for numero_ordem, url_discurso, parlamentar in view.get_oradores %}
<tr>
<td>{{numero_ordem}}</td>
<td>{{parlamentar.nome_parlamentar }}</td>
<td>{% if not url_discurso %}Orador sem discurso cadastrado{% else %}{{url_discurso}}{% endif %}</td>
<td>
<a id="editar-orador" href="{% url 'sessao:oradoreditar' object.pk parlamentar.id %}" class="btn btn-primary btn-sm active">Editar</a>
<a id="excluir-orador" href="{% url 'sessao:oradorexcluir' object.pk parlamentar.id %}" class="btn btn-danger btn-sm active">Excluir</a>
</td>
</tr>
{% endfor %}
</table>
</fieldset>
<fieldset class="form-group">
<legend>Adicionar Orador</legend>
{% if form.errors %}
<div class="alert-box alert">
<b><h4>Os seguintes erros foram encontrados:</h4></b>
<ul>
{% for field in form %}
{% if field.errors %}
<li>O campo <b>{{field.label}}</b> é obrigatório!</li>
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
<form method="POST" action="">
{% csrf_token %}
<div class="row">
<div class="col-md-4">Ordem de pronunciamento</div>
<div class="col-md-4">Parlamentar</div>
<div class="col-md-4">URL Discurso</div>
</div>
<div class="row">
<div class="col-md-4"><input type="text" id="numero_ordem" name="numero_ordem" class="form-control"/></div>
<div class="col-md-4"><select name="parlamentar" id="parlamentar" class="form-control">
{% for parlamentar in view.get_candidatos_orador %}
<option value="{{parlamentar.id}}">{{parlamentar.nome_parlamentar}}</option>
{% endfor %}
</select></div>
<div class="col-md-4"><input type="text" id="url_discurso" name="url_discurso" class="form-control"/></div>
</div>
<br />
<input type="submit" value="Adicionar Orador" name="adicionar" id="adicionar" class="btn btn-primary" />
<input type="submit" value="Reordenar Oradores" name="reordenar" id="reordenar" class="btn btn-primary"/>
</form>
</fieldset>
{% endblock detail_content %}

6
templates/sessao/subnav.yaml

@ -7,16 +7,16 @@
- title: Presença
url: presenca
- title: Explicações Pessoais
url: explicacao
url: orador_list
- title: Expedientes
children:
- title: Expediente Diversos
url: expediente
- title: Matérias Expediente
url: expedienteordemdia_list
url: expedientemateria_list
- title: Oradores do Expediente
url: oradorexpediente
url: oradorexpediente_list
- title: Ordem do Dia
children:

Loading…
Cancel
Save