Browse Source

Os ticket #997362 (Adição de considerações finais na sessão) (#3437)

* Adicionada classe de ConsideracoesFinais

* Migration de ConsideracoesFinais

* Adicionado interface visual para ConsideracoesFinais

* Migration de adição di decimo_quinta_ordenacao em resumoordenacao

* Alterações para disponibilizar ConsideracoesFinais nas abas de resumo e resumo ata

* Adicionado o import de get_consideracoes_finais

* Adicionado consideracoes finais a outras abas

* Removido tag inutil do html

* Consertado problemas com consideracoes finais, ocorrencias da sessao e oradores de explicacoes pessoais - Fix #3434

* Adiciona mirror me drone.yaml

* Adiciona pull condicional em drone.yaml

* Retirado o hardcode e adicionado ConsideracoesFinais a tabela auxiliar

* Correções nos templates

* Adicionado observação das explicações pessoais à resumo_ata e resumo

* Adicionado observacoes das explicacoes ao PDF

Co-authored-by: eribeiro <edwardr@senado.leg.br>
pull/3445/head 3.1.162-RC9
Alvaro Gouvea 3 years ago
committed by GitHub
parent
commit
a1c7a040a6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 23
      sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
  2. 2
      sapl/relatorios/templates/pdf_sessao_plenaria_preparar_pysc.py
  3. 51
      sapl/relatorios/views.py
  4. 10
      sapl/sessao/forms.py
  5. 27
      sapl/sessao/migrations/0056_ConsideracoesFinais.py
  6. 18
      sapl/sessao/migrations/0057_resumoordenacao_decimo_quinto.py
  7. 22
      sapl/sessao/models.py
  8. 4
      sapl/sessao/urls.py
  9. 94
      sapl/sessao/views.py
  10. 4
      sapl/templates/relatorios/blocos_sessao_plenaria/consideracoes_finais.html
  11. 4
      sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_da_sessao.html
  12. 4
      sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_sessao.html
  13. 2
      sapl/templates/relatorios/blocos_sessao_plenaria/oradores_explicacoes.html
  14. 1
      sapl/templates/relatorios/relatorio_ata.html
  15. 2
      sapl/templates/relatorios/relatorio_sessao_plenaria.html
  16. 8
      sapl/templates/sessao/blocos_ata/consideracoes_finais.html
  17. 9
      sapl/templates/sessao/blocos_resumo/consideracoes_finais.html
  18. 10
      sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html
  19. 29
      sapl/templates/sessao/consideracoes_finais.html
  20. 0
      sapl/templates/sessao/ocorrencias_da_sessao.html
  21. 3
      sapl/templates/sessao/resumo.html
  22. 1
      sapl/templates/sessao/resumo_ata.html
  23. 3
      sapl/templates/sessao/resumo_ordenacao.html
  24. 2
      sapl/templates/sessao/subnav-solene.yaml
  25. 2
      sapl/templates/sessao/subnav.yaml

23
sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py

@ -399,8 +399,23 @@ def ocorrencias(lst_ocorrencias):
tmp += '\t\t</para>\n' tmp += '\t\t</para>\n'
return tmp return tmp
def consideracoes(lst_consideracoes):
tmp = ''
if lst_consideracoes:
tmp += '\t\t<para style="P1">Consideracoes Finais</para>\n'
tmp += '\t\t<para style="P2">\n'
tmp += '\t\t\t<font color="white"> </font>\n'
tmp += '\t\t</para>\n'
for consideracoes in lst_consideracoes:
tmp += '\t\t<para style="P3">' + \
str(consideracoes.conteudo) + '</para>\n'
tmp += '\t\t<para style="P2">\n'
tmp += '\t\t\t<font color="white"> </font>\n'
tmp += '\t\t</para>\n'
return tmp
def principal(rodape_dic, imagem, inf_basicas_dic, cont_mult_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): def principal(rodape_dic, imagem, inf_basicas_dic, cont_mult_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, lst_consideracoes):
""" """
""" """
arquivoPdf = str(int(time.time() * 100)) + ".pdf" arquivoPdf = str(int(time.time() * 100)) + ".pdf"
@ -437,7 +452,8 @@ def principal(rodape_dic, imagem, inf_basicas_dic, cont_mult_dic, lst_mesa, lst_
'oradores_exped': oradores_expediente(lst_oradores_expediente), 'oradores_exped': oradores_expediente(lst_oradores_expediente),
'oradores_o_d': oradores_ordemdia(lst_oradores_ordemdia), '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),
'cons_finais': consideracoes(lst_consideracoes)
} }
if ordenacao: if ordenacao:
@ -456,6 +472,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, cont_mult_dic, lst_mesa, lst_
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] tmp += dict_ord_template[ordenacao.decimo_quarto]
tmp += dict_ord_template[ordenacao.decimo_quinto]
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.")
@ -473,6 +490,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, cont_mult_dic, lst_mesa, lst_
tmp += oradores_ordemdia(lst_oradores_ordemdia) tmp += oradores_ordemdia(lst_oradores_ordemdia)
tmp += oradores(lst_oradores) tmp += oradores(lst_oradores)
tmp += ocorrencias(lst_ocorrencias) tmp += ocorrencias(lst_ocorrencias)
tmp += consideracoes(lst_consideracoes)
else: else:
tmp += inf_basicas(inf_basicas_dic) tmp += inf_basicas(inf_basicas_dic)
@ -489,6 +507,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, cont_mult_dic, lst_mesa, lst_
tmp += oradores_ordemdia(lst_oradores_ordemdia) tmp += oradores_ordemdia(lst_oradores_ordemdia)
tmp += oradores(lst_oradores) tmp += oradores(lst_oradores)
tmp += ocorrencias(lst_ocorrencias) tmp += ocorrencias(lst_ocorrencias)
tmp += consideracoes(lst_consideracoes)
tmp += '\t</story>\n' tmp += '\t</story>\n'
tmp += '</document>\n' tmp += '</document>\n'

