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
+
+
+
Tema da Sessão Solene
+
+
@@ -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