From 38f372fbfe9539027b4ca68188ac9527798d5dfa Mon Sep 17 00:00:00 2001 From: Cesar Augusto de Carvalho Date: Wed, 26 Jun 2019 14:01:12 -0300 Subject: [PATCH] =?UTF-8?q?Fix=20#916=20-=20Sess=C3=A3o=20Solene=20(#2825)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Criação de sessão solene * Inserção de mensagem solene * Alteracao do nome de mensagem para tema * Esconde ou mostra tema da sessao de acordo com o tipo da sessao * Migrations e merge --- sapl/painel/views.py | 2 + .../templates/pdf_sessao_plenaria_gerar.py | 3 + sapl/relatorios/views.py | 3 + .../0041_sessaoplenaria_tema_solene.py | 20 ++ .../migrations/0042_merge_20190612_0925.py | 16 ++ sapl/sessao/models.py | 2 + sapl/sessao/urls.py | 6 +- sapl/sessao/views.py | 218 +++++++++++++++++- sapl/templates/painel/index.html | 18 +- .../blocos_ata/identificacao_basica.html | 10 +- .../blocos_resumo/identificacao_basica.html | 4 + sapl/templates/sessao/layouts.yaml | 9 + .../templates/sessao/sessaoplenaria_form.html | 121 ++++++---- sapl/templates/sessao/subnav-solene.yaml | 34 +++ 14 files changed, 403 insertions(+), 63 deletions(-) create mode 100644 sapl/sessao/migrations/0041_sessaoplenaria_tema_solene.py create mode 100644 sapl/sessao/migrations/0042_merge_20190612_0925.py create mode 100644 sapl/templates/sessao/subnav-solene.yaml diff --git a/sapl/painel/views.py b/sapl/painel/views.py index 333c3771e..973c11432 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -528,6 +528,8 @@ def get_dados_painel(request, pk): 'sessao_plenaria': str(sessao), 'sessao_plenaria_data': sessao.data_inicio.strftime('%d/%m/%Y'), 'sessao_plenaria_hora_inicio': sessao.hora_inicio, + 'sessao_solene': sessao.tipo.nome == "Solene", + 'tema_solene': sessao.tema_solene, 'cronometro_aparte': get_cronometro_status(request, 'aparte'), 'cronometro_discurso': get_cronometro_status(request, 'discurso'), 'cronometro_ordem': get_cronometro_status(request, 'ordem'), diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py index 805731a70..0ede61f97 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py @@ -128,6 +128,9 @@ def inf_basicas(inf_basicas_dic): if dat_fim_sessao or hr_fim_sessao: tmp += '\t\tEncerramento: ' + \ dat_fim_sessao + ' - ' + hr_fim_sessao + '\n' + if inf_basicas_dic.get('tema_solene'): + tmp += '\t\tTema da Sessão Solene: ' + \ + inf_basicas_dic['tema_solene'] + '\n' return tmp diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index cb1d05cca..caa4f69ec 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -519,6 +519,9 @@ def get_sessao_plenaria(sessao, casa): inf_basicas_dic["dat_fim_sessao"] = '' inf_basicas_dic["hr_fim_sessao"] = sessao.hora_fim inf_basicas_dic["nom_camara"] = casa.nome + + if sessao.tipo.nome == 'Solene': + inf_basicas_dic["tema_solene"] = sessao.tema_solene # Conteudo multimidia cont_mult_dic = {} diff --git a/sapl/sessao/migrations/0041_sessaoplenaria_tema_solene.py b/sapl/sessao/migrations/0041_sessaoplenaria_tema_solene.py new file mode 100644 index 000000000..8219d2c3c --- /dev/null +++ b/sapl/sessao/migrations/0041_sessaoplenaria_tema_solene.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-05-31 12:37 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0040_auto_20190523_1130'), + ] + + operations = [ + migrations.AddField( + model_name='sessaoplenaria', + name='tema_solene', + field=models.TextField(blank=True, max_length=500, verbose_name='Tema da Sessão Solene'), + ), + ] diff --git a/sapl/sessao/migrations/0042_merge_20190612_0925.py b/sapl/sessao/migrations/0042_merge_20190612_0925.py new file mode 100644 index 000000000..3ca598ee3 --- /dev/null +++ b/sapl/sessao/migrations/0042_merge_20190612_0925.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-06-12 12:25 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0041_auto_20190610_1300'), + ('sessao', '0041_sessaoplenaria_tema_solene'), + ] + + operations = [ + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 8ab65ebfd..d438caa9a 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -208,6 +208,8 @@ class SessaoPlenaria(models.Model): interativa = models.NullBooleanField(blank=True, choices=YES_NO_CHOICES, verbose_name=_('Sessão interativa')) + tema_solene = models.TextField( + blank=True, max_length=500, verbose_name=_('Tema da Sessão Solene')) class Meta: verbose_name = _('Sessão Plenária') diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index f1aabac96..730469c29 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -33,7 +33,8 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, renumerar_materias_expediente, sessao_legislativa_legislatura_ajax, VotacaoEmBlocoOrdemDia, VotacaoEmBlocoExpediente, - VotacaoEmBlocoSimbolicaView, VotacaoEmBlocoNominalView) + VotacaoEmBlocoSimbolicaView, VotacaoEmBlocoNominalView, + recuperar_nome_tipo_sessao) from .apps import AppConfig @@ -68,6 +69,9 @@ urlpatterns = [ recuperar_numero_sessao_view, name='recuperar_numero_sessao_view' ), + url(r'^sessao/recuperar-nome-tipo-sessao/', + recuperar_nome_tipo_sessao, + name='recuperar_nome_tipo_sessao'), url(r'^sessao/sessao-legislativa-legislatura-ajax/', sessao_legislativa_legislatura_ajax, name='sessao_legislativa_legislatura_ajax_view'), diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 295f22543..001b0e91b 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -614,6 +614,15 @@ class OradorCrud(MasterDetailCrud): class ListView(MasterDetailCrud.ListView): ordering = ['numero_ordem', 'parlamentar'] + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + sessao_pk = context['root_pk'] + sessao = SessaoPlenaria.objects.get(id=sessao_pk) + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + return context + class CreateView(MasterDetailCrud.CreateView): form_class = OradorForm @@ -625,7 +634,7 @@ class OradorCrud(MasterDetailCrud): return reverse('sapl.sessao:orador_list', kwargs={'pk': self.kwargs['pk']}) - class UpdateView(MasterDetailCrud.UpdateView): +class UpdateView(MasterDetailCrud.UpdateView): form_class = OradorForm @@ -637,6 +646,75 @@ class OradorCrud(MasterDetailCrud): return initial +class OradorExpedienteCrud(OradorCrud): + model = OradorExpediente + + class CreateView(MasterDetailCrud.CreateView): + + form_class = OradorForm + + def get_initial(self): + return {'id_sessao': self.kwargs['pk']} + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + sessao_pk = context['root_pk'] + sessao = SessaoPlenaria.objects.get(id=sessao_pk) + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + return context + + def get_success_url(self): + return reverse('sapl.sessao:orador_list', + kwargs={'pk': self.kwargs['pk']}) + + + class UpdateView(MasterDetailCrud.UpdateView): + + form_class = OradorForm + + 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 + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + sessao_pk = context['root_pk'] + sessao = SessaoPlenaria.objects.get(id=sessao_pk) + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + return context + + + class DetailView(MasterDetailCrud.DetailView): + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + sessao_pk = context['root_pk'] + sessao = SessaoPlenaria.objects.get(id=sessao_pk) + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + return context + + + class DeleteView(MasterDetailCrud.DeleteView): + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + sessao_pk = context['root_pk'] + sessao = SessaoPlenaria.objects.get(id=sessao_pk) + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + return context + + class OradorExpedienteCrud(OradorCrud): model = OradorExpediente @@ -647,6 +725,17 @@ class OradorExpedienteCrud(OradorCrud): def get_initial(self): return {'id_sessao': self.kwargs['pk']} + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + pk = context['root_pk'] + sessao = SessaoPlenaria.objects.get(id=pk) + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + return context + + def get_success_url(self): return reverse('sapl.sessao:oradorexpediente_list', kwargs={'pk': self.kwargs['pk']}) @@ -659,6 +748,40 @@ class OradorExpedienteCrud(OradorCrud): 'numero': self.object.numero_ordem} + class ListView(MasterDetailCrud.ListView): + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + pk = context['root_pk'] + sessao = SessaoPlenaria.objects.get(id=pk) + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + return context + + class DetailView(MasterDetailCrud.DetailView): + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + pk = context['root_pk'] + sessao = SessaoPlenaria.objects.get(id=pk) + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + return context + + + class UpdateView(MasterDetailCrud.UpdateView): + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + pk = context['root_pk'] + sessao = SessaoPlenaria.objects.get(id=pk) + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + return context + class OradorOrdemDiaCrud(OradorCrud): model = OradorOrdemDia @@ -735,6 +858,16 @@ def sessao_legislativa_legislatura_ajax(request): return JsonResponse({'sessao_legislativa': lista_sessoes}) +def recuperar_nome_tipo_sessao(request): + try: + tipo = TipoSessaoPlenaria.objects.get(pk=request.GET['tipo']) + tipo_nome = tipo.nome + except ObjectDoesNotExist: + tipo_nome = '' + + return JsonResponse({'nome_tipo': tipo_nome}) + + class SessaoCrud(Crud): model = SessaoPlenaria help_topic = 'sessao_legislativa' @@ -764,6 +897,18 @@ class SessaoCrud(Crud): form_class = SessaoPlenariaForm + @property + def layout_key(self): + return 'SessaoSolene' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + sessao = context['object'] + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + return context + def get_initial(self): return {'sessao_legislativa': self.object.sessao_legislativa} @@ -772,6 +917,10 @@ class SessaoCrud(Crud): form_class = SessaoPlenariaForm logger = logging.getLogger(__name__) + @property + def layout_key(self): + return 'SessaoSolene' + @property def cancel_url(self): return self.search_url @@ -804,6 +953,26 @@ class SessaoCrud(Crud): namespace = self.model._meta.app_config.name return reverse('%s:%s' % (namespace, 'sessaoplenaria_list')) + class DetailView(Crud.DetailView): + + @property + def layout_key(self): + sessao = self.object + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + return 'SessaoSolene' + return 'SessaoPlenaria' + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + sessao = context['object'] + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + # self.layout_key = 'SessaoSolene' + return context + class SessaoPermissionMixin(PermissionRequiredForAppCrudMixin, FormMixin, @@ -837,6 +1006,10 @@ class PresencaView(FormMixin, PresencaMixin, DetailView): context = FormMixin.get_context_data(self, **kwargs) context['title'] = '%s (%s)' % ( _('Presença'), 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 @method_decorator(permission_required( @@ -921,17 +1094,23 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView): cronometro_ordem = cronometro_ordem.seconds cronometro_consideracoes = cronometro_consideracoes.seconds + sessao_pk = kwargs['pk'] + sessao = SessaoPlenaria.objects.get(pk=sessao_pk) context = TemplateView.get_context_data(self, **kwargs) context.update({ 'head_title': str(_('Painel Plenário')), - 'sessao_id': kwargs['pk'], - 'root_pk': kwargs['pk'], - 'sessaoplenaria': SessaoPlenaria.objects.get(pk=kwargs['pk']), + 'sessao_id': sessao_pk, + 'root_pk': sessao_pk, + 'sessaoplenaria': sessao, 'cronometro_discurso': cronometro_discurso, 'cronometro_aparte': cronometro_aparte, 'cronometro_ordem': cronometro_ordem, 'cronometro_consideracoes': cronometro_consideracoes}) + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) + return context @@ -1154,8 +1333,12 @@ class MesaView(FormMixin, DetailView): context = FormMixin.get_context_data(self, **kwargs) context['title'] = '%s (%s)' % ( _('Mesa Diretora'), 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 get_success_url(self): pk = self.kwargs['pk'] return reverse('sapl.sessao:mesa', kwargs={'pk': pk}) @@ -1363,14 +1546,18 @@ def get_identificação_basica(sessao_plenaria): abertura = data_inicio.strftime('%d/%m/%Y') if data_inicio else '' data_fim = sessao_plenaria.data_fim encerramento = data_fim.strftime('%d/%m/%Y') + ' -' if data_fim else '' - return({'basica': [ + tema_solene = sessao_plenaria.tema_solene + context = {'basica': [ _('Tipo de Sessão: %(tipo)s') % {'tipo': sessao_plenaria.tipo}, _('Abertura: %(abertura)s - %(hora_inicio)s') % { 'abertura': abertura, 'hora_inicio': sessao_plenaria.hora_inicio}, _('Encerramento: %(encerramento)s %(hora_fim)s') % { - 'encerramento': encerramento, 'hora_fim': sessao_plenaria.hora_fim} - ], - 'sessaoplenaria': sessao_plenaria}) + 'encerramento': encerramento, 'hora_fim': sessao_plenaria.hora_fim}, + ], + 'sessaoplenaria': sessao_plenaria} + if sessao_plenaria.tipo.nome == "Solene" and tema_solene: + context.update({'tema_solene': 'Tema da Sessão Solene: %s' % tema_solene}) + return context def get_conteudo_multimidia(sessao_plenaria): @@ -1824,6 +2011,11 @@ class ResumoView(DetailView): 'decimo_terceiro_ordenacao': 'oradores_explicacoes.html', 'decimo_quarto_ordenacao': 'ocorrencias_da_sessao.html' }) + + sessao = context['object'] + tipo_sessao = sessao.tipo + if tipo_sessao.nome == "Solene": + context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'}) return context def get(self, request, *args, **kwargs): @@ -1848,6 +2040,10 @@ class ExpedienteView(FormMixin, DetailView): context = FormMixin.get_context_data(self, **kwargs) context['title'] = '%s (%s)' % ( _('Expediente Diversos'), 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 @method_decorator(permission_required('sessao.add_expedientesessao')) @@ -1937,6 +2133,10 @@ class OcorrenciaSessaoView(FormMixin, DetailView): context = FormMixin.get_context_data(self, **kwargs) context['title'] = 'Ocorrências da Sessão (%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): diff --git a/sapl/templates/painel/index.html b/sapl/templates/painel/index.html index 476e700c8..3241844a0 100644 --- a/sapl/templates/painel/index.html +++ b/sapl/templates/painel/index.html @@ -89,18 +89,23 @@ Considerações Finais: - -
+ +