2
sapl/relatorios/templates/pdf_sessao_plenaria_preparar_pysc.py

@ -277,7 +277,7 @@ if context.REQUEST['data'] != '':
# return lst_votacao # return lst_votacao
sessao = session.id sessao = session.id
caminho = context.pdf_sessao_plenaria_gerar(rodape, sessao, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, caminho = context.pdf_sessao_plenaria_gerar(rodape, sessao, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao,
lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores) lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores, lst_ocorrencias, lst_consideracoes)
if caminho == 'aviso': if caminho == 'aviso':
response.redirect('mensagem_emitir_proc') response.redirect('mensagem_emitir_proc')
else: else:

51
sapl/relatorios/views.py

@ -25,7 +25,8 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao,
Orador, OradorExpediente, Orador, OradorExpediente,
OrdemDia, PresencaOrdemDia, SessaoPlenaria, OrdemDia, PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, OcorrenciaSessao, SessaoPlenariaPresenca, OcorrenciaSessao,
RegistroVotacao, VotoParlamentar, OradorOrdemDia, TipoExpediente, ResumoOrdenacao) RegistroVotacao, VotoParlamentar, OradorOrdemDia,
ConsideracoesFinais, TipoExpediente, ResumoOrdenacao)
from sapl.settings import STATIC_ROOT from sapl.settings import STATIC_ROOT
from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data, create_barcode from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data, create_barcode
@ -34,7 +35,8 @@ from sapl.sessao.views import (get_identificacao_basica, get_mesa_diretora,
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_ordemdia,
get_oradores_explicacoes_pessoais, get_ocorrencias_da_sessao, get_assinaturas) get_oradores_explicacoes_pessoais, get_consideracoes_finais,
get_ocorrencias_da_sessao, get_assinaturas)
from .templates import (pdf_capa_processo_gerar, from .templates import (pdf_capa_processo_gerar,
pdf_documento_administrativo_gerar, pdf_espelho_gerar, pdf_documento_administrativo_gerar, pdf_espelho_gerar,
@ -824,13 +826,13 @@ def get_sessao_plenaria(sessao, casa):
lst_oradores.append({ lst_oradores.append({
"num_ordem": orador.numero_ordem, "num_ordem": orador.numero_ordem,
"nom_parlamentar": parlamentar.nome_parlamentar, "nom_parlamentar": parlamentar.nome_parlamentar,
"observacao": orador.observacao,
"sgl_partido": "" if not partido_sigla else partido_sigla.partido.sigla "sgl_partido": "" if not partido_sigla else partido_sigla.partido.sigla
}) })
# Ocorrências da Sessão # Ocorrências da Sessão
lst_ocorrencias = [] lst_ocorrencias = []
ocorrencias = OcorrenciaSessao.objects.filter(sessao_plenaria=sessao) ocorrencias = OcorrenciaSessao.objects.filter(sessao_plenaria=sessao)
for o in ocorrencias: for o in ocorrencias:
conteudo = o.conteudo conteudo = o.conteudo
@ -847,6 +849,26 @@ def get_sessao_plenaria(sessao, casa):
lst_ocorrencias.append(o) lst_ocorrencias.append(o)
# Ocorrências da Sessão
lst_consideracoes = []
consideracoes = ConsideracoesFinais.objects.filter(sessao_plenaria=sessao)
for c in consideracoes:
conteudo = c.conteudo
# unescape HTML codes
# https://github.com/interlegis/sapl/issues/1046
conteudo = re.sub('style=".*?"', '', conteudo)
conteudo = html.unescape(conteudo)
# escape special character '&'
# https://github.com/interlegis/sapl/issues/1009
conteudo = conteudo.replace('&', '&amp;')
c.conteudo = conteudo
lst_consideracoes.append(c)
return (inf_basicas_dic, return (inf_basicas_dic,
cont_mult_dic, cont_mult_dic,
lst_mesa, lst_mesa,
@ -861,7 +883,8 @@ def get_sessao_plenaria(sessao, casa):
lst_votacao_vot_nom, lst_votacao_vot_nom,
lst_oradores_ordemdia, lst_oradores_ordemdia,
lst_oradores, lst_oradores,
lst_ocorrencias) lst_ocorrencias,
lst_consideracoes)
def get_turno(materia): def get_turno(materia):
@ -923,7 +946,8 @@ def relatorio_sessao_plenaria(request, pk):
lst_votacao_vot_nom, lst_votacao_vot_nom,
lst_oradores_ordemdia, lst_oradores_ordemdia,
lst_oradores, lst_oradores,
lst_ocorrencias) = get_sessao_plenaria(sessao, casa) lst_ocorrencias,
lst_consideracoes) = get_sessao_plenaria(sessao, casa)
for idx in range(len(lst_expedientes)): for idx in range(len(lst_expedientes)):
txt_expedientes = lst_expedientes[idx]['txt_expediente'] txt_expedientes = lst_expedientes[idx]['txt_expediente']
@ -948,7 +972,8 @@ def relatorio_sessao_plenaria(request, pk):
lst_votacao_vot_nom, lst_votacao_vot_nom,
lst_oradores_ordemdia, lst_oradores_ordemdia,
lst_oradores, lst_oradores,
lst_ocorrencias) lst_ocorrencias,
lst_consideracoes)
response.write(pdf) response.write(pdf)
return response return response
@ -1327,6 +1352,7 @@ def resumo_ata_pdf(request, pk):
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_ordemdia(sessao_plenaria))
context.update(get_ocorrencias_da_sessao(sessao_plenaria)) context.update(get_ocorrencias_da_sessao(sessao_plenaria))
context.update(get_consideracoes_finais(sessao_plenaria))
context.update(get_oradores_explicacoes_pessoais(sessao_plenaria)) context.update(get_oradores_explicacoes_pessoais(sessao_plenaria))
context.update(get_assinaturas(sessao_plenaria)) context.update(get_assinaturas(sessao_plenaria))
context.update({'object': sessao_plenaria}) context.update({'object': sessao_plenaria})
@ -1480,7 +1506,8 @@ def relatorio_sessao_plenaria_pdf(request, pk):
lst_votacao_vot_nom, lst_votacao_vot_nom,
lst_oradores_ordemdia, lst_oradores_ordemdia,
lst_oradores, lst_oradores,
lst_ocorrencias) = get_sessao_plenaria(sessao, casa) lst_ocorrencias,
lst_consideracoes) = get_sessao_plenaria(sessao, casa)
dict_ord_template = { dict_ord_template = {
'cont_mult': 'conteudo_multimidia.html', 'cont_mult': 'conteudo_multimidia.html',
@ -1496,7 +1523,8 @@ def relatorio_sessao_plenaria_pdf(request, pk):
'oradores_exped': 'oradores_expediente.html', 'oradores_exped': 'oradores_expediente.html',
'oradores_o_d': 'oradores_ordemdia.html', 'oradores_o_d': 'oradores_ordemdia.html',
'oradores_expli': 'oradores_explicacoes.html', 'oradores_expli': 'oradores_explicacoes.html',
'ocorr_sessao': 'ocorrencias_sessao.html' 'ocorr_sessao': 'ocorrencias_da_sessao.html',
'cons_finais': 'consideracoes_finais.html'
} }
context = { context = {
@ -1515,6 +1543,7 @@ def relatorio_sessao_plenaria_pdf(request, pk):
"lst_votacao_vot_nom": lst_votacao_vot_nom, "lst_votacao_vot_nom": lst_votacao_vot_nom,
"lst_oradores": lst_oradores, "lst_oradores": lst_oradores,
"lst_ocorrencias": lst_ocorrencias, "lst_ocorrencias": lst_ocorrencias,
"lst_consideracoes": lst_consideracoes,
"rodape": rodape, "rodape": rodape,
"data": dt.today().strftime('%d/%m/%Y') "data": dt.today().strftime('%d/%m/%Y')
} }
@ -1535,7 +1564,8 @@ def relatorio_sessao_plenaria_pdf(request, pk):
'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] 'decimo_quarto_ordenacao': dict_ord_template[ordenacao.decimo_quarto],
'decimo_quinto_ordenacao': dict_ord_template[ordenacao.decimo_quinto]
}) })
except KeyError as e: except KeyError as e:
# self.logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar " # self.logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar "
@ -1554,7 +1584,8 @@ def relatorio_sessao_plenaria_pdf(request, pk):
'decimo_primeiro_ordenacao': 'votos_nominais_ordemdia.html', 'decimo_primeiro_ordenacao': 'votos_nominais_ordemdia.html',
'decimo_segundo_ordenacao': 'oradores_ordemdia.html', 'decimo_segundo_ordenacao': 'oradores_ordemdia.html',
'decimo_terceiro_ordenacao': 'oradores_explicacoes.html', 'decimo_terceiro_ordenacao': 'oradores_explicacoes.html',
'decimo_quarto_ordenacao': 'ocorrencias_sessao.html' 'decimo_quarto_ordenacao': 'ocorrencias_da_sessao.html',
'decimo_quinto_ordenacao': 'consideracoes_finais.html'
}) })
html_template = render_to_string( html_template = render_to_string(

10
sapl/sessao/forms.py

@ -783,6 +783,10 @@ class ResumoOrdenacaoForm(forms.Form):
label='14°', label='14°',
choices=ORDENACAO_RESUMO choices=ORDENACAO_RESUMO
) )
decimo_quinto = forms.ChoiceField(
label='15°',
choices=ORDENACAO_RESUMO
)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
row1 = to_row( row1 = to_row(
@ -814,13 +818,16 @@ class ResumoOrdenacaoForm(forms.Form):
row14 = to_row( row14 = to_row(
[('decimo_quarto', 12)] [('decimo_quarto', 12)]
) )
row15 = to_row(
[('decimo_quinto', 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, row14, row11, row12, row13, row14, row15,
form_actions(label='Atualizar')) form_actions(label='Atualizar'))
) )
@ -862,6 +869,7 @@ class ResumoOrdenacaoForm(forms.Form):
ordenacao.decimo_segundo = cleaned_data['decimo_segundo'] ordenacao.decimo_segundo = cleaned_data['decimo_segundo']
ordenacao.decimo_terceiro = cleaned_data['decimo_terceiro'] ordenacao.decimo_terceiro = cleaned_data['decimo_terceiro']
ordenacao.decimo_quarto = cleaned_data['decimo_quarto'] ordenacao.decimo_quarto = cleaned_data['decimo_quarto']
ordenacao.decimo_quinto = cleaned_data['decimo_quinto']
ordenacao.save() ordenacao.save()

27
sapl/sessao/migrations/0056_ConsideracoesFinais.py

@ -0,0 +1,27 @@
# Generated by Django 2.2.20 on 2021-08-05 13:04
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('sessao', '0055_auto_20210304_1221'),
]
operations = [
migrations.CreateModel(
name='ConsideracoesFinais',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('conteudo', models.TextField(blank=True, verbose_name='Considerações Finais da Sessão Plenária')),
('sessao_plenaria', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='sessao.SessaoPlenaria')),
],
options={
'verbose_name': 'Consideração Final da Sessão Plenária',
'verbose_name_plural': 'Considerações Finais da Sessão Plenária',
'ordering': ('id',),
},
),
]

