Browse Source

Merge branch '3.1.x' into evita-anexada-ciclica

pull/2670/head
João Rodrigues 7 years ago
committed by GitHub
parent
commit
5730f9eb57
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      docker-compose.yml
  2. 2
      sapl/materia/views.py
  3. 62
      sapl/parlamentares/forms.py
  4. 5
      sapl/parlamentares/urls.py
  5. 30
      sapl/parlamentares/views.py
  6. 24
      sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
  7. 38
      sapl/relatorios/views.py
  8. 1
      sapl/rules/map_rules.py
  9. 55
      sapl/sessao/forms.py
  10. 34
      sapl/sessao/migrations/0034_oradorordemdia.py
  11. 20
      sapl/sessao/migrations/0035_resumoordenacao_decimo_quarto.py
  12. 9
      sapl/sessao/models.py
  13. 7
      sapl/sessao/urls.py
  14. 76
      sapl/sessao/views.py
  15. 2
      sapl/settings.py
  16. 2
      sapl/templates/base.html
  17. 8
      sapl/templates/parlamentares/layouts.yaml
  18. 44
      sapl/templates/parlamentares/parlamentar_filter.html
  19. 9
      sapl/templates/parlamentares/parlamentares_list.html
  20. 8
      sapl/templates/parlamentares/vincular_parlamentar.html
  21. 1
      sapl/templates/relatorios/relatorio_ata.html
  22. 13
      sapl/templates/sessao/blocos_ata/oradores_ordemdia.html
  23. 15
      sapl/templates/sessao/blocos_resumo/oradores_ordemdia.html
  24. 6
      sapl/templates/sessao/layouts.yaml
  25. 3
      sapl/templates/sessao/resumo.html
  26. 1
      sapl/templates/sessao/resumo_ata.html
  27. 2
      sapl/templates/sessao/subnav.yaml
  28. 2
      setup.py

2
docker-compose.yml

@ -11,7 +11,7 @@ sapldb:
ports: ports:
- "5432:5432" - "5432:5432"
sapl: sapl:
image: interlegis/sapl:3.1.150 image: interlegis/sapl:3.1.152
restart: always restart: always
environment: environment:
ADMIN_PASSWORD: interlegis ADMIN_PASSWORD: interlegis

2
sapl/materia/views.py

@ -1987,7 +1987,7 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
file_path = os.path.join(diretorio, file_path = os.path.join(diretorio,
request.FILES['arquivo'].name) request.FILES['arquivo'].name)
shutil.copy2(tmp_name, file_path) shutil.copy2(tmp_name, file_path)
doc.arquivo.name = file_path.split(MEDIA_ROOT)[1] # Retira MEDIA_ROOT do nome doc.arquivo.name = file_path.split(MEDIA_ROOT + "/")[1] # Retira MEDIA_ROOT do nome
doc.save() doc.save()
os.remove(tmp_name) os.remove(tmp_name)

62
sapl/parlamentares/forms.py

@ -525,3 +525,65 @@ class VotanteForm(ModelForm):
votante.user = u votante.user = u
votante.save() votante.save()
return votante return votante
class VincularParlamentarForm(forms.Form):
logger = logging.getLogger(__name__)
parlamentar = forms.ModelChoiceField(
label=Parlamentar._meta.verbose_name,
queryset=Parlamentar.objects.filter(ativo=True),
required=True,
empty_label='Selecione'
)
legislatura = forms.ModelChoiceField(
label=Legislatura._meta.verbose_name,
queryset=Legislatura.objects.all(),
required=True,
empty_label='Selecione'
)
data_expedicao_diploma = forms.DateField(
label='Data de Expedição do Diploma',
required=False,
widget=forms.DateInput(format='%d/%m/%Y')
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
row1 = to_row([
('parlamentar', 6),
('legislatura', 3),
('data_expedicao_diploma', 3)
])
self.helper = SaplFormHelper()
self.helper.layout = Layout(
Fieldset(
'Vincular Parlamentar',
row1,
form_actions(label='Vincular')
)
)
def clean(self):
super().clean()
if not self.is_valid():
return self.cleaned_data
cleaned_data = self.cleaned_data
parlamentar = cleaned_data['parlamentar']
legislatura = cleaned_data['legislatura']
data_expedicao_diploma = cleaned_data['data_expedicao_diploma']
if parlamentar.mandato_set.filter(legislatura=legislatura):
self.logger.error('Parlamentar já está vinculado a legislatura informada.')
raise ValidationError(_('Parlamentar já está vinculado a legislatura informada.'))
elif data_expedicao_diploma and legislatura.data_inicio <= data_expedicao_diploma:
self.logger.error('Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.')
raise ValidationError(_('Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.'))
return cleaned_data

5
sapl/parlamentares/urls.py

@ -19,7 +19,7 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
parlamentares_frente_selected, parlamentares_frente_selected,
remove_parlamentar_composicao, remove_parlamentar_composicao,
parlamentares_filiados, parlamentares_filiados,
PesquisarParlamentarView) PesquisarParlamentarView, VincularParlamentarView)
from .apps import AppConfig from .apps import AppConfig
@ -41,6 +41,9 @@ urlpatterns = [
url(r'^parlamentar/(?P<pk>\d+)/materias$', url(r'^parlamentar/(?P<pk>\d+)/materias$',
ParlamentarMateriasView.as_view(), name='parlamentar_materias'), ParlamentarMateriasView.as_view(), name='parlamentar_materias'),
url(r'^parlamentar/vincular-parlamentar/$',
VincularParlamentarView.as_view(), name='vincular_parlamentar'),
url(r'^sistema/coligacao/', url(r'^sistema/coligacao/',
include(ColigacaoCrud.get_urls() + include(ColigacaoCrud.get_urls() +
ComposicaoColigacaoCrud.get_urls())), ComposicaoColigacaoCrud.get_urls())),

30
sapl/parlamentares/views.py

@ -3,6 +3,7 @@ import json
import logging import logging
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
from django.core.urlresolvers import reverse, reverse_lazy from django.core.urlresolvers import reverse, reverse_lazy
@ -33,7 +34,7 @@ from sapl.parlamentares.apps import AppConfig
from sapl.utils import (parlamentares_ativos, show_results_filter_set) from sapl.utils import (parlamentares_ativos, show_results_filter_set)
from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm, from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm,
ParlamentarCreateForm, ParlamentarForm, VotanteForm, ParlamentarFilterSet) ParlamentarCreateForm, ParlamentarForm, VotanteForm, ParlamentarFilterSet, VincularParlamentarForm)
from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
Dependente, Filiacao, Frente, Legislatura, Mandato, Dependente, Filiacao, Frente, Legislatura, Mandato,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
@ -1132,3 +1133,30 @@ def altera_field_mesa_public_view(request):
'lista_fotos': lista_fotos, 'lista_fotos': lista_fotos,
'sessao_selecionada': sessao_selecionada, 'sessao_selecionada': sessao_selecionada,
'msg': ('', 1)}) 'msg': ('', 1)})
class VincularParlamentarView(PermissionRequiredMixin, FormView):
logger = logging.getLogger(__name__)
form_class = VincularParlamentarForm
template_name = 'parlamentares/vincular_parlamentar.html'
permission_required = ('parlamentares.add_parlamentar', )
def get_success_url(self):
return reverse('sapl.parlamentares:parlamentar_list')
def form_valid(self, form):
kwargs = {
'parlamentar': form.cleaned_data['parlamentar'],
'legislatura': form.cleaned_data['legislatura'],
'data_inicio_mandato': form.cleaned_data['legislatura'].data_inicio,
'data_fim_mandato': form.cleaned_data['legislatura'].data_fim
}
data_expedicao_diploma = form.cleaned_data.get('data_expedicao_diploma')
if data_expedicao_diploma:
kwargs.update({'data_expedicao_diploma': data_expedicao_diploma})
mandato = Mandato.objects.create(**kwargs)
mandato.save()
return HttpResponseRedirect(self.get_success_url())