Resultado

-
+

Matéria em Votação

+ +
@@ -234,6 +239,7 @@ $("#sessao_plenaria").text(data["sessao_plenaria"]) $("#sessao_plenaria_data").text("Data Início: " + data["sessao_plenaria_data"]) $("#sessao_plenaria_hora_inicio").text("Hora Início: " + data["sessao_plenaria_hora_inicio"]) + $("#sessao_solene_tema").text(data["tema_solene"]) if (data["status_painel"] == false) { $("#message").text("PAINEL ENCONTRA-SE FECHADO"); } @@ -241,6 +247,12 @@ $("#message").text(""); } + if (data["sessao_solene"]){ + $("#resultado_votacao_div").hide(); + $("#obs_materia_div").hide(); + $('#tema_solene_div').show(); + } + if (data["brasao"] != null) $("#logo-painel").attr("src", data["brasao"]); diff --git a/sapl/templates/sessao/blocos_ata/identificacao_basica.html b/sapl/templates/sessao/blocos_ata/identificacao_basica.html index 84eeb2a11..2beac1818 100644 --- a/sapl/templates/sessao/blocos_ata/identificacao_basica.html +++ b/sapl/templates/sessao/blocos_ata/identificacao_basica.html @@ -2,8 +2,14 @@

Identificação Básica: {% for b in basica %} - {{b}} - {% if not forloop.last %} ; {% endif %} + {{b}} + {% if not forloop.last %} + ; + {% else %} + {% if tema_solene %} + ; {{tema_solene}} + {% endif %} + {% endif %} {% endfor %}

\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/identificacao_basica.html b/sapl/templates/sessao/blocos_resumo/identificacao_basica.html index 75ba5ba68..3c7859079 100644 --- a/sapl/templates/sessao/blocos_resumo/identificacao_basica.html +++ b/sapl/templates/sessao/blocos_resumo/identificacao_basica.html @@ -5,6 +5,10 @@ {% for b in basica %}
{{b}}
{% endfor %} + {% if tema_solene %} +

+
{{tema_solene}}
+ {% endif %}


diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml index f5356a829..caeafc963 100644 --- a/sapl/templates/sessao/layouts.yaml +++ b/sapl/templates/sessao/layouts.yaml @@ -11,6 +11,15 @@ SessaoPlenaria: - upload_pauta upload_ata upload_anexo - url_audio url_video +SessaoSolene: + {% trans 'Dados Básicos' %}: + - legislatura sessao_legislativa tipo:3 numero:1 + - data_inicio:5 hora_inicio:5 iniciada + - data_fim:5 hora_fim:5 finalizada + - tema_solene + - upload_pauta upload_ata upload_anexo + - url_audio url_video + TipoResultadoVotacao: {% trans 'Tipo de Resultado da Votação' %}: - nome diff --git a/sapl/templates/sessao/sessaoplenaria_form.html b/sapl/templates/sessao/sessaoplenaria_form.html index aa18e0105..17148fb6d 100644 --- a/sapl/templates/sessao/sessaoplenaria_form.html +++ b/sapl/templates/sessao/sessaoplenaria_form.html @@ -7,63 +7,88 @@ diff --git a/sapl/templates/sessao/subnav-solene.yaml b/sapl/templates/sessao/subnav-solene.yaml new file mode 100644 index 000000000..34f381005 --- /dev/null +++ b/sapl/templates/sessao/subnav-solene.yaml @@ -0,0 +1,34 @@ +{% load i18n common_tags %} + +- title: {% trans 'Abertura' %} + children: + - title: {% trans 'Dados Básicos' %} + url: sessaoplenaria_detail + - title: {% trans 'Mesa' %} + url: mesa + - title: {% trans 'Presença' %} + url: presenca + - title: {% trans 'Explicações Pessoais' %} + url: orador_list + - title: {% trans 'Ocorrências da Sessão' %} + url: ocorrencia_sessao + +- title: {% trans 'Expedientes' %} + children: + - title: {% trans 'Expediente Diversos' %} + url: expediente + - title: {% trans 'Oradores do Expediente' %} + url: oradorexpediente_list + +- title: {% trans 'Painel Eletrônico' %} + url: painel + {% if not 'painel_aberto'|get_config_attr %}check_permission: painel.list_painel{%endif%} + check_permission: painel.list_painel + +- title: {% trans 'Resumo' %} + children: + - title: {% trans 'Resumo' %} + url: resumo + - title: {% trans 'Extrato' %} + url: resumo_ata + check_permission: sessao.add_sessaoplenaria