18
sapl/sessao/migrations/0057_resumoordenacao_decimo_quinto.py

@ -0,0 +1,18 @@
# Generated by Django 2.2.20 on 2021-08-11 13:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sessao', '0056_ConsideracoesFinais'),
]
operations = [
migrations.AddField(
model_name='resumoordenacao',
name='decimo_quinto',
field=models.CharField(default='cons_finais', max_length=50),
),
]

22
sapl/sessao/models.py

@ -426,6 +426,21 @@ class OcorrenciaSessao(models.Model): # OcorrenciaSessaoPlenaria
def __str__(self): def __str__(self):
return '%s - %s' % (self.sessao_plenaria, self.conteudo) return '%s - %s' % (self.sessao_plenaria, self.conteudo)
@reversion.register()
class ConsideracoesFinais(models.Model): # ConsideracoesFinaisSessaoPlenaria
sessao_plenaria = models.OneToOneField(SessaoPlenaria,
on_delete=models.PROTECT)
conteudo = models.TextField(
blank=True, verbose_name=_('Considerações Finais da Sessão Plenária'))
class Meta:
verbose_name = _('Consideração Final da Sessão Plenária')
verbose_name_plural = _('Considerações Finais da Sessão Plenária')
ordering = ('id',)
def __str__(self):
return '%s - %s' % (self.sessao_plenaria, self.conteudo)
@reversion.register() @reversion.register()
class IntegranteMesa(models.Model): # MesaSessaoPlenaria class IntegranteMesa(models.Model): # MesaSessaoPlenaria
@ -686,7 +701,8 @@ ORDENACAO_RESUMO = [
('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'), ('oradores_o_d', 'Oradores da Ordem do 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'),
('cons_finais', 'Considerações Finais')
] ]
@ -752,6 +768,10 @@ class ResumoOrdenacao(models.Model):
max_length=50, max_length=50,
default=ORDENACAO_RESUMO[13][0] default=ORDENACAO_RESUMO[13][0]
) )
decimo_quinto = models.CharField(
max_length=50,
default=ORDENACAO_RESUMO[14][0]
)
class Meta: class Meta:
verbose_name = _('Ordenação do Resumo de uma Sessão') verbose_name = _('Ordenação do Resumo de uma Sessão')