24
sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py

@ -340,6 +340,24 @@ def votacao_vot_nom(lst_votacao_vot_nom):
return tmp return tmp
def oradores_ordemdia(lst_oradores_ordemdia):
"""
"""
tmp = ''
tmp += '\t\t<para style="P1">Oradores da Ordem do Dia</para>\n'
tmp += '\t\t<para style="P2">\n'
tmp += '\t\t\t<font color="white"> <br/></font>\n'
tmp += '\t\t</para>\n'
for orador_ordemdia in lst_oradores_ordemdia:
tmp += '\t\t<para style="P2" spaceAfter="5"><b>' + \
str(orador_ordemdia['num_ordem']) + '</b> - ' + \
orador_ordemdia['nome_parlamentar'] + '/' + \
str(orador_ordemdia['sigla']) + ' - ' + \
str(orador_ordemdia['observacao']) + '</para>\n'
return tmp
def oradores(lst_oradores): def oradores(lst_oradores):
""" """
@ -374,7 +392,7 @@ def ocorrencias(lst_ocorrencias):
return tmp return tmp
def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_expediente_materia_vot_nom, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_votacao_vot_nom, lst_oradores, lst_ocorrencias): def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_expediente_materia_vot_nom, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_votacao_vot_nom, lst_oradores_ordemdia, lst_oradores, lst_ocorrencias):
""" """
""" """
arquivoPdf = str(int(time.time() * 100)) + ".pdf" arquivoPdf = str(int(time.time() * 100)) + ".pdf"
@ -409,6 +427,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao
'v_n_mat_o_d': votacao_vot_nom(lst_votacao_vot_nom), 'v_n_mat_o_d': votacao_vot_nom(lst_votacao_vot_nom),
'mesa_d': mesa(lst_mesa), 'mesa_d': mesa(lst_mesa),
'oradores_exped': oradores_expediente(lst_oradores_expediente), 'oradores_exped': oradores_expediente(lst_oradores_expediente),
'oradores_o_d': oradores_ordemdia(lst_oradores_ordemdia),
'oradores_expli': oradores(lst_oradores), 'oradores_expli': oradores(lst_oradores),
'ocorr_sessao': ocorrencias(lst_ocorrencias) 'ocorr_sessao': ocorrencias(lst_ocorrencias)
} }
@ -428,6 +447,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao
tmp += dict_ord_template[ordenacao.decimo_primeiro] tmp += dict_ord_template[ordenacao.decimo_primeiro]
tmp += dict_ord_template[ordenacao.decimo_segundo] tmp += dict_ord_template[ordenacao.decimo_segundo]
tmp += dict_ord_template[ordenacao.decimo_terceiro] tmp += dict_ord_template[ordenacao.decimo_terceiro]
tmp += dict_ord_template[ordenacao.decimo_quarto]
except KeyError as e: except KeyError as e:
logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar " logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar "
"configuração de ordenação. Utilizando ordenação padrão.") "configuração de ordenação. Utilizando ordenação padrão.")
@ -441,6 +461,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao
tmp += presenca_ordem_dia(lst_presenca_ordem_dia) tmp += presenca_ordem_dia(lst_presenca_ordem_dia)
tmp += votacao(lst_votacao) tmp += votacao(lst_votacao)
tmp += votacao_vot_nom(lst_votacao_vot_nom) tmp += votacao_vot_nom(lst_votacao_vot_nom)
tmp += oradores_ordemdia(lst_oradores_ordemdia)
tmp += oradores(lst_oradores) tmp += oradores(lst_oradores)
tmp += ocorrencias(lst_ocorrencias) tmp += ocorrencias(lst_ocorrencias)
@ -455,6 +476,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao
tmp += presenca_ordem_dia(lst_presenca_ordem_dia) tmp += presenca_ordem_dia(lst_presenca_ordem_dia)
tmp += votacao(lst_votacao) tmp += votacao(lst_votacao)
tmp += votacao_vot_nom(lst_votacao_vot_nom) tmp += votacao_vot_nom(lst_votacao_vot_nom)
tmp += oradores_ordemdia(lst_oradores_ordemdia)
tmp += oradores(lst_oradores) tmp += oradores(lst_oradores)
tmp += ocorrencias(lst_ocorrencias) tmp += ocorrencias(lst_ocorrencias)

