From a1c7a040a63c7514c9c7664e34fe5a67c7af9dc0 Mon Sep 17 00:00:00 2001 From: Alvaro Gouvea <44756822+AlGouvea@users.noreply.github.com> Date: Wed, 1 Sep 2021 11:14:43 -0300 Subject: [PATCH] =?UTF-8?q?Os=20ticket=20#997362=20(Adi=C3=A7=C3=A3o=20de?= =?UTF-8?q?=20considera=C3=A7=C3=B5es=20finais=20na=20sess=C3=A3o)=20(#343?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 --- .../templates/pdf_sessao_plenaria_gerar.py | 23 ++++- .../pdf_sessao_plenaria_preparar_pysc.py | 2 +- sapl/relatorios/views.py | 51 ++++++++-- sapl/sessao/forms.py | 10 +- .../migrations/0056_ConsideracoesFinais.py | 27 ++++++ .../0057_resumoordenacao_decimo_quinto.py | 18 ++++ sapl/sessao/models.py | 22 ++++- sapl/sessao/urls.py | 4 +- sapl/sessao/views.py | 94 +++++++++++++++++-- .../consideracoes_finais.html | 4 + .../ocorrencias_da_sessao.html | 4 + .../ocorrencias_sessao.html | 4 - .../oradores_explicacoes.html | 2 +- sapl/templates/relatorios/relatorio_ata.html | 1 + .../relatorios/relatorio_sessao_plenaria.html | 2 + .../blocos_ata/consideracoes_finais.html | 8 ++ .../blocos_resumo/consideracoes_finais.html | 9 ++ .../blocos_resumo/oradores_explicacoes.html | 10 +- .../sessao/consideracoes_finais.html | 29 ++++++ ...sessao.html => ocorrencias_da_sessao.html} | 0 sapl/templates/sessao/resumo.html | 3 + sapl/templates/sessao/resumo_ata.html | 1 + sapl/templates/sessao/resumo_ordenacao.html | 3 +- sapl/templates/sessao/subnav-solene.yaml | 2 + sapl/templates/sessao/subnav.yaml | 2 + 25 files changed, 301 insertions(+), 34 deletions(-) create mode 100644 sapl/sessao/migrations/0056_ConsideracoesFinais.py create mode 100644 sapl/sessao/migrations/0057_resumoordenacao_decimo_quinto.py create mode 100644 sapl/templates/relatorios/blocos_sessao_plenaria/consideracoes_finais.html create mode 100644 sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_da_sessao.html delete mode 100644 sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_sessao.html create mode 100644 sapl/templates/sessao/blocos_ata/consideracoes_finais.html create mode 100644 sapl/templates/sessao/blocos_resumo/consideracoes_finais.html create mode 100644 sapl/templates/sessao/consideracoes_finais.html rename sapl/templates/sessao/{ocorrencia_sessao.html => ocorrencias_da_sessao.html} (100%) diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py index 0ede61f97..5d3f259b0 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py @@ -399,8 +399,23 @@ def ocorrencias(lst_ocorrencias): tmp += '\t\t\n' return tmp +def consideracoes(lst_consideracoes): + tmp = '' + if lst_consideracoes: + tmp += '\t\tConsideracoes Finais\n' + tmp += '\t\t\n' + tmp += '\t\t\t \n' + tmp += '\t\t\n' + for consideracoes in lst_consideracoes: + tmp += '\t\t' + \ + str(consideracoes.conteudo) + '\n' + tmp += '\t\t\n' + tmp += '\t\t\t \n' + tmp += '\t\t\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" @@ -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_o_d': oradores_ordemdia(lst_oradores_ordemdia), 'oradores_expli': oradores(lst_oradores), - 'ocorr_sessao': ocorrencias(lst_ocorrencias) + 'ocorr_sessao': ocorrencias(lst_ocorrencias), + 'cons_finais': consideracoes(lst_consideracoes) } 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_terceiro] tmp += dict_ord_template[ordenacao.decimo_quarto] + tmp += dict_ord_template[ordenacao.decimo_quinto] except KeyError as e: logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar " "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(lst_oradores) tmp += ocorrencias(lst_ocorrencias) + tmp += consideracoes(lst_consideracoes) else: 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(lst_oradores) tmp += ocorrencias(lst_ocorrencias) + tmp += consideracoes(lst_consideracoes) tmp += '\t\n' tmp += '\n' diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_preparar_pysc.py b/sapl/relatorios/templates/pdf_sessao_plenaria_preparar_pysc.py index 5eef2d912..9315d5429 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_preparar_pysc.py @@ -277,7 +277,7 @@ if context.REQUEST['data'] != '': # return lst_votacao sessao = session.id 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': response.redirect('mensagem_emitir_proc') else: diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 5b8173178..93a6cf33c 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -25,7 +25,8 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, OcorrenciaSessao, - RegistroVotacao, VotoParlamentar, OradorOrdemDia, TipoExpediente, ResumoOrdenacao) + RegistroVotacao, VotoParlamentar, OradorOrdemDia, + ConsideracoesFinais, TipoExpediente, ResumoOrdenacao) from sapl.settings import STATIC_ROOT 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_presenca_ordem_do_dia, get_materias_ordem_do_dia, 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, pdf_documento_administrativo_gerar, pdf_espelho_gerar, @@ -824,13 +826,13 @@ def get_sessao_plenaria(sessao, casa): lst_oradores.append({ "num_ordem": orador.numero_ordem, "nom_parlamentar": parlamentar.nome_parlamentar, + "observacao": orador.observacao, "sgl_partido": "" if not partido_sigla else partido_sigla.partido.sigla }) # Ocorrências da Sessão lst_ocorrencias = [] ocorrencias = OcorrenciaSessao.objects.filter(sessao_plenaria=sessao) - for o in ocorrencias: conteudo = o.conteudo @@ -847,6 +849,26 @@ def get_sessao_plenaria(sessao, casa): 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('&', '&') + + c.conteudo = conteudo + + lst_consideracoes.append(c) + return (inf_basicas_dic, cont_mult_dic, lst_mesa, @@ -861,7 +883,8 @@ def get_sessao_plenaria(sessao, casa): lst_votacao_vot_nom, lst_oradores_ordemdia, lst_oradores, - lst_ocorrencias) + lst_ocorrencias, + lst_consideracoes) def get_turno(materia): @@ -923,7 +946,8 @@ def relatorio_sessao_plenaria(request, pk): lst_votacao_vot_nom, lst_oradores_ordemdia, 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)): txt_expedientes = lst_expedientes[idx]['txt_expediente'] @@ -948,7 +972,8 @@ def relatorio_sessao_plenaria(request, pk): lst_votacao_vot_nom, lst_oradores_ordemdia, lst_oradores, - lst_ocorrencias) + lst_ocorrencias, + lst_consideracoes) response.write(pdf) return response @@ -1327,6 +1352,7 @@ def resumo_ata_pdf(request, pk): context.update(get_materias_ordem_do_dia(sessao_plenaria)) context.update(get_oradores_ordemdia(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_assinaturas(sessao_plenaria)) context.update({'object': sessao_plenaria}) @@ -1480,7 +1506,8 @@ def relatorio_sessao_plenaria_pdf(request, pk): lst_votacao_vot_nom, lst_oradores_ordemdia, lst_oradores, - lst_ocorrencias) = get_sessao_plenaria(sessao, casa) + lst_ocorrencias, + lst_consideracoes) = get_sessao_plenaria(sessao, casa) dict_ord_template = { 'cont_mult': 'conteudo_multimidia.html', @@ -1496,7 +1523,8 @@ def relatorio_sessao_plenaria_pdf(request, pk): 'oradores_exped': 'oradores_expediente.html', 'oradores_o_d': 'oradores_ordemdia.html', 'oradores_expli': 'oradores_explicacoes.html', - 'ocorr_sessao': 'ocorrencias_sessao.html' + 'ocorr_sessao': 'ocorrencias_da_sessao.html', + 'cons_finais': 'consideracoes_finais.html' } context = { @@ -1515,6 +1543,7 @@ def relatorio_sessao_plenaria_pdf(request, pk): "lst_votacao_vot_nom": lst_votacao_vot_nom, "lst_oradores": lst_oradores, "lst_ocorrencias": lst_ocorrencias, + "lst_consideracoes": lst_consideracoes, "rodape": rodape, "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_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo], '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: # 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_segundo_ordenacao': 'oradores_ordemdia.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( diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 09eb3515d..875ea803d 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -783,6 +783,10 @@ class ResumoOrdenacaoForm(forms.Form): label='14°', choices=ORDENACAO_RESUMO ) + decimo_quinto = forms.ChoiceField( + label='15°', + choices=ORDENACAO_RESUMO + ) def __init__(self, *args, **kwargs): row1 = to_row( @@ -814,13 +818,16 @@ class ResumoOrdenacaoForm(forms.Form): row14 = to_row( [('decimo_quarto', 12)] ) + row15 = to_row( + [('decimo_quinto', 12)] + ) self.helper = SaplFormHelper() self.helper.layout = Layout( Fieldset(_(''), row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, - row11, row12, row13, row14, + row11, row12, row13, row14, row15, form_actions(label='Atualizar')) ) @@ -862,6 +869,7 @@ class ResumoOrdenacaoForm(forms.Form): ordenacao.decimo_segundo = cleaned_data['decimo_segundo'] ordenacao.decimo_terceiro = cleaned_data['decimo_terceiro'] ordenacao.decimo_quarto = cleaned_data['decimo_quarto'] + ordenacao.decimo_quinto = cleaned_data['decimo_quinto'] ordenacao.save() diff --git a/sapl/sessao/migrations/0056_ConsideracoesFinais.py b/sapl/sessao/migrations/0056_ConsideracoesFinais.py new file mode 100644 index 000000000..bda571b08 --- /dev/null +++ b/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',), + }, + ), + ] diff --git a/sapl/sessao/migrations/0057_resumoordenacao_decimo_quinto.py b/sapl/sessao/migrations/0057_resumoordenacao_decimo_quinto.py new file mode 100644 index 000000000..add1ebf57 --- /dev/null +++ b/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), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 47019abdb..26463fa19 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -426,6 +426,21 @@ class OcorrenciaSessao(models.Model): # OcorrenciaSessaoPlenaria def __str__(self): 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() 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'), ('oradores_o_d', 'Oradores da Ordem do Dia'), ('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, default=ORDENACAO_RESUMO[13][0] ) + decimo_quinto = models.CharField( + max_length=50, + default=ORDENACAO_RESUMO[14][0] + ) class Meta: verbose_name = _('Ordenação do Resumo de uma Sessão') diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 2630e6515..af66c2d83 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -4,7 +4,7 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, AdicionarVariasMateriasOrdemDia, BancadaCrud, CargoBancadaCrud, ExpedienteMateriaCrud, ExpedienteView, JustificativaAusenciaCrud, - OcorrenciaSessaoView, MateriaOrdemDiaCrud, OradorOrdemDiaCrud, + OcorrenciaSessaoView, ConsideracoesFinaisView, MateriaOrdemDiaCrud, OradorOrdemDiaCrud, MesaView, OradorCrud, OradorExpedienteCrud, PainelView, PautaSessaoDetailView, PautaSessaoView, @@ -128,6 +128,8 @@ urlpatterns = [ ExpedienteView.as_view(), name='expediente'), url(r'^sessao/(?P\d+)/ocorrencia_sessao$', OcorrenciaSessaoView.as_view(), name='ocorrencia_sessao'), + url(r'^sessao/(?P\d+)/consideracoes_finais$', + ConsideracoesFinaisView.as_view(), name='consideracoes_finais'), url(r'^sessao/(?P\d+)/presenca$', PresencaView.as_view(), name='presenca'), url(r'^sessao/(?P\d+)/painel$', diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 2a3e814d3..c154fb0ee 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -44,7 +44,7 @@ from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, VotacaoNominalForm, RetiradaPautaForm, OradorOrdemDiaForm) from .models import (Bancada, CargoBancada, CargoMesa, - ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa, + ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, ConsideracoesFinais, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, @@ -1843,7 +1843,8 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): 'decimo_primeiro': self.get_tupla(ordenacao.decimo_primeiro), 'decimo_segundo': self.get_tupla(ordenacao.decimo_segundo), '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 @@ -2170,10 +2171,13 @@ def get_oradores_explicacoes_pessoais(sessao_plenaria): sigla = '' else: sigla = partido_sigla.partido.sigla + observacao = orador.observacao + oradores = { 'numero_ordem': orador.numero_ordem, 'parlamentar': parlamentar, - 'sgl_partido': sigla + 'sgl_partido': sigla, + 'observacao': observacao } oradores_explicacoes.append(oradores) context = {'oradores_explicacoes': oradores_explicacoes} @@ -2186,6 +2190,12 @@ def get_ocorrencias_da_sessao(sessao_plenaria): context = {'ocorrencias_da_sessao': ocorrencias_sessao} 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): template_name = 'sessao/resumo.html' @@ -2271,6 +2281,9 @@ class ResumoView(DetailView): # Ocorrẽncias da Sessão 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 dict_ord_template = { 'cont_mult': 'conteudo_multimidia.html', @@ -2286,7 +2299,8 @@ class ResumoView(DetailView): 'oradores_exped': 'oradores_expediente.html', 'oradores_o_d': 'oradores_ordemdia.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] @@ -2305,7 +2319,8 @@ class ResumoView(DetailView): 'decimo_primeiro_ordenacao': dict_ord_template[ordenacao.decimo_primeiro], 'decimo_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo], '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: 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_segundo_ordenacao': 'oradores_ordemdia.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'] @@ -2438,7 +2454,7 @@ class ExpedienteView(FormMixin, DetailView): class OcorrenciaSessaoView(FormMixin, DetailView): - template_name = 'sessao/ocorrencia_sessao.html' + template_name = 'sessao/ocorrencias_da_sessao.html' form_class = OcorrenciaSessaoForm model = SessaoPlenaria @@ -2502,6 +2518,70 @@ class OcorrenciaSessaoView(FormMixin, DetailView): pk = self.kwargs['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 (%s)' % ( + 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): diff --git a/sapl/templates/relatorios/blocos_sessao_plenaria/consideracoes_finais.html b/sapl/templates/relatorios/blocos_sessao_plenaria/consideracoes_finais.html new file mode 100644 index 000000000..023871063 --- /dev/null +++ b/sapl/templates/relatorios/blocos_sessao_plenaria/consideracoes_finais.html @@ -0,0 +1,4 @@ +