4
sapl/sessao/urls.py

@ -4,7 +4,7 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
AdicionarVariasMateriasOrdemDia, BancadaCrud, AdicionarVariasMateriasOrdemDia, BancadaCrud,
CargoBancadaCrud, ExpedienteMateriaCrud, CargoBancadaCrud, ExpedienteMateriaCrud,
ExpedienteView, JustificativaAusenciaCrud, ExpedienteView, JustificativaAusenciaCrud,
OcorrenciaSessaoView, MateriaOrdemDiaCrud, OradorOrdemDiaCrud, OcorrenciaSessaoView, ConsideracoesFinaisView, MateriaOrdemDiaCrud, OradorOrdemDiaCrud,
MesaView, OradorCrud, MesaView, OradorCrud,
OradorExpedienteCrud, PainelView, OradorExpedienteCrud, PainelView,
PautaSessaoDetailView, PautaSessaoView, PautaSessaoDetailView, PautaSessaoView,
@ -128,6 +128,8 @@ urlpatterns = [
ExpedienteView.as_view(), name='expediente'), ExpedienteView.as_view(), name='expediente'),
url(r'^sessao/(?P<pk>\d+)/ocorrencia_sessao$', url(r'^sessao/(?P<pk>\d+)/ocorrencia_sessao$',
OcorrenciaSessaoView.as_view(), name='ocorrencia_sessao'), OcorrenciaSessaoView.as_view(), name='ocorrencia_sessao'),
url(r'^sessao/(?P<pk>\d+)/consideracoes_finais$',
ConsideracoesFinaisView.as_view(), name='consideracoes_finais'),
url(r'^sessao/(?P<pk>\d+)/presenca$', url(r'^sessao/(?P<pk>\d+)/presenca$',
PresencaView.as_view(), name='presenca'), PresencaView.as_view(), name='presenca'),
url(r'^sessao/(?P<pk>\d+)/painel$', url(r'^sessao/(?P<pk>\d+)/painel$',

94
sapl/sessao/views.py

@ -44,7 +44,7 @@ from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm,
SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm,
VotacaoNominalForm, RetiradaPautaForm, OradorOrdemDiaForm) VotacaoNominalForm, RetiradaPautaForm, OradorOrdemDiaForm)
from .models import (Bancada, CargoBancada, CargoMesa, from .models import (Bancada, CargoBancada, CargoMesa,
ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa, ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, ConsideracoesFinais, IntegranteMesa,
MateriaLegislativa, Orador, OradorExpediente, OrdemDia, MateriaLegislativa, Orador, OradorExpediente, OrdemDia,
PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao,
SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente,
@ -1843,7 +1843,8 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView):
'decimo_primeiro': self.get_tupla(ordenacao.decimo_primeiro), 'decimo_primeiro': self.get_tupla(ordenacao.decimo_primeiro),
'decimo_segundo': self.get_tupla(ordenacao.decimo_segundo), 'decimo_segundo': self.get_tupla(ordenacao.decimo_segundo),
'decimo_terceiro': self.get_tupla(ordenacao.decimo_terceiro), 'decimo_terceiro': self.get_tupla(ordenacao.decimo_terceiro),
'decimo_quarto': self.get_tupla(ordenacao.decimo_quarto) 'decimo_quarto': self.get_tupla(ordenacao.decimo_quarto),
'decimo_quinto': self.get_tupla(ordenacao.decimo_quinto)
} }
return initial return initial
@ -2170,10 +2171,13 @@ def get_oradores_explicacoes_pessoais(sessao_plenaria):
sigla = '' sigla = ''
else: else:
sigla = partido_sigla.partido.sigla sigla = partido_sigla.partido.sigla
observacao = orador.observacao
oradores = { oradores = {
'numero_ordem': orador.numero_ordem, 'numero_ordem': orador.numero_ordem,
'parlamentar': parlamentar, 'parlamentar': parlamentar,
'sgl_partido': sigla 'sgl_partido': sigla,
'observacao': observacao
} }
oradores_explicacoes.append(oradores) oradores_explicacoes.append(oradores)
context = {'oradores_explicacoes': oradores_explicacoes} context = {'oradores_explicacoes': oradores_explicacoes}
@ -2186,6 +2190,12 @@ def get_ocorrencias_da_sessao(sessao_plenaria):
context = {'ocorrencias_da_sessao': ocorrencias_sessao} context = {'ocorrencias_da_sessao': ocorrencias_sessao}
return context return context
def get_consideracoes_finais(sessao_plenaria):
consideracoes_finais = ConsideracoesFinais.objects.filter(
sessao_plenaria_id=sessao_plenaria.id)
context = {'consideracoes_finais': consideracoes_finais}
return context
class ResumoView(DetailView): class ResumoView(DetailView):
template_name = 'sessao/resumo.html' template_name = 'sessao/resumo.html'
@ -2271,6 +2281,9 @@ class ResumoView(DetailView):
# Ocorrẽncias da Sessão # Ocorrẽncias da Sessão
context.update(get_ocorrencias_da_sessao(self.object)) context.update(get_ocorrencias_da_sessao(self.object))
# ===================================================================== # =====================================================================
# Consideracoes Finais da Sessão
context.update(get_consideracoes_finais(self.object))
# =====================================================================
# Indica a ordem com a qual o template será renderizado # Indica a ordem com a qual o template será renderizado
dict_ord_template = { dict_ord_template = {
'cont_mult': 'conteudo_multimidia.html', 'cont_mult': 'conteudo_multimidia.html',
@ -2286,7 +2299,8 @@ class ResumoView(DetailView):
'oradores_exped': 'oradores_expediente.html', 'oradores_exped': 'oradores_expediente.html',
'oradores_o_d': 'oradores_ordemdia.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',
'cons_finais': 'consideracoes_finais.html'
} }
ordenacao = ResumoOrdenacao.objects.get_or_create()[0] ordenacao = ResumoOrdenacao.objects.get_or_create()[0]
@ -2305,7 +2319,8 @@ class ResumoView(DetailView):
'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] 'decimo_quarto_ordenacao': dict_ord_template[ordenacao.decimo_quarto],
'decimo_quinto_ordenacao': dict_ord_template[ordenacao.decimo_quinto]
}) })
except KeyError as e: except KeyError as e:
self.logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar " self.logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar "
@ -2324,7 +2339,8 @@ class ResumoView(DetailView):
'decimo_primeiro_ordenacao': 'votos_nominais_materias_ordem_dia.html', 'decimo_primeiro_ordenacao': 'votos_nominais_materias_ordem_dia.html',
'decimo_segundo_ordenacao': 'oradores_ordemdia.html', 'decimo_segundo_ordenacao': 'oradores_ordemdia.html',
'decimo_terceiro_ordenacao': 'oradores_explicacoes.html', 'decimo_terceiro_ordenacao': 'oradores_explicacoes.html',
'decimo_quarto_ordenacao': 'ocorrencias_da_sessao.html' 'decimo_quarto_ordenacao': 'ocorrencias_da_sessao.html',
'decimo_quinto_ordenacao': 'consideracoes_finais.html'
}) })
sessao = context['object'] sessao = context['object']
@ -2438,7 +2454,7 @@ class ExpedienteView(FormMixin, DetailView):
class OcorrenciaSessaoView(FormMixin, DetailView): class OcorrenciaSessaoView(FormMixin, DetailView):
template_name = 'sessao/ocorrencia_sessao.html' template_name = 'sessao/ocorrencias_da_sessao.html'
form_class = OcorrenciaSessaoForm form_class = OcorrenciaSessaoForm
model = SessaoPlenaria model = SessaoPlenaria
@ -2502,6 +2518,70 @@ class OcorrenciaSessaoView(FormMixin, DetailView):
pk = self.kwargs['pk'] pk = self.kwargs['pk']
return reverse('sapl.sessao:ocorrencia_sessao', kwargs={'pk': pk}) return reverse('sapl.sessao:ocorrencia_sessao', kwargs={'pk': pk})
class ConsideracoesFinaisView(FormMixin, DetailView):
template_name = 'sessao/consideracoes_finais.html'
form_class = OcorrenciaSessaoForm
model = SessaoPlenaria
logger = logging.getLogger(__name__)
def get_context_data(self, **kwargs):
context = FormMixin.get_context_data(self, **kwargs)
context['title'] = 'Considerações Finais <small>(%s)</small>' % (
self.object)
sessao = context['object']
tipo_sessao = sessao.tipo
if tipo_sessao.nome == "Solene":
context.update(
{'subnav_template_name': 'sessao/subnav-solene.yaml'})
return context
def delete(self):
ConsideracoesFinais.objects.filter(sessao_plenaria=self.object).delete()
username = self.request.user.username
self.logger.info('user=' + username + '. ConsideracoesFinais com SessaoPlenaria de id={} deletada.'
.format(self.object.id))
msg = _('Registro deletado com sucesso')
messages.add_message(self.request, messages.SUCCESS, msg)
def save(self, form):
conteudo = form.cleaned_data['conteudo']
ConsideracoesFinais.objects.filter(sessao_plenaria=self.object).delete()
consideracao = ConsideracoesFinais()
consideracao.sessao_plenaria_id = self.object.id
consideracao.conteudo = conteudo
consideracao.save()
msg = _('Registro salvo com sucesso')
messages.add_message(self.request, messages.SUCCESS, msg)
username = self.request.user.username
self.logger.info(
'user=' + username + '. consideracoesFinais de sessao_plenaria_id={} atualizada com sucesso.'.format(self.object.id))
@method_decorator(permission_required('sessao.add_consideraoesfinais'))
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = OcorrenciaSessaoForm(request.POST)
if not form.is_valid():
return self.form_invalid(form)
if request.POST.get('delete'):
self.delete()
elif request.POST.get('save'):
self.save(form)
return self.form_valid(form)
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('sapl.sessao:consideracoes_finais', kwargs={'pk': pk})
class VotacaoEditView(SessaoPermissionMixin): class VotacaoEditView(SessaoPermissionMixin):

4
sapl/templates/relatorios/blocos_sessao_plenaria/consideracoes_finais.html

@ -0,0 +1,4 @@
<h2 class="gray-title">Considerações Finais</h2>
{% for c in lst_consideracoes%}
<p>{{c}}</p>
{% endfor %}

4
sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_da_sessao.html

@ -0,0 +1,4 @@
<h2 class="gray-title">Ocorrências da Sessão</h2>
{% for o in lst_ocorrencias%}
<p>{{o}}</p>
{% endfor %}

4
sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_sessao.html

@ -1,4 +0,0 @@
<h2 class="gray-title">Ocorrências da Sessão</h2>
{% for ocorrencia in lst_ocorrencias%}
<p>{{ocorrencia}}</p>
{% endfor %}

2
sapl/templates/relatorios/blocos_sessao_plenaria/oradores_explicacoes.html

@ -2,7 +2,7 @@
<h2 class="gray-title">Oradores das Explicações Pessoais</h2> <h2 class="gray-title">Oradores das Explicações Pessoais</h2>
{% for orador in lst_oradores%} {% for orador in lst_oradores%}
<tr> <tr>
<p style="page-break-after: avoid;">{{orador.num_ordem}} - {{orador.nom_parlamentar}}/{{orador.sgl_partido}}</p> <p style="page-break-after: avoid;">{{orador.num_ordem}} - {{orador.nom_parlamentar}}/{{orador.sgl_partido}} - {{ orador.observacao }}</p>
</tr> </tr>
{% endfor %} {% endfor %}
</div> </div>