38
sapl/relatorios/views.py

@ -23,7 +23,7 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao,
Orador, OradorExpediente, Orador, OradorExpediente,
OrdemDia, PresencaOrdemDia, SessaoPlenaria, OrdemDia, PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, OcorrenciaSessao, SessaoPlenariaPresenca, OcorrenciaSessao,
RegistroVotacao, VotoParlamentar) RegistroVotacao, VotoParlamentar, OradorOrdemDia)
from sapl.settings import STATIC_ROOT from sapl.settings import STATIC_ROOT
from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data
@ -31,6 +31,7 @@ from sapl.sessao.views import (get_identificação_basica, get_mesa_diretora,
get_presenca_sessao, get_expedientes, get_presenca_sessao, get_expedientes,
get_materias_expediente, get_oradores_expediente, get_materias_expediente, get_oradores_expediente,
get_presenca_ordem_do_dia, get_materias_ordem_do_dia, get_presenca_ordem_do_dia, get_materias_ordem_do_dia,
get_oradores_ordemdia,
get_oradores_explicações_pessoais, get_ocorrencias_da_sessão, get_assinaturas) get_oradores_explicações_pessoais, get_ocorrencias_da_sessão, get_assinaturas)
from .templates import (pdf_capa_processo_gerar, from .templates import (pdf_capa_processo_gerar,
@ -780,6 +781,35 @@ def get_sessao_plenaria(sessao, casa):
} }
lst_votacao_vot_nom.append(dic_votacao_vot_nom) lst_votacao_vot_nom.append(dic_votacao_vot_nom)
# Lista dos oradores da Ordem do Dia
lst_oradores_ordemdia = []
oradores_ordem_dia = OradorOrdemDia.objects.filter(
sessao_plenaria=sessao
).order_by('numero_ordem')
for orador_ordemdia in oradores_ordem_dia:
parlamentar_orador = Parlamentar.objects.get(
id=orador_ordemdia.parlamentar.id
)
sigla_partido = Filiacao.objects.filter(
parlamentar=parlamentar_orador
).first()
if not sigla_partido:
sigla_p = ""
else:
sigla_p = sigla_partido.partido.sigla
dic_oradores_ordemdia = {
'num_ordem': orador_ordemdia.numero_ordem,
'nome_parlamentar': parlamentar_orador.nome_parlamentar,
'observacao': orador_ordemdia.observacao,
'sigla': sigla_p
}
lst_oradores_ordemdia.append(dic_oradores_ordemdia)
# Lista dos oradores nas Explicações Pessoais # Lista dos oradores nas Explicações Pessoais
lst_oradores = [] lst_oradores = []
for orador in Orador.objects.filter( for orador in Orador.objects.filter(
@ -830,6 +860,7 @@ def get_sessao_plenaria(sessao, casa):
lst_presenca_ordem_dia, lst_presenca_ordem_dia,
lst_votacao, lst_votacao,
lst_votacao_vot_nom, lst_votacao_vot_nom,
lst_oradores_ordemdia,
lst_oradores, lst_oradores,
lst_ocorrencias) lst_ocorrencias)
@ -886,7 +917,8 @@ def relatorio_sessao_plenaria(request, pk):
lst_oradores_expediente, lst_oradores_expediente,
lst_presenca_ordem_dia, lst_presenca_ordem_dia,
lst_votacao, lst_votacao,
lst_votacao_vot_nom, lst_votacao_vot_nom,
lst_oradores_ordemdia,
lst_oradores, lst_oradores,
lst_ocorrencias) = get_sessao_plenaria(sessao, casa) lst_ocorrencias) = get_sessao_plenaria(sessao, casa)
@ -910,6 +942,7 @@ def relatorio_sessao_plenaria(request, pk):
lst_presenca_ordem_dia, lst_presenca_ordem_dia,
lst_votacao, lst_votacao,
lst_votacao_vot_nom, lst_votacao_vot_nom,
lst_oradores_ordemdia,
lst_oradores, lst_oradores,
lst_ocorrencias) lst_ocorrencias)
@ -1256,6 +1289,7 @@ def resumo_ata_pdf(request,pk):
context.update(get_oradores_expediente(sessao_plenaria)) context.update(get_oradores_expediente(sessao_plenaria))
context.update(get_presenca_ordem_do_dia(sessao_plenaria)) context.update(get_presenca_ordem_do_dia(sessao_plenaria))
context.update(get_materias_ordem_do_dia(sessao_plenaria)) context.update(get_materias_ordem_do_dia(sessao_plenaria))
context.update(get_oradores_ordemdia(sessao_plenaria))
context.update(get_oradores_explicações_pessoais(sessao_plenaria)) context.update(get_oradores_explicações_pessoais(sessao_plenaria))
context.update(get_ocorrencias_da_sessão(sessao_plenaria)) context.update(get_ocorrencias_da_sessão(sessao_plenaria))
context.update(get_assinaturas(sessao_plenaria)) context.update(get_assinaturas(sessao_plenaria))

1
sapl/rules/map_rules.py