Considerações Finais

+ {% for c in lst_consideracoes%} +

{{c}}

+ {% endfor %} diff --git a/sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_da_sessao.html b/sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_da_sessao.html new file mode 100644 index 000000000..699dacfcf --- /dev/null +++ b/sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_da_sessao.html @@ -0,0 +1,4 @@ +

Ocorrências da Sessão

+ {% for o in lst_ocorrencias%} +

{{o}}

+ {% endfor %} diff --git a/sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_sessao.html b/sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_sessao.html deleted file mode 100644 index 0a2b04ff1..000000000 --- a/sapl/templates/relatorios/blocos_sessao_plenaria/ocorrencias_sessao.html +++ /dev/null @@ -1,4 +0,0 @@ -

Ocorrências da Sessão

- {% for ocorrencia in lst_ocorrencias%} -

{{ocorrencia}}

- {% endfor %} diff --git a/sapl/templates/relatorios/blocos_sessao_plenaria/oradores_explicacoes.html b/sapl/templates/relatorios/blocos_sessao_plenaria/oradores_explicacoes.html index b22503e4f..159aa0794 100644 --- a/sapl/templates/relatorios/blocos_sessao_plenaria/oradores_explicacoes.html +++ b/sapl/templates/relatorios/blocos_sessao_plenaria/oradores_explicacoes.html @@ -2,7 +2,7 @@