1
sapl/templates/relatorios/relatorio_ata.html

@ -14,6 +14,7 @@
{% include 'sessao/blocos_ata/oradores_ordemdia.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' %}
{% include 'sessao/blocos_ata/consideracoes_finais.html' %}
{% if assinatura_mesa or assinatura_presentes %} {% if assinatura_mesa or assinatura_presentes %}

2
sapl/templates/relatorios/relatorio_sessao_plenaria.html

@ -32,6 +32,8 @@
{% include 'relatorios/blocos_sessao_plenaria/'|add:decimo_quarto_ordenacao %} {% include 'relatorios/blocos_sessao_plenaria/'|add:decimo_quarto_ordenacao %}
{% include 'relatorios/blocos_sessao_plenaria/'|add:decimo_quinto_ordenacao %}
</div> </div>

8
sapl/templates/sessao/blocos_ata/consideracoes_finais.html

@ -0,0 +1,8 @@
<fieldset>
<p align="justify">
{% if object.consideracoesfinais.conteudo %}
<strong>Considerações Finais: </strong>
{{object.consideracoesfinais.conteudo|striptags|safe}}
{% endif %}
</p>
</fieldset>

9
sapl/templates/sessao/blocos_resumo/consideracoes_finais.html

@ -0,0 +1,9 @@
{% if object.consideracoesfinais.conteudo %}
<fieldset>
<legend>Considerações Finais</legend>
<div style="border:0.5px solid #BAB4B1; border-radius: 10px; background-color: rgba(225, 225, 225, .8);">
<p>{{object.consideracoesfinais.conteudo|safe}}</p>
</div>
</fieldset>
<br /><br /><br />
{% endif %}

