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/views.py
  4. 67
      sessao/forms.py
  5. 21
      sessao/layouts.yaml
  6. 38
      sessao/urls.py
  7. 706
      sessao/views.py
  8. 21
      templates/sessao/delete_explicacao.html
  9. 21
      templates/sessao/delete_orador.html
  10. 39
      templates/sessao/edit_explicacao.html
  11. 39
      templates/sessao/edit_orador.html
  12. 70
      templates/sessao/explicacao.html
  13. 70
      templates/sessao/orador_expediente.html
  14. 6
      templates/sessao/subnav.yaml

20
materia/forms.py

@ -146,26 +146,6 @@ class RelatoriaForm(ModelForm):
return cleaned_data 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): class TramitacaoForm(ModelForm):

30
materia/views.py

@ -1,7 +1,6 @@
from datetime import datetime from datetime import datetime
from random import choice from random import choice
from string import ascii_letters, digits from string import ascii_letters, digits
from crispy_layout_mixin import form_actions
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Button from crispy_forms.layout import HTML, Button
@ -133,35 +132,6 @@ class RelatoriaCrud(MasterDetailCrud):
form_class = RelatoriaForm 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): class TramitacaoCrud(MasterDetailCrud):
model = Tramitacao model = Tramitacao
parent_field = 'materia' parent_field = 'materia'

2
parlamentares/views.py

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

67
sessao/forms.py