Oradores das Explicações Pessoais

{% for orador in lst_oradores%} -

{{orador.num_ordem}} - {{orador.nom_parlamentar}}/{{orador.sgl_partido}}

+

{{orador.num_ordem}} - {{orador.nom_parlamentar}}/{{orador.sgl_partido}} - {{ orador.observacao }}

{% endfor %} \ No newline at end of file diff --git a/sapl/templates/relatorios/relatorio_ata.html b/sapl/templates/relatorios/relatorio_ata.html index c78e471d7..d4453b985 100644 --- a/sapl/templates/relatorios/relatorio_ata.html +++ b/sapl/templates/relatorios/relatorio_ata.html @@ -14,6 +14,7 @@ {% include 'sessao/blocos_ata/oradores_ordemdia.html' %} {% include 'sessao/blocos_ata/oradores_explicacoes.html' %} {% include 'sessao/blocos_ata/ocorrencias_da_sessao.html' %} + {% include 'sessao/blocos_ata/consideracoes_finais.html' %} {% if assinatura_mesa or assinatura_presentes %} diff --git a/sapl/templates/relatorios/relatorio_sessao_plenaria.html b/sapl/templates/relatorios/relatorio_sessao_plenaria.html index 4db5d298b..e459da2b3 100644 --- a/sapl/templates/relatorios/relatorio_sessao_plenaria.html +++ b/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_quinto_ordenacao %} + diff --git a/sapl/templates/sessao/blocos_ata/consideracoes_finais.html b/sapl/templates/sessao/blocos_ata/consideracoes_finais.html new file mode 100644 index 000000000..e4377671d --- /dev/null +++ b/sapl/templates/sessao/blocos_ata/consideracoes_finais.html @@ -0,0 +1,8 @@ +
+