@ -175,6 +175,7 @@ rules_group_sessao = {
(sessao.ExpedienteSessao, __base__, __perms_publicas__), (sessao.ExpedienteSessao, __base__, __perms_publicas__),
(sessao.Orador, __base__, __perms_publicas__), (sessao.Orador, __base__, __perms_publicas__),
(sessao.OradorExpediente, __base__, __perms_publicas__), (sessao.OradorExpediente, __base__, __perms_publicas__),
(sessao.OradorOrdemDia, __base__, __perms_publicas__),
(sessao.OrdemDia, __base__, __perms_publicas__), (sessao.OrdemDia, __base__, __perms_publicas__),
(sessao.PresencaOrdemDia, __base__, __perms_publicas__), (sessao.PresencaOrdemDia, __base__, __perms_publicas__),
(sessao.RegistroVotacao, __base__, __perms_publicas__), (sessao.RegistroVotacao, __base__, __perms_publicas__),

55
sapl/sessao/forms.py

@ -26,7 +26,7 @@ from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES,
from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia, from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia,
Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, TipoResultadoVotacao, SessaoPlenariaPresenca, TipoResultadoVotacao,
OcorrenciaSessao, RetiradaPauta, TipoRetiradaPauta) OcorrenciaSessao, RetiradaPauta, TipoRetiradaPauta, OradorOrdemDia)
MES_CHOICES = RANGE_MESES MES_CHOICES = RANGE_MESES
@ -45,7 +45,8 @@ ORDENACAO_RESUMO = [('cont_mult', 'Conteúdo Multimídia'),
('oradores_expli', 'Oradores das Explicações Pessoais'), ('oradores_expli', 'Oradores das Explicações Pessoais'),
('ocorr_sessao', 'Ocorrências da Sessão'), ('ocorr_sessao', 'Ocorrências da Sessão'),
('v_n_mat_exp', 'Votações Nominais - Matérias do Expediente'), ('v_n_mat_exp', 'Votações Nominais - Matérias do Expediente'),
('v_n_mat_o_d', 'Votações Nominais - Matérias da Ordem do Dia')] ('v_n_mat_o_d', 'Votações Nominais - Matérias da Ordem do Dia'),
('oradores_o_d', 'Oradores da Ordem do Dia')]
class SessaoPlenariaForm(FileFieldCheckMixin, ModelForm): class SessaoPlenariaForm(FileFieldCheckMixin, ModelForm):
@ -758,6 +759,49 @@ class OradorExpedienteForm(ModelForm):
exclude = ['sessao_plenaria'] exclude = ['sessao_plenaria']
class OradorOrdemDiaForm(ModelForm):
def __init__(self, *args, **kwargs):
super(OradorOrdemDiaForm, self).__init__(*args, **kwargs)
id_sessao = int(self.initial['id_sessao'])
ids = [p.parlamentar.id for p in PresencaOrdemDia.objects.filter(
sessao_plenaria_id=id_sessao
)]
self.fields['parlamentar'].queryset = Parlamentar.objects.filter(
id__in=ids
).order_by('nome_parlamentar')
def clean(self):
super(OradorOrdemDiaForm, self).clean()
cleaned_data = self.cleaned_data
if not self.is_valid():
return self.cleaned_data
sessao_id = self.initial['id_sessao']
numero = self.initial.get('numero')
numero_ordem = cleaned_data['numero_ordem']
ordem = OradorOrdemDia.objects.filter(
sessao_plenaria_id=sessao_id,
numero_ordem=numero_ordem
).exists()
if ordem and numero_ordem != numero:
raise ValidationError(_(
"Já existe orador nesta posição de ordem de pronunciamento"
))
return self.cleaned_data
class Meta:
model = OradorOrdemDia
exclude = ['sessao_plenaria']
class PautaSessaoFilterSet(SessaoPlenariaFilterSet): class PautaSessaoFilterSet(SessaoPlenariaFilterSet):
titulo = _('Pesquisa de Pauta de Sessão') titulo = _('Pesquisa de Pauta de Sessão')
@ -789,6 +833,8 @@ class ResumoOrdenacaoForm(forms.Form):
choices=ORDENACAO_RESUMO) choices=ORDENACAO_RESUMO)
decimo_terceiro = forms.ChoiceField(label='13°', decimo_terceiro = forms.ChoiceField(label='13°',
choices=ORDENACAO_RESUMO) choices=ORDENACAO_RESUMO)
decimo_quarto = forms.ChoiceField(label='14°',
choices=ORDENACAO_RESUMO)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(ResumoOrdenacaoForm, self).__init__(*args, **kwargs) super(ResumoOrdenacaoForm, self).__init__(*args, **kwargs)
@ -819,13 +865,16 @@ class ResumoOrdenacaoForm(forms.Form):
[('decimo_segundo', 12)]) [('decimo_segundo', 12)])
row13 = to_row( row13 = to_row(
[('decimo_terceiro', 12)]) [('decimo_terceiro', 12)])
row14 = to_row(
[('decimo_quarto', 12)]
)
self.helper = SaplFormHelper() self.helper = SaplFormHelper()
self.helper.layout = Layout( self.helper.layout = Layout(
Fieldset(_(''), Fieldset(_(''),
row1, row2, row3, row4, row5, row1, row2, row3, row4, row5,
row6, row7, row8, row9, row10, row6, row7, row8, row9, row10,
row11, row12, row13, row11, row12, row13, row14,
form_actions(label='Atualizar')) form_actions(label='Atualizar'))
) )

34
sapl/sessao/migrations/0034_oradorordemdia.py

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-03-26 16:14
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import sapl.sessao.models
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0025_auto_20180924_1724'),
('sessao', '0033_auto_20190228_1803'),
]
operations = [
migrations.CreateModel(
name='OradorOrdemDia',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('numero_ordem', models.PositiveIntegerField(verbose_name='Ordem de pronunciamento')),
('url_discurso', models.URLField(blank=True, max_length=150, verbose_name='URL Vídeo')),
('observacao', models.CharField(blank=True, max_length=150, verbose_name='Observação')),
('upload_anexo', models.FileField(blank=True, null=True, upload_to=sapl.sessao.models.anexo_upload_path, verbose_name='Anexo do Orador')),
('parlamentar', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Parlamentar', verbose_name='Parlamentar')),
('sessao_plenaria', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria')),
],
options={
'verbose_name_plural': 'Oradores da Ordem do Dia',
'verbose_name': 'Orador da Ordem do Dia',
},
),
]

20
sapl/sessao/migrations/0035_resumoordenacao_decimo_quarto.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-03-26 18:14
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sessao', '0034_oradorordemdia'),
]
operations = [
migrations.AddField(
model_name='resumoordenacao',
name='decimo_quarto',
field=models.CharField(default='Oradores da Ordem do Dia', max_length=30),
),
]

9
sapl/sessao/models.py

@ -378,6 +378,14 @@ class OradorExpediente(AbstractOrador): # OradoresExpediente
verbose_name_plural = _('Oradores do Expediente') verbose_name_plural = _('Oradores do Expediente')
@reversion.register()
class OradorOrdemDia(AbstractOrador): # OradoresOrdemDia
class Meta:
verbose_name = _('Orador da Ordem do Dia')
verbose_name_plural = _('Oradores da Ordem do Dia')
@reversion.register() @reversion.register()
class OrdemDia(AbstractOrdemDia): class OrdemDia(AbstractOrdemDia):
@ -579,6 +587,7 @@ class ResumoOrdenacao(models.Model):
decimo_primeiro = models.CharField(max_length=30,default="Ocorrências da Sessão") decimo_primeiro = models.CharField(max_length=30,default="Ocorrências da Sessão")
decimo_segundo = models.CharField(max_length=30, default="Votos Nominais Mat Expediente") decimo_segundo = models.CharField(max_length=30, default="Votos Nominais Mat Expediente")
decimo_terceiro = models.CharField(max_length=30, default="Votos Nominais Mat Ordem Dia") decimo_terceiro = models.CharField(max_length=30, default="Votos Nominais Mat Ordem Dia")
decimo_quarto = models.CharField(max_length=30, default="Oradores da Ordem do Dia")
class Meta: class Meta:
verbose_name = _('Ordenação do Resumo de uma Sessão') verbose_name = _('Ordenação do Resumo de uma Sessão')

7
sapl/sessao/urls.py

@ -4,7 +4,8 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
AdicionarVariasMateriasOrdemDia, BancadaCrud, AdicionarVariasMateriasOrdemDia, BancadaCrud,
BlocoCrud, CargoBancadaCrud, BlocoCrud, CargoBancadaCrud,
ExpedienteMateriaCrud, ExpedienteView, JustificativaAusenciaCrud, ExpedienteMateriaCrud, ExpedienteView, JustificativaAusenciaCrud,
OcorrenciaSessaoView, MateriaOrdemDiaCrud, MesaView, OradorCrud, OcorrenciaSessaoView, MateriaOrdemDiaCrud, OradorOrdemDiaCrud,
MesaView, OradorCrud,
OradorExpedienteCrud, PainelView, OradorExpedienteCrud, PainelView,
PautaSessaoDetailView, PautaSessaoView, PautaSessaoDetailView, PautaSessaoView,
PesquisarPautaSessaoView, PesquisarPautaSessaoView,
@ -44,7 +45,9 @@ urlpatterns = [
OradorExpedienteCrud.get_urls() + OradorExpedienteCrud.get_urls() +
ExpedienteMateriaCrud.get_urls() + ExpedienteMateriaCrud.get_urls() +
JustificativaAusenciaCrud.get_urls() + JustificativaAusenciaCrud.get_urls() +
MateriaOrdemDiaCrud.get_urls() + RetiradaPautaCrud.get_urls())), MateriaOrdemDiaCrud.get_urls() +
OradorOrdemDiaCrud.get_urls() +
RetiradaPautaCrud.get_urls())),
url(r'^sessao/(?P<pk>\d+)/mesa$', MesaView.as_view(), name='mesa'), url(r'^sessao/(?P<pk>\d+)/mesa$', MesaView.as_view(), name='mesa'),

76
sapl/sessao/views.py

