Browse Source

Fix #916 - Sessão Solene (#2825)

* 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
pull/2866/head
Cesar Augusto de Carvalho 6 years ago
committed by Edward
parent
commit
38f372fbfe
  1. 2
      sapl/painel/views.py
  2. 3
      sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
  3. 3
      sapl/relatorios/views.py
  4. 20
      sapl/sessao/migrations/0041_sessaoplenaria_tema_solene.py
  5. 16
      sapl/sessao/migrations/0042_merge_20190612_0925.py
  6. 2
      sapl/sessao/models.py
  7. 6
      sapl/sessao/urls.py
  8. 214
      sapl/sessao/views.py
  9. 16
      sapl/templates/painel/index.html
  10. 8
      sapl/templates/sessao/blocos_ata/identificacao_basica.html
  11. 4
      sapl/templates/sessao/blocos_resumo/identificacao_basica.html
  12. 9
      sapl/templates/sessao/layouts.yaml
  13. 59
      sapl/templates/sessao/sessaoplenaria_form.html
  14. 34
      sapl/templates/sessao/subnav-solene.yaml

2
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'),

3
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\t<para style="P2" spaceAfter="5"><b>Encerramento: </b> ' + \
dat_fim_sessao + ' <b>- </b> ' + hr_fim_sessao + '</para>\n'
if inf_basicas_dic.get('tema_solene'):
tmp += '\t\t<para style="P2" spaceAfter="5"><b>Tema da Sessão Solene: </b> ' + \
inf_basicas_dic['tema_solene'] + '</para>\n'
return tmp

3
sapl/relatorios/views.py

@ -520,6 +520,9 @@ def get_sessao_plenaria(sessao, casa):
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 = {}
if sessao.url_audio:

20
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'),
),
]

16
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 = [
]

2
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')

6
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'),

214
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 <small>(%s)</small>' % (
_('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,6 +1333,10 @@ class MesaView(FormMixin, DetailView):
context = FormMixin.get_context_data(self, **kwargs)
context['title'] = '%s <small>(%s)</small>' % (
_('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):
@ -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}
'encerramento': encerramento, 'hora_fim': sessao_plenaria.hora_fim},
],
'sessaoplenaria': sessao_plenaria})
'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 <small>(%s)</small>' % (
_('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 <small>(%s)</small>' % (
self.object)
sessao = context['object']
tipo_sessao = sessao.tipo
if tipo_sessao.nome == "Solene":
context.update({'subnav_template_name': 'sessao/subnav-solene.yaml'})
return context
def delete(self):

16
sapl/templates/painel/index.html

@ -90,17 +90,22 @@
</div>
</div>
<div class="col-md-6 text-center painel">
<div class="col-md-6 text-center painel" id="resultado_votacao_div">
<h2 class="text-subtitle">Resultado</h2>
<span id="votacao" class="text-value"></span>
<h2><span id="resultado_votacao" lass="text-title"></span>
</div>
<div class="col-md-6 text-center painel">
<div class="col-md-6 text-center painel" id="obs_materia_div">
<h2 class="text-subtitle">Matéria em Votação</h2>
<span id="materia_legislativa_texto" class="text-value"></span>
<span id="observacao_materia" class="text-value"></span>
</div>
<div class="col-md-6 text-center painel" id="tema_solene_div" style="display: none">
<h2 class="text-subtitle">Tema da Sessão Solene</h2>
<span id="sessao_solene_tema" class="text-value"></span>
</div>
</div>
</div>
</div>
@ -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"]);

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

@ -3,7 +3,13 @@
<strong>Identificação Básica: </strong>
{% for b in basica %}
{{b}}
{% if not forloop.last %} ; {% endif %}
{% if not forloop.last %}
;
{% else %}
{% if tema_solene %}
; {{tema_solene}}
{% endif %}
{% endif %}
{% endfor %}
</p>
</fieldset>

4
sapl/templates/sessao/blocos_resumo/identificacao_basica.html

@ -5,6 +5,10 @@
{% for b in basica %}
<div class="col-md-4">{{b}}</div>
{% endfor %}
{% if tema_solene %}
<br><br>
<div class="col-md-12">{{tema_solene}}</div>
{% endif %}
</div>
</fieldset>
<br /><br /><br />

9
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

59
sapl/templates/sessao/sessaoplenaria_form.html

@ -7,14 +7,11 @@
<script language="Javascript">
{% if not object %}
// faz recuperação do próximo número apenas em caso de inclusão de sessão plenária
// Seleciona o numero de acordo com o tipo
function recuperar_numero_sessao() {
var tipo = $("#id_tipo").val()
var sessao = $("#id_sessao_legislativa").val()
var legislatura = $("#id_legislatura").val()
var data_ini = $("#id_data_inicio").val()
var tipo = $("#id_tipo").val();
var sessao = $("#id_sessao_legislativa").val();
var legislatura = $("#id_legislatura").val();
var data_ini = $("#id_data_inicio").val();
if (tipo) {
$.get("{% url 'sapl.sessao:recuperar_numero_sessao_view' %}",
@ -28,18 +25,28 @@
}
);
}
else{
$("#id_numero").val('');
}
}
$("#id_tipo").click(recuperar_numero_sessao);
$("#id_sessao_legislativa").click(recuperar_numero_sessao);
$("#id_legislatura").click(recuperar_numero_sessao);
{% endif %}
function recuperar_tipo_sessao(){
var tipo = $("#id_tipo").val();
var sessao = $("#id_sessao_legislativa").val();
// Filtra as choices de sessao legislativa pela legislatura
$(function() {
$("#div_id_tema_solene").hide();
if (tipo) {
$.get("{% url 'sapl.sessao:recuperar_nome_tipo_sessao' %}",
{
tipo: tipo,
sessao_legislativa:sessao
},
function(data, status) {
if(data.nome_tipo == "Solene"){
$("#div_id_tema_solene").show();
}
}
);
}
}
function altera_legislatura(){
var id_legislatura = $("#id_legislatura").val();
@ -61,9 +68,27 @@
}
}
$("#id_legislatura").ready(altera_legislatura);
$(document).ready(function(){
{% if not object %}
// faz recuperação do próximo número apenas em caso de inclusão de sessão plenária
// Seleciona o numero de acordo com o tipo
$("#id_tipo").click(recuperar_numero_sessao);
$("#id_sessao_legislativa").click(recuperar_numero_sessao);
$("#id_legislatura").click(recuperar_numero_sessao);
{% endif %}
// Filtra as choices de sessao legislativa pela legislatura
$("#id_legislatura").ready(altera_legislatura);
$("#id_legislatura").change(altera_legislatura);
// Referente a Sessão Solene
$("#id_tipo").ready(recuperar_tipo_sessao);
$("#id_tipo").change(recuperar_tipo_sessao);
});
</script>

34
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
Loading…
Cancel
Save