+ {% if object.consideracoesfinais.conteudo %} + Considerações Finais: + {{object.consideracoesfinais.conteudo|striptags|safe}} + {% endif %} +

+
diff --git a/sapl/templates/sessao/blocos_resumo/consideracoes_finais.html b/sapl/templates/sessao/blocos_resumo/consideracoes_finais.html new file mode 100644 index 000000000..f7b15c1f1 --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/consideracoes_finais.html @@ -0,0 +1,9 @@ +{% if object.consideracoesfinais.conteudo %} +
+ Considerações Finais +
+

{{object.consideracoesfinais.conteudo|safe}}

+
+
+


+{% endif %} \ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html b/sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html index 1d18f76d6..dc61e675e 100644 --- a/sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html +++ b/sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html @@ -4,13 +4,15 @@
Oradores das Explicações Pessoais
-
Parlamentar
-
Discurso
+
Parlamentar
+
Discurso
+
Observação
{% for o in oradores_explicacoes %} -
{{o.numero_ordem}} - {{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 %}
-
{{o.url_discurso}}
+
{{o.numero_ordem}} - {{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 %}
+
{{o.url_discurso}}
+
{{o.observacao}}

{% endfor %}
diff --git a/sapl/templates/sessao/consideracoes_finais.html b/sapl/templates/sessao/consideracoes_finais.html new file mode 100644 index 000000000..6e19bcee0 --- /dev/null +++ b/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 %} +
+ {% csrf_token %} +
+ +
+ + +
+ {% else %} + {{object.consideracoesfinais.conteudo|safe}} + {% endif %} +{% endblock detail_content %} + + +{% block extra_js %} + {% if perms|get_add_perm:view %} + + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/sapl/templates/sessao/ocorrencia_sessao.html b/sapl/templates/sessao/ocorrencias_da_sessao.html similarity index 100% rename from sapl/templates/sessao/ocorrencia_sessao.html rename to sapl/templates/sessao/ocorrencias_da_sessao.html diff --git a/sapl/templates/sessao/resumo.html b/sapl/templates/sessao/resumo.html index ae76f6a5e..539cec810 100644 --- a/sapl/templates/sessao/resumo.html +++ b/sapl/templates/sessao/resumo.html @@ -49,5 +49,8 @@ {% include 'sessao/blocos_resumo/'|add:decimo_terceiro_ordenacao %} {% include 'sessao/blocos_resumo/'|add:decimo_quarto_ordenacao %} + + {% include 'sessao/blocos_resumo/'|add:decimo_quinto_ordenacao %} + {% endblock detail_content %} diff --git a/sapl/templates/sessao/resumo_ata.html b/sapl/templates/sessao/resumo_ata.html index 54c998209..6b4b224b6 100644 --- a/sapl/templates/sessao/resumo_ata.html +++ b/sapl/templates/sessao/resumo_ata.html @@ -33,5 +33,6 @@ {% include 'sessao/blocos_ata/'|add:decimo_segundo_ordenacao %} {% include 'sessao/blocos_ata/'|add:decimo_terceiro_ordenacao %} {% include 'sessao/blocos_ata/'|add:decimo_quarto_ordenacao %} + {% include 'sessao/blocos_ata/'|add:decimo_quinto_ordenacao %} {% include 'sessao/blocos_ata/assinaturas.html' %} {% endblock detail_content %} diff --git a/sapl/templates/sessao/resumo_ordenacao.html b/sapl/templates/sessao/resumo_ordenacao.html index 6146c6812..8a9a37aad 100644 --- a/sapl/templates/sessao/resumo_ordenacao.html +++ b/sapl/templates/sessao/resumo_ordenacao.html @@ -7,7 +7,6 @@ {% endblock %} {% block base_content %} - {% crispy form %} -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/sapl/templates/sessao/subnav-solene.yaml b/sapl/templates/sessao/subnav-solene.yaml index 34f381005..deef59805 100644 --- a/sapl/templates/sessao/subnav-solene.yaml +++ b/sapl/templates/sessao/subnav-solene.yaml @@ -12,6 +12,8 @@ url: orador_list - title: {% trans 'Ocorrências da Sessão' %} url: ocorrencia_sessao + - title: {% trans 'Considerações Finais' %} + url: consideracoes_finais - title: {% trans 'Expedientes' %} children: diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml index b36e6b9ef..b868e5a88 100644 --- a/sapl/templates/sessao/subnav.yaml +++ b/sapl/templates/sessao/subnav.yaml @@ -14,6 +14,8 @@ url: orador_list - title: {% trans 'Ocorrências da Sessão' %} url: ocorrencia_sessao + - title: {% trans 'Considerações Finais' %} + url: consideracoes_finais - title: {% trans 'Retirada de Pauta'%} url: retiradapauta_list