@ -42,14 +42,14 @@ from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm,
MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet,
PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet, PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet,
SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm,
VotacaoNominalForm, RetiradaPautaForm) VotacaoNominalForm, RetiradaPautaForm, OradorOrdemDiaForm)
from .models import (Bancada, Bloco, CargoBancada, CargoMesa, from .models import (Bancada, Bloco, CargoBancada, CargoMesa,
ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa, ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa,
MateriaLegislativa, Orador, OradorExpediente, OrdemDia, MateriaLegislativa, Orador, OradorExpediente, OrdemDia,
PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao,
SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente,
TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar, TipoRetiradaPauta, TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar, TipoRetiradaPauta,
RetiradaPauta, TipoJustificativa, JustificativaAusencia) RetiradaPauta, TipoJustificativa, JustificativaAusencia, OradorOrdemDia)
TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria')
@ -618,6 +618,31 @@ class OradorExpedienteCrud(OradorCrud):
'numero': self.object.numero_ordem} 'numero': self.object.numero_ordem}
class OradorOrdemDiaCrud(OradorCrud):
model = OradorOrdemDia
class CreateView(MasterDetailCrud.CreateView):
form_class = OradorOrdemDiaForm
def get_initial(self):
return {'id_sessao': self.kwargs['pk']}
def get_success_url(self):
return reverse('sapl.sessao:oradorordemdia_list',
kwargs={'pk': self.kwargs['pk']})
class UpdateView(MasterDetailCrud.UpdateView):
form_class = OradorOrdemDiaForm
def get_initial(self):
initial = super(UpdateView, self).get_initial()
initial.update({'id_sessao': self.object.sessao_plenaria.id})
initial.update({'numero': self.object.numero_ordem})
return initial
class OradorCrud(OradorCrud): class OradorCrud(OradorCrud):
model = Orador model = Orador
@ -1290,7 +1315,8 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView):
'decimo': ordenacao.decimo, 'decimo': ordenacao.decimo,
'decimo_primeiro': ordenacao.decimo_primeiro, 'decimo_primeiro': ordenacao.decimo_primeiro,
'decimo_segundo': ordenacao.decimo_segundo, 'decimo_segundo': ordenacao.decimo_segundo,
'decimo_terceiro': ordenacao.decimo_terceiro}) 'decimo_terceiro': ordenacao.decimo_terceiro,
'decimo_quarto': ordenacao.decimo_quarto})
return initial return initial
def form_valid(self, form): def form_valid(self, form):
@ -1309,6 +1335,7 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView):
ordenacao.decimo_primeiro = form.cleaned_data['decimo_primeiro'] ordenacao.decimo_primeiro = form.cleaned_data['decimo_primeiro']
ordenacao.decimo_segundo = form.cleaned_data['decimo_segundo'] ordenacao.decimo_segundo = form.cleaned_data['decimo_segundo']
ordenacao.decimo_terceiro = form.cleaned_data['decimo_terceiro'] ordenacao.decimo_terceiro = form.cleaned_data['decimo_terceiro']
ordenacao.decimo_quarto = form.cleaned_data['decimo_quarto']
ordenacao.save() ordenacao.save()
@ -1584,6 +1611,32 @@ def get_materias_ordem_do_dia(sessao_plenaria):
return context return context
def get_oradores_ordemdia(sessao_plenaria):
oradores = []
oradores_ordem_dia = OradorOrdemDia.objects.filter(
sessao_plenaria_id=sessao_plenaria.id
).order_by('numero_ordem')
for orador in oradores_ordem_dia:
numero_ordem = orador.numero_ordem
url_discurso = orador.url_discurso
observacao = orador.observacao
parlamentar = Parlamentar.objects.get(
id=orador.parlamentar_id
)
o = {
'numero_ordem': numero_ordem,
'url_discurso': url_discurso,
'parlamentar': parlamentar,
'observacao': observacao
}
oradores.append(o)
context = {'oradores_ordemdia': oradores}
return context
def get_oradores_explicações_pessoais(sessao_plenaria): def get_oradores_explicações_pessoais(sessao_plenaria):
oradores_explicacoes = [] oradores_explicacoes = []
for orador in Orador.objects.filter( for orador in Orador.objects.filter(
@ -1698,6 +1751,9 @@ class ResumoView(DetailView):
context.update(get_materias_ordem_do_dia(self.object)) context.update(get_materias_ordem_do_dia(self.object))
# ===================================================================== # =====================================================================
# Oradores Ordem do Dia
context.update(get_oradores_ordemdia(self.object))
# =====================================================================
# Oradores nas Explicações Pessoais # Oradores nas Explicações Pessoais
context.update(get_oradores_explicações_pessoais(self.object)) context.update(get_oradores_explicações_pessoais(self.object))
# ===================================================================== # =====================================================================
@ -1718,6 +1774,7 @@ class ResumoView(DetailView):
'v_n_mat_o_d': 'votos_nominais_materias_ordem_dia.html', 'v_n_mat_o_d': 'votos_nominais_materias_ordem_dia.html',
'mesa_d': 'mesa_diretora.html', 'mesa_d': 'mesa_diretora.html',
'oradores_exped': 'oradores_expediente.html', 'oradores_exped': 'oradores_expediente.html',
'oradores_o_d': 'oradores_ordemdia.html',
'oradores_expli': 'oradores_explicacoes.html', 'oradores_expli': 'oradores_explicacoes.html',
'ocorr_sessao': 'ocorrencias_da_sessao.html' 'ocorr_sessao': 'ocorrencias_da_sessao.html'
} }
@ -1737,7 +1794,8 @@ class ResumoView(DetailView):
'decimo_ordenacao': dict_ord_template[ordenacao.decimo], 'decimo_ordenacao': dict_ord_template[ordenacao.decimo],
'decimo_primeiro_ordenacao': dict_ord_template[ordenacao.decimo_primeiro], 'decimo_primeiro_ordenacao': dict_ord_template[ordenacao.decimo_primeiro],
'decimo_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo], 'decimo_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo],
'decimo_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro]}) 'decimo_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro],
'decimo_quarto_ordenacao': dict_ord_template[ordenacao.decimo_quarto]})
except KeyError as e: except KeyError as e:
self.logger.error('user=' + self.request.user.username + '. ' + "KeyError: " + str(e) + ". Erro " self.logger.error('user=' + self.request.user.username + '. ' + "KeyError: " + str(e) + ". Erro "
"ao tentar utilizar configuração de ordenação. Utilizando ordenação padrão.") "ao tentar utilizar configuração de ordenação. Utilizando ordenação padrão.")
@ -1753,8 +1811,9 @@ class ResumoView(DetailView):
'nono_ordenacao': dict_ord_template['lista_p_o_d'], 'nono_ordenacao': dict_ord_template['lista_p_o_d'],
'decimo_ordenacao': dict_ord_template['mat_o_d'], 'decimo_ordenacao': dict_ord_template['mat_o_d'],
'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'], 'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'],
'decimo_segundo_ordenacao': dict_ord_template['oradores_expli'], 'decimo_segundo_ordenacao': dict_ord_template['oradores_o_d'],
'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao'] 'decimo_terceiro_ordenacao': dict_ord_template['oradores_expli'],
'decimo_quarto_ordenacao': dict_ord_template['ocorr_sessao']
}) })
else: else:
context.update( context.update(
@ -1769,8 +1828,9 @@ class ResumoView(DetailView):
'nono_ordenacao': dict_ord_template['lista_p_o_d'], 'nono_ordenacao': dict_ord_template['lista_p_o_d'],
'decimo_ordenacao': dict_ord_template['mat_o_d'], 'decimo_ordenacao': dict_ord_template['mat_o_d'],
'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'], 'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'],
'decimo_segundo_ordenacao': dict_ord_template['oradores_expli'], 'decimo_segundo_ordenacao': dict_ord_template['oradores_o_d'],
'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao'] 'decimo_terceiro_ordenacao': dict_ord_template['oradores_expli'],
'decimo_quarto_ordenacao': dict_ord_template['ocorr_sessao']
}) })
return context return context