10
sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html

@ -4,13 +4,15 @@
<fieldset> <fieldset>
<legend>Oradores das Explicações Pessoais</legend> <legend>Oradores das Explicações Pessoais</legend>
<div class="row"> <div class="row">
<div class="col-md-6">Parlamentar</div> <div class="col-md-4">Parlamentar</div>
<div class="col-md-6">Discurso</div> <div class="col-md-4">Discurso</div>
<div class="col-md-4">Observação</div>
</div> </div>
<div class="row"> <div class="row">
{% for o in oradores_explicacoes %} {% for o in oradores_explicacoes %}
<div class="col-md-6"><b>{{o.numero_ordem}}</b> - {{o.parlamentar.nome_parlamentar}} / {% if o.parlamentar|filiacao_data_filter:object.data_inicio %} {{ o.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}</div> <div class="col-md-4"><b>{{o.numero_ordem}}</b> - {{o.parlamentar.nome_parlamentar}} / {% if o.parlamentar|filiacao_data_filter:object.data_inicio %} {{ o.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}</div>
<div class="col-md-6">{{o.url_discurso}}</div> <div class="col-md-4">{{o.url_discurso}}</div>
<div class="col-md-4">{{o.observacao}}</div>
</br> </br>
{% endfor %} {% endfor %}
</div> </div>

29
sapl/templates/sessao/consideracoes_finais.html

@ -0,0 +1,29 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% load common_tags %}
{% block actions %}{% endblock %}
{% block detail_content %}
{% if perms|get_add_perm:view %}
<form method="post" accept-charset="ISO-8859-1">
{% csrf_token %}
<fieldset class="form-group">
<textarea rows="5" cols="50" name="conteudo" id="conteudo">{{object.consideracoesfinais.conteudo}}</textarea>
</fieldset>
<input type="submit" name="save" value="Salvar" class="btn btn-primary"/>
<input type="submit" name="delete" value="Apagar" class="btn btn-danger" />
</form>
{% else %}
{{object.consideracoesfinais.conteudo|safe}}
{% endif %}
{% endblock detail_content %}
<!-- Texto RICO -->
{% block extra_js %}
{% if perms|get_add_perm:view %}
<script language="JavaScript">
initTextRichEditor(null);
</script>
{% endif %}
{% endblock %}

0
sapl/templates/sessao/ocorrencia_sessao.html → sapl/templates/sessao/ocorrencias_da_sessao.html

3
sapl/templates/sessao/resumo.html

@ -49,5 +49,8 @@
{% include 'sessao/blocos_resumo/'|add:decimo_terceiro_ordenacao %} {% include 'sessao/blocos_resumo/'|add:decimo_terceiro_ordenacao %}
{% include 'sessao/blocos_resumo/'|add:decimo_quarto_ordenacao %} {% include 'sessao/blocos_resumo/'|add:decimo_quarto_ordenacao %}
{% include 'sessao/blocos_resumo/'|add:decimo_quinto_ordenacao %}
{% endblock detail_content %} {% endblock detail_content %}

1
sapl/templates/sessao/resumo_ata.html

@ -33,5 +33,6 @@
{% 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/'|add:decimo_quarto_ordenacao %}
{% include 'sessao/blocos_ata/'|add:decimo_quinto_ordenacao %}
{% include 'sessao/blocos_ata/assinaturas.html' %} {% include 'sessao/blocos_ata/assinaturas.html' %}
{% endblock detail_content %} {% endblock detail_content %}

3
sapl/templates/sessao/resumo_ordenacao.html

@ -7,7 +7,6 @@
{% endblock %} {% endblock %}
{% block base_content %} {% block base_content %}
{% crispy form %} {% crispy form %}
{% endblock %} {% endblock %}

2
sapl/templates/sessao/subnav-solene.yaml

@ -12,6 +12,8 @@
url: orador_list url: orador_list
- title: {% trans 'Ocorrências da Sessão' %} - title: {% trans 'Ocorrências da Sessão' %}
url: ocorrencia_sessao url: ocorrencia_sessao
- title: {% trans 'Considerações Finais' %}
url: consideracoes_finais
- title: {% trans 'Expedientes' %} - title: {% trans 'Expedientes' %}
children: children:

2
sapl/templates/sessao/subnav.yaml

@ -14,6 +14,8 @@
url: orador_list url: orador_list
- title: {% trans 'Ocorrências da Sessão' %} - title: {% trans 'Ocorrências da Sessão' %}
url: ocorrencia_sessao url: ocorrencia_sessao
- title: {% trans 'Considerações Finais' %}
url: consideracoes_finais
- title: {% trans 'Retirada de Pauta'%} - title: {% trans 'Retirada de Pauta'%}
url: retiradapauta_list url: retiradapauta_list

Loading…
Cancel
Save