@ -1,5 +1,60 @@
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ 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): class PresencaForm(forms.Form):
@ -28,18 +83,6 @@ class MateriaOrdemDiaForm(forms.Form):
error_message = forms.CharField(required=False, label=_('Matéria')) 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): class MesaForm(forms.Form):
parlamentar = forms.IntegerField(required=True) parlamentar = forms.IntegerField(required=True)
cargo = 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 - votacao_branco_FIXME ind_votacao_presidente_FIXME
- tipo_resultado_votacao - tipo_resultado_votacao
- observacao - 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 django.views.static import serve
from sapl import settings from sapl import settings
from sessao.views import (EditExpedienteOrdemDiaView, EditMateriaOrdemDiaView, from sessao.views import (EditMateriaOrdemDiaView,
ExpedienteOrdemDiaView, ExpedienteView, ExpedienteView,
ExplicacaoDelete, ExplicacaoEdit, ExplicacaoView, ListMateriaOrdemDiaView,
ListExpedienteOrdemDiaView, ListMateriaOrdemDiaView, MateriaOrdemDiaView, MesaView, OradorCrud,
MateriaOrdemDiaView, MesaView, OradorExpedienteCrud, PainelView,
OradorExpedienteDelete, OradorExpedienteEdit,
OradorExpedienteView, PainelView,
PautaExpedienteDetail, PautaOrdemDetail, PautaExpedienteDetail, PautaOrdemDetail,
PautaSessaoDetailView, PautaSessaoListView, PautaSessaoDetailView, PautaSessaoListView,
PresencaOrdemDiaView, PresencaView, ResumoView, PresencaOrdemDiaView, PresencaView, ResumoView,
@ -18,7 +16,7 @@ from sessao.views import (EditExpedienteOrdemDiaView, EditMateriaOrdemDiaView,
VotacaoExpedienteView, VotacaoNominalEditView, VotacaoExpedienteView, VotacaoNominalEditView,
VotacaoNominalExpedienteEditView, VotacaoNominalExpedienteEditView,
VotacaoNominalExpedienteView, VotacaoNominalView, VotacaoNominalExpedienteView, VotacaoNominalView,
VotacaoView) VotacaoView, ExpedienteMateriaCrud, abrir_votacao_view)
from .apps import AppConfig from .apps import AppConfig
@ -29,7 +27,11 @@ sessao_rest = [
] ]
urlpatterns = [ 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, url(r'^media/(?P<path>.*)$', serve,
{'document_root': settings.MEDIA_ROOT}), {'document_root': settings.MEDIA_ROOT}),
@ -61,12 +63,6 @@ urlpatterns = [
url(r'^(?P<pk>\d+)/presencaordemdia$', url(r'^(?P<pk>\d+)/presencaordemdia$',
PresencaOrdemDiaView.as_view(), PresencaOrdemDiaView.as_view(),
name='presencaordemdia'), 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+)/mesa$', MesaView.as_view(), name='mesa'),
url(r'^(?P<pk>\d+)/materiaordemdia/list$', url(r'^(?P<pk>\d+)/materiaordemdia/list$',
ListMateriaOrdemDiaView.as_view(), name='materiaordemdia_list'), ListMateriaOrdemDiaView.as_view(), name='materiaordemdia_list'),
@ -76,20 +72,8 @@ urlpatterns = [
EditMateriaOrdemDiaView.as_view(), name='materiaordemdia_edit'), EditMateriaOrdemDiaView.as_view(), name='materiaordemdia_edit'),
url(r'^(?P<pk>\d+)/materiaordemdia/create$', url(r'^(?P<pk>\d+)/materiaordemdia/create$',
MateriaOrdemDiaView.as_view(), name='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$', url(r'^(?P<pk>\d+)/resumo$',
ResumoView.as_view(), name='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+)$', url(r'^(?P<pk>\d+)/matordemdia/votnom/(?P<oid>\d+)/(?P<mid>\d+)$',
VotacaoNominalView.as_view(), name='votacaonominal'), VotacaoNominalView.as_view(), name='votacaonominal'),
url(r'^(?P<pk>\d+)/matordemdia/votnom/edit/(?P<oid>\d+)/(?P<mid>\d+)$', 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 re import sub
from django.contrib import messages 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.core.urlresolvers import reverse
from django.forms.utils import ErrorList from django.forms.utils import ErrorList
from django.utils.html import strip_tags from django.utils.html import strip_tags
@ -12,16 +12,19 @@ from django.views.generic.edit import FormMixin
from rest_framework import generics from rest_framework import generics
import crud.base import crud.base
import crud.masterdetail
from crud.base import Crud, make_pagination from crud.base import Crud, make_pagination
from crud.masterdetail import MasterDetailCrud
from materia.models import (Autoria, DocumentoAcessorio, from materia.models import (Autoria, DocumentoAcessorio,
TipoMateriaLegislativa, Tramitacao) TipoMateriaLegislativa, Tramitacao)
from norma.models import NormaJuridica from norma.models import NormaJuridica
from parlamentares.models import Parlamentar from parlamentares.models import Parlamentar
from sessao.serializers import SessaoPlenariaSerializer from sessao.serializers import SessaoPlenariaSerializer
from django.http.response import HttpResponseRedirect
from .forms import (ExpedienteForm, ListMateriaForm, MateriaOrdemDiaForm, from .forms import (ExpedienteForm, ListMateriaForm, MateriaOrdemDiaForm,
MesaForm, OradorDeleteForm, OradorForm, PresencaForm, MesaForm, PresencaForm, VotacaoEditForm, VotacaoForm,
VotacaoEditForm, VotacaoForm, VotacaoNominalForm) VotacaoNominalForm, ExpedienteMateriaForm)
from .models import (CargoMesa, ExpedienteMateria, ExpedienteSessao, from .models import (CargoMesa, ExpedienteMateria, ExpedienteSessao,
IntegranteMesa, MateriaLegislativa, Orador, IntegranteMesa, MateriaLegislativa, Orador,
OradorExpediente, OrdemDia, PresencaOrdemDia, OradorExpediente, OrdemDia, PresencaOrdemDia,
@ -30,7 +33,6 @@ from .models import (CargoMesa, ExpedienteMateria, ExpedienteSessao,
VotoParlamentar) VotoParlamentar)
TipoSessaoCrud = Crud.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoSessaoCrud = Crud.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria')
ExpedienteMateriaCrud = Crud.build(ExpedienteMateria, '')
OrdemDiaCrud = Crud.build(OrdemDia, '') OrdemDiaCrud = Crud.build(OrdemDia, '')
TipoResultadoVotacaoCrud = Crud.build( TipoResultadoVotacaoCrud = Crud.build(
TipoResultadoVotacao, 'tipo_resultado_votacao') TipoResultadoVotacao, 'tipo_resultado_votacao')
@ -38,6 +40,132 @@ TipoExpedienteCrud = Crud.build(TipoExpediente, 'tipo_expediente')
RegistroVotacaoCrud = Crud.build(RegistroVotacao, '') 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): class SessaoCrud(Crud):
model = SessaoPlenaria model = SessaoPlenaria
help_path = 'sessao_plenaria' help_path = 'sessao_plenaria'
@ -263,107 +391,6 @@ class ListMateriaOrdemDiaView(FormMixin, SessaoCrud.CrudDetailView):
return self.get(self, request, args, kwargs) 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): class MateriaOrdemDiaView(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/materia_ordemdia.html' template_name = 'sessao/materia_ordemdia.html'
form_class = MateriaOrdemDiaForm form_class = MateriaOrdemDiaForm
@ -539,310 +566,6 @@ class EditMateriaOrdemDiaView(FormMixin, SessaoCrud.CrudDetailView):
kwargs={'pk': pk}) 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): class MesaView(FormMixin, SessaoCrud.CrudDetailView):
template_name = 'sessao/mesa.html' template_name = 'sessao/mesa.html'
form_class = MesaForm form_class = MesaForm
@ -1177,159 +900,6 @@ class ExpedienteView(FormMixin, SessaoCrud.CrudDetailView):
return reverse('sessao:expediente', kwargs={'pk': pk}) 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): class VotacaoEditView(FormMixin, SessaoCrud.CrudDetailView):
''' '''
@ -1847,7 +1417,7 @@ class VotacaoNominalExpedienteView(FormMixin, SessaoCrud.CrudDetailView):
def get_success_url(self): def get_success_url(self):
pk = self.kwargs['pk'] pk = self.kwargs['pk']
return reverse('sessao:expedienteordemdia_list', return reverse('sessao:expedientemateria_list',
kwargs={'pk': pk}) kwargs={'pk': pk})
@ -1902,7 +1472,7 @@ class VotacaoNominalExpedienteEditView(FormMixin, SessaoCrud.CrudDetailView):
expediente = ExpedienteMateria.objects.get( expediente = ExpedienteMateria.objects.get(
sessao_plenaria_id=self.object.id, sessao_plenaria_id=self.object.id,
materia_id=materia_id) materia_id=materia_id)
expediente.resultado = None expediente.resultado = ''
expediente.votacao_aberta = False expediente.votacao_aberta = False
expediente.save() expediente.save()
@ -1924,7 +1494,7 @@ class VotacaoNominalExpedienteEditView(FormMixin, SessaoCrud.CrudDetailView):
def get_success_url(self): def get_success_url(self):
pk = self.kwargs['pk'] pk = self.kwargs['pk']
return reverse('sessao:expedienteordemdia_list', return reverse('sessao:expedientemateria_list',
kwargs={'pk': pk}) kwargs={'pk': pk})
@ -2045,7 +1615,7 @@ class VotacaoExpedienteView(FormMixin, SessaoCrud.CrudDetailView):
def get_success_url(self): def get_success_url(self):
pk = self.kwargs['pk'] pk = self.kwargs['pk']
return reverse('sessao:expedienteordemdia_list', return reverse('sessao:expedientemateria_list',
kwargs={'pk': pk}) kwargs={'pk': pk})
@ -2060,7 +1630,7 @@ class VotacaoExpedienteEditView(FormMixin, SessaoCrud.CrudDetailView):
def get_success_url(self): def get_success_url(self):
pk = self.kwargs['pk'] pk = self.kwargs['pk']
return reverse('sessao:expedienteordemdia_list', return reverse('sessao:expedientemateria_list',
kwargs={'pk': pk}) kwargs={'pk': pk})
def get_tipos_votacao(self): def get_tipos_votacao(self):
@ -2118,7 +1688,7 @@ class VotacaoExpedienteEditView(FormMixin, SessaoCrud.CrudDetailView):
sessao_plenaria_id=self.object.id, sessao_plenaria_id=self.object.id,
materia_id=materia_id) materia_id=materia_id)
expediente.votacao_aberta = False expediente.votacao_aberta = False
expediente.resultado = None expediente.resultado = ''
expediente.save() expediente.save()
return self.form_valid(form) 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 - title: Presença
url: presenca url: presenca
- title: Explicações Pessoais - title: Explicações Pessoais
url: explicacao url: orador_list
- title: Expedientes - title: Expedientes
children: children:
- title: Expediente Diversos - title: Expediente Diversos
url: expediente url: expediente
- title: Matérias Expediente - title: Matérias Expediente
url: expedienteordemdia_list url: expedientemateria_list
- title: Oradores do Expediente - title: Oradores do Expediente
url: oradorexpediente url: oradorexpediente_list
- title: Ordem do Dia - title: Ordem do Dia
children: children:

Loading…
Cancel
Save