From 8304b327334d2c458eabfc95ad6f363121909809 Mon Sep 17 00:00:00 2001 From: AndreSouto Date: Mon, 1 Oct 2018 14:47:09 -0300 Subject: [PATCH] Fixes #2030 --- .../templates/pdf_sessao_plenaria_gerar.py | 28 +++++++- sapl/relatorios/views.py | 37 ++++++++-- sapl/rules/map_rules.py | 41 +++++------ sapl/sessao/forms.py | 11 ++- .../migrations/0024_ocorrenciasessao.py | 28 ++++++++ .../migrations/0025_auto_20180919_1116.py | 21 ++++++ sapl/sessao/models.py | 15 ++++ sapl/sessao/urls.py | 6 +- sapl/sessao/views.py | 69 +++++++++++++++++-- .../blocos_resumo/ocorrencias_da_sessao.html | 6 ++ sapl/templates/sessao/ocorrencia_sessao.html | 32 +++++++++ sapl/templates/sessao/resumo.html | 2 + sapl/templates/sessao/subnav.yaml | 2 + 13 files changed, 261 insertions(+), 37 deletions(-) create mode 100644 sapl/sessao/migrations/0024_ocorrenciasessao.py create mode 100644 sapl/sessao/migrations/0025_auto_20180919_1116.py create mode 100644 sapl/templates/sessao/blocos_resumo/ocorrencias_da_sessao.html create mode 100644 sapl/templates/sessao/ocorrencia_sessao.html diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py index 1c01bfb08..1f0f6482c 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py @@ -6,6 +6,9 @@ """ import time +from django.template.defaultfilters import safe +from django.utils.html import strip_tags + from sapl.sessao.models import ResumoOrdenacao from trml2pdf import parseString @@ -284,7 +287,25 @@ def oradores(lst_oradores): return tmp -def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores): +def ocorrencias(lst_ocorrencias): + """ + + """ + tmp = '' + tmp += '\t\tOcorrências da Sessão\n' + tmp += '\t\t\n' + tmp += '\t\t\t \n' + tmp += '\t\t\n' + for idx, ocorrencia in enumerate(lst_ocorrencias): + tmp += '\t\t' + \ + str(ocorrencia.conteudo) + '\n' + tmp += '\t\t\n' + tmp += '\t\t\t \n' + tmp += '\t\t\n' + return tmp + + +def principal(cabecalho_dic, rodape_dic, imagem, sessao, 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_ocorrencias): """ """ arquivoPdf = str(int(time.time() * 100)) + ".pdf" @@ -316,7 +337,8 @@ def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_me 'mat_o_d': votacao(lst_votacao), 'mesa_d': mesa(lst_mesa), 'oradores_exped': oradores_expediente(lst_oradores_expediente), - 'oradores_expli': oradores(lst_oradores) + 'oradores_expli': oradores(lst_oradores), + 'ocorr_sessao': ocorrencias(lst_ocorrencias) } if ordenacao: @@ -330,6 +352,7 @@ def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_me tmp += dict_ord_template[ordenacao.oitavo] tmp += dict_ord_template[ordenacao.nono] tmp += dict_ord_template[ordenacao.decimo] + else: tmp += inf_basicas(inf_basicas_dic) tmp += mesa(lst_mesa) @@ -340,6 +363,7 @@ def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_me tmp += presenca_ordem_dia(lst_presenca_ordem_dia) tmp += votacao(lst_votacao) tmp += oradores(lst_oradores) + tmp += ocorrencias(lst_ocorrencias) tmp += '\t\n' tmp += '\n' diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index a7af13150..676eb0961 100644 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -17,7 +17,7 @@ from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, IntegranteMesa, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, - SessaoPlenariaPresenca) + SessaoPlenariaPresenca, OcorrenciaSessao) from sapl.settings import STATIC_ROOT from sapl.utils import LISTA_DE_UFS, ExtraiTag, TrocaTag, filiacao_data @@ -514,13 +514,13 @@ def get_sessao_plenaria(sessao, casa): dic_presenca['sgl_partido'] = partido_sigla lst_presenca_sessao.append(dic_presenca) + # Exibe os Expedientes lst_expedientes = [] expedientes = ExpedienteSessao.objects.filter( sessao_plenaria=sessao).order_by('tipo__nome') for e in expedientes: - dic_expedientes = {} dic_expedientes["nom_expediente"] = e.tipo.nome conteudo = e.conteudo @@ -539,6 +539,7 @@ def get_sessao_plenaria(sessao, casa): if dic_expedientes: lst_expedientes.append(dic_expedientes) + # Lista das matérias do Expediente, incluindo o resultado das votacoes lst_expediente_materia = [] for expediente_materia in ExpedienteMateria.objects.filter( @@ -727,6 +728,28 @@ def get_sessao_plenaria(sessao, casa): dic_oradores['sgl_partido'] = sigla lst_oradores.append(dic_oradores) + # Ocorrências da Sessão + lst_ocorrencias = [] + ocorrencias = OcorrenciaSessao.objects.filter( + sessao_plenaria=sessao) + + for o in ocorrencias: + conteudo = o.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('&', '&') + + o.conteudo = conteudo + + lst_ocorrencias.append(o) + + return (inf_basicas_dic, lst_mesa, lst_presenca_sessao, @@ -735,7 +758,8 @@ def get_sessao_plenaria(sessao, casa): lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, - lst_oradores) + lst_oradores, + lst_ocorrencias) def get_turno(dic, materia, sessao_data_inicio): @@ -794,7 +818,9 @@ def relatorio_sessao_plenaria(request, pk): lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, - lst_oradores) = get_sessao_plenaria(sessao, casa) + lst_oradores, + lst_ocorrencias) = get_sessao_plenaria(sessao, casa) + for idx in range(len(lst_expedientes)): txt_expedientes = lst_expedientes[idx]['txt_expediente'] @@ -815,7 +841,8 @@ def relatorio_sessao_plenaria(request, pk): lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, - lst_oradores) + lst_oradores, + lst_ocorrencias) response.write(pdf) return response diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index bba114149..fa5a5b324 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -1,23 +1,3 @@ -from sapl.base import models as base -from sapl.comissoes import models as comissoes -from sapl.compilacao import models as compilacao -from sapl.lexml import models as lexml -from sapl.materia import models as materia -from sapl.norma import models as norma -from sapl.painel import models as painel -from sapl.parlamentares import models as parlamentares -from sapl.protocoloadm import models as protocoloadm -from sapl.audiencia import models as audiencia -from sapl.rules import (RP_ADD, RP_CHANGE, RP_DELETE, RP_DETAIL, RP_LIST, - SAPL_GROUP_ADMINISTRATIVO, SAPL_GROUP_ANONYMOUS, - SAPL_GROUP_AUTOR, SAPL_GROUP_COMISSOES, - SAPL_GROUP_GERAL, SAPL_GROUP_LOGIN_SOCIAL, - SAPL_GROUP_MATERIA, SAPL_GROUP_NORMA, - SAPL_GROUP_PAINEL, SAPL_GROUP_PARLAMENTAR, - SAPL_GROUP_PROTOCOLO, SAPL_GROUP_SESSAO, - SAPL_GROUP_VOTANTE) -from sapl.sessao import models as sessao - """ Todas as permissões do django framework seguem o padrão @@ -46,6 +26,26 @@ negócio trabalham com os cinco radiais de permissão e com qualquer outro tipo de permissão customizada, nesta ordem de precedência. """ +from sapl.audiencia import models as audiencia +from sapl.base import models as base +from sapl.comissoes import models as comissoes +from sapl.compilacao import models as compilacao +from sapl.lexml import models as lexml +from sapl.materia import models as materia +from sapl.norma import models as norma +from sapl.painel import models as painel +from sapl.parlamentares import models as parlamentares +from sapl.protocoloadm import models as protocoloadm +from sapl.rules import (RP_ADD, RP_CHANGE, RP_DELETE, RP_DETAIL, RP_LIST, + SAPL_GROUP_ADMINISTRATIVO, SAPL_GROUP_ANONYMOUS, + SAPL_GROUP_AUTOR, SAPL_GROUP_COMISSOES, + SAPL_GROUP_GERAL, SAPL_GROUP_LOGIN_SOCIAL, + SAPL_GROUP_MATERIA, SAPL_GROUP_NORMA, + SAPL_GROUP_PAINEL, SAPL_GROUP_PARLAMENTAR, + SAPL_GROUP_PROTOCOLO, SAPL_GROUP_SESSAO, + SAPL_GROUP_VOTANTE) +from sapl.sessao import models as sessao + __base__ = [RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE] __listdetailchange__ = [RP_LIST, RP_DETAIL, RP_CHANGE] @@ -159,6 +159,7 @@ rules_group_sessao = { (sessao.SessaoPlenaria, __base__), (sessao.SessaoPlenariaPresenca, __base__), (sessao.ExpedienteMateria, __base__), + (sessao.OcorrenciaSessao, __base__), (sessao.IntegranteMesa, __base__), (sessao.ExpedienteSessao, __base__), (sessao.Orador, __base__), diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index f7308f62e..a319e5447 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -22,7 +22,7 @@ from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES, from .models import (Bancada, Bloco, ExpedienteMateria, Orador, OradorExpediente, OrdemDia, SessaoPlenaria, - SessaoPlenariaPresenca, TipoResultadoVotacao) + SessaoPlenariaPresenca, TipoResultadoVotacao, OcorrenciaSessao) def recupera_anos(): @@ -54,7 +54,8 @@ ORDENACAO_RESUMO = [('cont_mult', 'Conteúdo Multimídia'), ('mat_o_d', 'Matérias da Ordem do Dia'), ('mesa_d', 'Mesa Diretora'), ('oradores_exped', 'Oradores do Expediente'), - ('oradores_expli', 'Oradores das Explicações Pessoais')] + ('oradores_expli', 'Oradores das Explicações Pessoais'), + ('ocorrencia_sessao', 'Ocorrências da Sessão')] class SessaoPlenariaForm(ModelForm): @@ -411,6 +412,12 @@ class MesaForm(forms.Form): class ExpedienteForm(forms.Form): conteudo = forms.CharField(required=False, widget=forms.Textarea) +class OcorrenciaSessaoForm(ModelForm): + class Meta: + model = OcorrenciaSessao + fields = ['conteudo'] + + class VotacaoForm(forms.Form): votos_sim = forms.CharField(label='Sim') diff --git a/sapl/sessao/migrations/0024_ocorrenciasessao.py b/sapl/sessao/migrations/0024_ocorrenciasessao.py new file mode 100644 index 000000000..6c612363f --- /dev/null +++ b/sapl/sessao/migrations/0024_ocorrenciasessao.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2018-09-18 13:44 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0023_auto_20180914_1315'), + ] + + operations = [ + migrations.CreateModel( + name='OcorrenciaSessao', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('conteudo', models.TextField(blank=True, verbose_name='Ocorrências da Sessão Plenária')), + ('sessao_plenaria', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sessao.SessaoPlenaria')), + ], + options={ + 'verbose_name_plural': 'Ocorrências da Sessão Plenaria', + 'verbose_name': 'Ocorrência da Sessão Plenaria', + }, + ), + ] diff --git a/sapl/sessao/migrations/0025_auto_20180919_1116.py b/sapl/sessao/migrations/0025_auto_20180919_1116.py new file mode 100644 index 000000000..fa4c0a435 --- /dev/null +++ b/sapl/sessao/migrations/0025_auto_20180919_1116.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2018-09-19 14:16 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0024_ocorrenciasessao'), + ] + + operations = [ + migrations.AlterField( + model_name='ocorrenciasessao', + name='sessao_plenaria', + field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='sessao.SessaoPlenaria'), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 11047ed9e..7f8ea0882 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -301,6 +301,21 @@ class ExpedienteSessao(models.Model): # ExpedienteSessaoPlenaria return '%s - %s' % (self.tipo, self.sessao_plenaria) +@reversion.register() +class OcorrenciaSessao(models.Model): # OcorrenciaSessaoPlenaria + sessao_plenaria = models.OneToOneField(SessaoPlenaria, + on_delete=models.PROTECT) + conteudo = models.TextField( + blank=True, verbose_name=_('Ocorrências da Sessão Plenária')) + + class Meta: + verbose_name = _('Ocorrência da Sessão Plenaria') + verbose_name_plural = _('Ocorrências da Sessão Plenaria') + + def __str__(self): + return '%s - %s' % (self.sessao_plenaria, self.conteudo) + + @reversion.register() class IntegranteMesa(models.Model): # MesaSessaoPlenaria sessao_plenaria = models.ForeignKey(SessaoPlenaria, diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 201623824..1e3e4ae43 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -3,7 +3,7 @@ from django.conf.urls import include, url from sapl.sessao.views import (AdicionarVariasMateriasExpediente, AdicionarVariasMateriasOrdemDia, BancadaCrud, BlocoCrud, CargoBancadaCrud, - ExpedienteMateriaCrud, ExpedienteView, + ExpedienteMateriaCrud, ExpedienteView, OcorrenciaSessaoView, MateriaOrdemDiaCrud, MesaView, OradorCrud, OradorExpedienteCrud, PainelView, PautaSessaoDetailView, PautaSessaoView, @@ -100,6 +100,8 @@ urlpatterns = [ # Subnav sessão url(r'^sessao/(?P\d+)/expediente$', ExpedienteView.as_view(), name='expediente'), + url(r'^sessao/(?P\d+)/ocorrencia_sessao$', + OcorrenciaSessaoView.as_view(), name='ocorrencia_sessao'), url(r'^sessao/(?P\d+)/presenca$', PresencaView.as_view(), name='presenca'), url(r'^sessao/(?P\d+)/painel$', @@ -110,7 +112,7 @@ urlpatterns = [ url(r'^sessao/(?P\d+)/resumo$', ResumoView.as_view(), name='resumo'), url(r'^sessao/(?P\d+)/resumo_ata$', - ResumoAtaView.as_view(), name='resumo_ata'), + ResumoAtaView.as_view(), name='resumo_ata'), url(r'^sessao/pesquisar-sessao$', PesquisarSessaoPlenariaView.as_view(), name='pesquisar_sessao'), url(r'^sessao/(?P\d+)/matordemdia/votnom/(?P\d+)/(?P\d+)$', diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 32813f84a..d658ab787 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -37,13 +37,13 @@ from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm from sapl.utils import show_results_filter_set, remover_acentos from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm, - ExpedienteForm, ListMateriaForm, MesaForm, + ExpedienteForm, OcorrenciaSessaoForm, ListMateriaForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, VotacaoNominalForm) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, - ExpedienteMateria, ExpedienteSessao, IntegranteMesa, + ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, @@ -1175,7 +1175,8 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): 'setimo': ordenacao.setimo, 'oitavo': ordenacao.oitavo, 'nono': ordenacao.nono, - 'decimo': ordenacao.decimo}) + 'decimo': ordenacao.decimo, + 'decimo_primeiro': ordenacao.decimo_primeiro}) return initial def form_valid(self, form): @@ -1191,6 +1192,7 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): ordenacao.oitavo = form.cleaned_data['oitavo'] ordenacao.nono = form.cleaned_data['nono'] ordenacao.decimo = form.cleaned_data['decimo'] + ordenacao.decimo_primeiro = form.cleaned_data['decimo_primeiro'] ordenacao.save() @@ -1280,6 +1282,7 @@ class ResumoView(DetailView): ex = {'tipo': tipo, 'conteudo': conteudo} expedientes.append(ex) context.update({'expedientes': expedientes}) + # ===================================================================== # Matérias Expediente materias = ExpedienteMateria.objects.filter( @@ -1413,6 +1416,12 @@ class ResumoView(DetailView): oradores_explicacoes.append(oradores) context.update({'oradores_explicacoes': oradores_explicacoes}) + # ===================================================================== + # Ocorrẽncias da Sessão + ocorrencias_sessao = OcorrenciaSessao.objects.filter(sessao_plenaria_id=self.object.id) + + context.update({'ocorrencias_da_sessao': ocorrencias_sessao}) + # ===================================================================== # Indica a ordem com a qual o template será renderizado ordenacao = ResumoOrdenacao.objects.first() @@ -1426,7 +1435,8 @@ class ResumoView(DetailView): 'mat_o_d': 'materias_ordem_dia.html', 'mesa_d': 'mesa_diretora.html', 'oradores_exped': 'oradores_expediente.html', - 'oradores_expli': 'oradores_explicacoes.html' + 'oradores_expli': 'oradores_explicacoes.html', + 'ocorr_sessao': 'ocorrencias_da_sessao.html' } if ordenacao: @@ -1452,12 +1462,16 @@ class ResumoView(DetailView): 'setimo_ordenacao': dict_ord_template['oradores_exped'], 'oitavo_ordenacao': dict_ord_template['lista_p_o_d'], 'nono_ordenacao': dict_ord_template['mat_o_d'], - 'decimo_ordenacao': dict_ord_template['oradores_expli']}) + 'decimo_ordenacao': dict_ord_template['oradores_expli'], + 'decimo_primeiro_ordenacao': dict_ord_template['ocorr_sessao']}) return self.render_to_response(context) + + class ResumoAtaView(ResumoView): template_name = 'sessao/resumo_ata.html' + class ExpedienteView(FormMixin, DetailView): template_name = 'sessao/expediente.html' form_class = ExpedienteForm @@ -1537,6 +1551,49 @@ class ExpedienteView(FormMixin, DetailView): return reverse('sapl.sessao:expediente', kwargs={'pk': pk}) + +class OcorrenciaSessaoView(FormMixin, DetailView): + template_name = 'sessao/ocorrencia_sessao.html' + form_class = OcorrenciaSessaoForm + model = SessaoPlenaria + + def delete_form(self): + OcorrenciaSessao.objects.filter(sessao_plenaria=self.object.id).delete() + + msg = _('Registro deletado com sucesso') + messages.add_message(self.request, messages.SUCCESS, msg) + + def save_form(self,request): + conteudo = request.POST.get('conteudo') + + OcorrenciaSessao.objects.filter(sessao_plenaria=self.object.id).delete() + + ocorrencia = OcorrenciaSessao() + ocorrencia.sessao_plenaria_id = self.object.id + ocorrencia.conteudo = conteudo + ocorrencia.save() + + msg = _('Registro salvo com sucesso') + messages.add_message(self.request, messages.SUCCESS, msg) + + @method_decorator(permission_required('sessao.add_ocorrenciasessao')) + def post(self, request, *args, **kwargs): + self.object = self.get_object() + form = OcorrenciaSessaoForm(request.POST) + + if request.POST.get('delete'): + self.delete_form() + return self.form_valid(form) + + elif request.POST.get('save'): + self.save_form(request) + return self.form_valid(form) + + def get_success_url(self): + pk = self.kwargs['pk'] + return reverse('sapl.sessao:ocorrencia_sessao', kwargs={'pk': pk}) + + class VotacaoEditView(SessaoPermissionMixin): ''' @@ -1645,7 +1702,7 @@ class VotacaoView(SessaoPermissionMixin): def post(self, request, *args, **kwargs): self.object = self.get_object() form = VotacaoForm(request.POST) - context = self.get_context_data(object=self.object) + context = self.get_context_d(object=self.object) url = request.get_full_path() # ==================================================== diff --git a/sapl/templates/sessao/blocos_resumo/ocorrencias_da_sessao.html b/sapl/templates/sessao/blocos_resumo/ocorrencias_da_sessao.html new file mode 100644 index 000000000..c56a1bb69 --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/ocorrencias_da_sessao.html @@ -0,0 +1,6 @@ +
+ Ocorrências da Sessão +
+