2
sapl/settings.py

@ -41,7 +41,7 @@ ALLOWED_HOSTS = ['*']
LOGIN_REDIRECT_URL = '/' LOGIN_REDIRECT_URL = '/'
LOGIN_URL = '/login/?next=' LOGIN_URL = '/login/?next='
SAPL_VERSION = '3.1.150' SAPL_VERSION = '3.1.152'
if DEBUG: if DEBUG:
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

2
sapl/templates/base.html

@ -179,7 +179,7 @@
<small> <small>
Desenvolvido pelo <a href="http://www.interlegis.leg.br/">Interlegis</a> em software livre e aberto. Desenvolvido pelo <a href="http://www.interlegis.leg.br/">Interlegis</a> em software livre e aberto.
</small> </small>
<span>Release: 3.1.150</span> <span>Release: 3.1.152</span>
</p> </p>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">

8
sapl/templates/parlamentares/layouts.yaml

@ -30,7 +30,7 @@ SessaoLegislativa:
- data_inicio_intervalo data_fim_intervalo - data_inicio_intervalo data_fim_intervalo
Parlamentar: Parlamentar:
{% trans 'Cadastro do Parlamentar' %}: {% trans 'Dados do Parlamentar' %}:
- nome_parlamentar:8 ativo - nome_parlamentar:8 ativo
- nome_completo - nome_completo
- nivel_instrucao sexo data_nascimento - nivel_instrucao sexo data_nascimento
@ -47,7 +47,7 @@ Parlamentar:
- biografia - biografia
ParlamentarUpdate: ParlamentarUpdate:
{% trans 'Cadastro do Parlamentar' %}: {% trans 'Dados do Parlamentar' %}:
- nome_parlamentar:8 ativo - nome_parlamentar:8 ativo
- nome_completo - nome_completo
- nivel_instrucao sexo data_nascimento - nivel_instrucao sexo data_nascimento
@ -64,9 +64,7 @@ ParlamentarUpdate:
- biografia - biografia
ParlamentarCreate: ParlamentarCreate:
{% trans 'Dados do Mandato' %}: {% trans 'Dados do Parlamentar' %}:
- legislatura data_expedicao_diploma
{% trans 'Cadastro do Parlamentar' %}:
- nome_parlamentar:8 ativo - nome_parlamentar:8 ativo
- nome_completo - nome_completo
- nivel_instrucao sexo data_nascimento - nivel_instrucao sexo data_nascimento

44
sapl/templates/parlamentares/parlamentar_filter.html

@ -5,44 +5,44 @@
{% block base_content %} {% block base_content %}
{% if not show_results %} {% if not show_results %}
{% crispy filter.form %} {% crispy filter.form %}
{% endif %} {% else %}
<div class="actions btn-group float-right btn-group-sm" role="group">
{% if show_results %}
<div class="actions btn-group float-right" role="group">
<a href="{% url 'sapl.parlamentares:pesquisar_parlamentar' %}" class="btn btn-outline-primary">{% trans 'Fazer nova pesquisa' %}</a> <a href="{% url 'sapl.parlamentares:pesquisar_parlamentar' %}" class="btn btn-outline-primary">{% trans 'Fazer nova pesquisa' %}</a>
</div> {% if not request.user.is_anonymous %}
<br /><br /> <a href="{% url 'sapl.parlamentares:parlamentar_create' %}"class="btn btn-outline-primary">Cadastrar Parlamentar</a>
{% endif %}
</div>
<br>
{% if numero_res > 0 %} {% if numero_res > 0 %}
{% if numero_res == 1 %} {% if numero_res == 1 %}
<p>Foi encontrado {{ numero_res }} resultado</p> <p>Foi encontrado {{ numero_res }} resultado</p>
{% else %} {% else %}
<p>Foram encontrados {{ numero_res }} resultados</p> <p>Foram encontrados {{ numero_res }} resultados</p>
{% endif %} {% endif %}
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>
<tr> <tr>
<th>Nome do Parlamentar</th> <th>Nome do Parlamentar</th>
<th>Nome Completo</th> <th>Nome Completo</th>
<th>Ativo</th> <th>Ativo</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for usuario in page_obj %} {% for usuario in page_obj %}
<tr> <tr>
<td> <td>
<a href="{% url 'sapl.parlamentares:parlamentar_detail' usuario.pk %}">{{usuario.nome_parlamentar}}</a> <a href="{% url 'sapl.parlamentares:parlamentar_detail' usuario.pk %}">{{usuario.nome_parlamentar}}</a>
</td> </td>
<td>{{ usuario.nome_completo }}</td> <td>{{ usuario.nome_completo }}</td>
<td>{% if usuario.ativo %} Sim {% else %} Não {% endif %}</td> <td>{% if usuario.ativo %} Sim {% else %} Não {% endif %}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% else %} {% else %}
<font size="4"><p align="center">{{ NO_ENTRIES_MSG }}</p></font> <font size="4"><p align="center">{{ NO_ENTRIES_MSG }}</p></font>
{% endif %} {% endif %}
{% endif %} {% endif %}
<br/> <br/>
{% include 'paginacao.html'%} {% include 'paginacao.html'%}
<br /><br /><br /> <br /><br /><br />

9
sapl/templates/parlamentares/parlamentares_list.html

@ -1,6 +1,15 @@
{% extends "crud/list.html" %} {% extends "crud/list.html" %}
{% load i18n %} {% load i18n %}
{% load crispy_forms_tags cropping%} {% load crispy_forms_tags cropping%}
{% block actions %}
<div class="actions btn-group float-right btn-group-sm" role="group">
<a href="{% url 'sapl.parlamentares:pesquisar_parlamentar' %}" class="btn btn-outline-primary">Pesquisar Parlamentar</a>
{% if not request.user.is_anonymous %}
<a href="{% url 'sapl.parlamentares:vincular_parlamentar' %}" class="btn btn-outline-primary">Vincular Parlamentar</a>
{% endif %}
{% block more_buttons %}{% endblock more_buttons %}
</div>
{% endblock actions %}
{% block extra_content %} {% block extra_content %}
<fieldset class="form-group"> <fieldset class="form-group">
<legend>Selecione o Período</legend> <legend>Selecione o Período</legend>

8
sapl/templates/parlamentares/vincular_parlamentar.html

@ -0,0 +1,8 @@
{% extends "crud/form.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% load common_tags %}
{% block detail_content %}
{% crispy form %}
{% endblock detail_content %}

1
sapl/templates/relatorios/relatorio_ata.html

@ -46,6 +46,7 @@
{% include 'sessao/blocos_ata/oradores_expediente.html' %} {% include 'sessao/blocos_ata/oradores_expediente.html' %}
{% include 'sessao/blocos_ata/lista_presenca_ordem_dia.html' %} {% include 'sessao/blocos_ata/lista_presenca_ordem_dia.html' %}
{% include 'sessao/blocos_ata/materias_ordem_dia.html' %} {% include 'sessao/blocos_ata/materias_ordem_dia.html' %}
{% include 'sessao/blocos_ata/oradores_ordemdia.html' %}
{% include 'sessao/blocos_ata/oradores_explicacoes.html' %} {% include 'sessao/blocos_ata/oradores_explicacoes.html' %}
{% include 'sessao/blocos_ata/ocorrencias_da_sessao.html' %} {% include 'sessao/blocos_ata/ocorrencias_da_sessao.html' %}

13
sapl/templates/sessao/blocos_ata/oradores_ordemdia.html

@ -0,0 +1,13 @@
<fieldset>
<p aling="justify">
{% if oradores_ordemdia %}
<strong>Oradores da Ordem do Dia: </strong>
{% for orador in oradores_ordemdia %}
<div><b>{{ orador.numero_ordem }}</b> - {{ orador.parlamentar.nome_completo }}</div>
<div>{{ orador.url_discurso }}</div>
<div>{{ orador.observacao }}</div>
</br>
{% endfor %}
{% endif %}
</p>
</fieldset>

15
sapl/templates/sessao/blocos_resumo/oradores_ordemdia.html

@ -0,0 +1,15 @@
<fieldset>
<legend>Oradores da Ordem do Dia</legend>
<div class="row">
<div class="col-md-4">Parlamentar</div>
<div class="col-md-4">Discurso</div>
<div class="col-md-4">Observação</div>
</div>
<div class="row">
{% for orador in oradores_ordemdia %}
<div class="col-md-4"><b>{{ orador.numero_ordem }}</b> - {{ orador.parlamentar }}</div>
<div class="col-md-4">{{ orador.url_discurso }}</div>
<div class="col-md-4">{{ orador.observacao }}</div>
{% endfor %}
</div>
</fieldset>

6
sapl/templates/sessao/layouts.yaml

@ -39,6 +39,12 @@ OradorExpediente:
- url_discurso observacao - url_discurso observacao
- upload_anexo - upload_anexo
OradorOrdemDia:
{% trans 'Orador da Ordem do Dia' %}:
- numero_ordem parlamentar
- url_discurso observacao
- upload_anexo
ExpedienteMateria: ExpedienteMateria:
{% trans 'Matéria do Expediente' %}: {% trans 'Matéria do Expediente' %}:
- data_ordem numero_ordem - data_ordem numero_ordem

3
sapl/templates/sessao/resumo.html

@ -58,5 +58,8 @@
{% include 'sessao/blocos_resumo/'|add:decimo_terceiro_ordenacao %} {% include 'sessao/blocos_resumo/'|add:decimo_terceiro_ordenacao %}
<br /><br /><br /> <br /><br /><br />
{% include 'sessao/blocos_resumo/'|add:decimo_quarto_ordenacao %}
<br /><br /><br />
{% endblock detail_content %} {% endblock detail_content %}

1
sapl/templates/sessao/resumo_ata.html

@ -32,5 +32,6 @@
{% include 'sessao/blocos_ata/'|add:decimo_primeiro_ordenacao %} {% include 'sessao/blocos_ata/'|add:decimo_primeiro_ordenacao %}
{% include 'sessao/blocos_ata/'|add:decimo_segundo_ordenacao %} {% include 'sessao/blocos_ata/'|add:decimo_segundo_ordenacao %}
{% include 'sessao/blocos_ata/'|add:decimo_terceiro_ordenacao %} {% include 'sessao/blocos_ata/'|add:decimo_terceiro_ordenacao %}
{% include 'sessao/blocos_ata/'|add:decimo_quarto_ordenacao %}
{% include 'sessao/blocos_ata/assinaturas.html' %} {% include 'sessao/blocos_ata/assinaturas.html' %}
{% endblock detail_content %} {% endblock detail_content %}

2
sapl/templates/sessao/subnav.yaml

@ -35,6 +35,8 @@
url: ordemdia_list url: ordemdia_list
- title: {% trans 'Presença Ordem do Dia' %} - title: {% trans 'Presença Ordem do Dia' %}
url: presencaordemdia url: presencaordemdia
- title: {% trans 'Oradores da Ordem do Dia' %}
url: oradorordemdia_list
- title: {% trans 'Votação em Bloco' %} - title: {% trans 'Votação em Bloco' %}
url: votacao_bloco_ordemdia url: votacao_bloco_ordemdia
check_permission: sessao.add_sessaoplenaria check_permission: sessao.add_sessaoplenaria

2
setup.py

@ -43,7 +43,7 @@ install_requires = [
] ]
setup( setup(
name='interlegis-sapl', name='interlegis-sapl',
version='3.1.150', version='3.1.152',
packages=find_packages(), packages=find_packages(),
include_package_data=True, include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',

Loading…
Cancel
Save