{{object.ocorrenciasessao.conteudo|safe}}

+
+
\ No newline at end of file diff --git a/sapl/templates/sessao/ocorrencia_sessao.html b/sapl/templates/sessao/ocorrencia_sessao.html new file mode 100644 index 000000000..0daa921d8 --- /dev/null +++ b/sapl/templates/sessao/ocorrencia_sessao.html @@ -0,0 +1,32 @@ +{% extends "crud/detail.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% load common_tags %} + +{% block actions %}{% endblock %} + +{% block title %}Ocorrências da Sessão ({{ object }}) {% endblock %} + +{% block detail_content %} + {% if perms|get_add_perm:view %} +
+ {% csrf_token %} +
+ +
+ + +
+ {% else %} + {{object.ocorrenciasessao.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/resumo.html b/sapl/templates/sessao/resumo.html index b5831bdca..c7c2070ce 100644 --- a/sapl/templates/sessao/resumo.html +++ b/sapl/templates/sessao/resumo.html @@ -50,5 +50,7 @@ {% include 'sessao/blocos_resumo/'|add:decimo_ordenacao %}


+ {% include 'sessao/blocos_resumo/'|add:decimo_primeiro_ordenacao %} +


{% endblock detail_content %} diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml index 236d57c4c..0a98b8a3b 100644 --- a/sapl/templates/sessao/subnav.yaml +++ b/sapl/templates/sessao/subnav.yaml @@ -10,6 +10,8 @@ url: presenca - title: {% trans 'Explicações Pessoais' %} url: orador_list + - title: {% trans 'Ocorrências da Sessão' %} + url: ocorrencia_sessao - title: {% trans 'Expedientes' %} children: