From a8a41ea78cabfe7c1d87789bf0b6fd1dd6ab3696 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Rodrigues?=
Date: Wed, 3 Apr 2019 11:44:00 -0300
Subject: [PATCH 1/6] Fix #2403 Adiciona Oradores da Ordem do Dia (#2662)
* Adicionar oradores da ordem do dia
* Atualizar sessao/forms.py
---
.../templates/pdf_sessao_plenaria_gerar.py | 24 +++++-
sapl/relatorios/views.py | 44 +++++++++--
sapl/rules/map_rules.py | 1 +
sapl/sessao/forms.py | 55 +++++++++++++-
sapl/sessao/migrations/0034_oradorordemdia.py | 34 +++++++++
.../0035_resumoordenacao_decimo_quarto.py | 20 +++++
sapl/sessao/models.py | 9 +++
sapl/sessao/urls.py | 7 +-
sapl/sessao/views.py | 76 +++++++++++++++++--
sapl/templates/relatorios/relatorio_ata.html | 1 +
.../sessao/blocos_ata/oradores_ordemdia.html | 13 ++++
.../blocos_resumo/oradores_ordemdia.html | 15 ++++
sapl/templates/sessao/layouts.yaml | 6 ++
sapl/templates/sessao/resumo.html | 3 +
sapl/templates/sessao/resumo_ata.html | 1 +
sapl/templates/sessao/subnav.yaml | 2 +
16 files changed, 292 insertions(+), 19 deletions(-)
create mode 100644 sapl/sessao/migrations/0034_oradorordemdia.py
create mode 100644 sapl/sessao/migrations/0035_resumoordenacao_decimo_quarto.py
create mode 100644 sapl/templates/sessao/blocos_ata/oradores_ordemdia.html
create mode 100644 sapl/templates/sessao/blocos_resumo/oradores_ordemdia.html
diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
index 6a39fa1c1..4c388e59a 100644
--- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
+++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
@@ -340,6 +340,24 @@ def votacao_vot_nom(lst_votacao_vot_nom):
return tmp
+def oradores_ordemdia(lst_oradores_ordemdia):
+ """
+
+ """
+ tmp = ''
+ tmp += '\t\tOradores da Ordem do Dia\n'
+ tmp += '\t\t\n'
+ tmp += '\t\t\t
\n'
+ tmp += '\t\t\n'
+ for orador_ordemdia in lst_oradores_ordemdia:
+ tmp += '\t\t' + \
+ str(orador_ordemdia['num_ordem']) + ' - ' + \
+ orador_ordemdia['nome_parlamentar'] + '/' + \
+ str(orador_ordemdia['sigla']) + ' - ' + \
+ str(orador_ordemdia['observacao']) + '\n'
+ return tmp
+
+
def oradores(lst_oradores):
"""
@@ -374,7 +392,7 @@ def ocorrencias(lst_ocorrencias):
return tmp
-def principal(rodape_dic, imagem, inf_basicas_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, lst_ocorrencias):
+def principal(rodape_dic, imagem, inf_basicas_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):
"""
"""
arquivoPdf = str(int(time.time() * 100)) + ".pdf"
@@ -409,6 +427,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao
'v_n_mat_o_d': votacao_vot_nom(lst_votacao_vot_nom),
'mesa_d': mesa(lst_mesa),
'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)
}
@@ -428,6 +447,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao
tmp += dict_ord_template[ordenacao.decimo_primeiro]
tmp += dict_ord_template[ordenacao.decimo_segundo]
tmp += dict_ord_template[ordenacao.decimo_terceiro]
+ tmp += dict_ord_template[ordenacao.decimo_quarto]
except KeyError as e:
logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar "
"configuração de ordenação. Utilizando ordenação padrão.")
@@ -441,6 +461,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao
tmp += presenca_ordem_dia(lst_presenca_ordem_dia)
tmp += votacao(lst_votacao)
tmp += votacao_vot_nom(lst_votacao_vot_nom)
+ tmp += oradores_ordemdia(lst_oradores_ordemdia)
tmp += oradores(lst_oradores)
tmp += ocorrencias(lst_ocorrencias)
@@ -455,6 +476,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao
tmp += presenca_ordem_dia(lst_presenca_ordem_dia)
tmp += votacao(lst_votacao)
tmp += votacao_vot_nom(lst_votacao_vot_nom)
+ tmp += oradores_ordemdia(lst_oradores_ordemdia)
tmp += oradores(lst_oradores)
tmp += ocorrencias(lst_ocorrencias)
diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py
index deb1e885f..72ef64e45 100755
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -23,15 +23,16 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao,
Orador, OradorExpediente,
OrdemDia, PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, OcorrenciaSessao,
- RegistroVotacao, VotoParlamentar)
+ RegistroVotacao, VotoParlamentar, OradorOrdemDia)
from sapl.settings import STATIC_ROOT
from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data
from sapl.sessao.views import (get_identificação_basica, get_mesa_diretora,
- get_presenca_sessao, get_expedientes,
- get_materias_expediente, get_oradores_expediente,
+ get_presenca_sessao,get_expedientes,
+ get_materias_expediente,get_oradores_expediente,
get_presenca_ordem_do_dia, get_materias_ordem_do_dia,
- get_oradores_explicações_pessoais, get_ocorrencias_da_sessão, get_assinaturas)
+ get_oradores_ordemdia,
+ get_oradores_explicações_pessoais, get_ocorrencias_da_sessão)
from .templates import (pdf_capa_processo_gerar,
pdf_documento_administrativo_gerar, pdf_espelho_gerar,
@@ -780,6 +781,35 @@ def get_sessao_plenaria(sessao, casa):
}
lst_votacao_vot_nom.append(dic_votacao_vot_nom)
+ # Lista dos oradores da Ordem do Dia
+ lst_oradores_ordemdia = []
+
+ oradores_ordem_dia = OradorOrdemDia.objects.filter(
+ sessao_plenaria=sessao
+ ).order_by('numero_ordem')
+
+ for orador_ordemdia in oradores_ordem_dia:
+ parlamentar_orador = Parlamentar.objects.get(
+ id=orador_ordemdia.parlamentar.id
+ )
+
+ sigla_partido = Filiacao.objects.filter(
+ parlamentar=parlamentar_orador
+ ).first()
+
+ if not sigla_partido:
+ sigla_p = ""
+ else:
+ sigla_p = sigla_partido.partido.sigla
+
+ dic_oradores_ordemdia = {
+ 'num_ordem': orador_ordemdia.numero_ordem,
+ 'nome_parlamentar': parlamentar_orador.nome_parlamentar,
+ 'observacao': orador_ordemdia.observacao,
+ 'sigla': sigla_p
+ }
+ lst_oradores_ordemdia.append(dic_oradores_ordemdia)
+
# Lista dos oradores nas Explicações Pessoais
lst_oradores = []
for orador in Orador.objects.filter(
@@ -830,6 +860,7 @@ def get_sessao_plenaria(sessao, casa):
lst_presenca_ordem_dia,
lst_votacao,
lst_votacao_vot_nom,
+ lst_oradores_ordemdia,
lst_oradores,
lst_ocorrencias)
@@ -886,7 +917,8 @@ def relatorio_sessao_plenaria(request, pk):
lst_oradores_expediente,
lst_presenca_ordem_dia,
lst_votacao,
- lst_votacao_vot_nom,
+ lst_votacao_vot_nom,
+ lst_oradores_ordemdia,
lst_oradores,
lst_ocorrencias) = get_sessao_plenaria(sessao, casa)
@@ -910,6 +942,7 @@ def relatorio_sessao_plenaria(request, pk):
lst_presenca_ordem_dia,
lst_votacao,
lst_votacao_vot_nom,
+ lst_oradores_ordemdia,
lst_oradores,
lst_ocorrencias)
@@ -1256,6 +1289,7 @@ def resumo_ata_pdf(request,pk):
context.update(get_oradores_expediente(sessao_plenaria))
context.update(get_presenca_ordem_do_dia(sessao_plenaria))
context.update(get_materias_ordem_do_dia(sessao_plenaria))
+ context.update(get_oradores_ordemdia(sessao_plenaria))
context.update(get_oradores_explicações_pessoais(sessao_plenaria))
context.update(get_ocorrencias_da_sessão(sessao_plenaria))
context.update(get_assinaturas(sessao_plenaria))
diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py
index 13c89a547..d09e65961 100644
--- a/sapl/rules/map_rules.py
+++ b/sapl/rules/map_rules.py
@@ -175,6 +175,7 @@ rules_group_sessao = {
(sessao.ExpedienteSessao, __base__, __perms_publicas__),
(sessao.Orador, __base__, __perms_publicas__),
(sessao.OradorExpediente, __base__, __perms_publicas__),
+ (sessao.OradorOrdemDia, __base__, __perms_publicas__),
(sessao.OrdemDia, __base__, __perms_publicas__),
(sessao.PresencaOrdemDia, __base__, __perms_publicas__),
(sessao.RegistroVotacao, __base__, __perms_publicas__),
diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py
index 172b37be5..373b1e951 100644
--- a/sapl/sessao/forms.py
+++ b/sapl/sessao/forms.py
@@ -26,7 +26,7 @@ from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES,
from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia,
Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, TipoResultadoVotacao,
- OcorrenciaSessao, RetiradaPauta, TipoRetiradaPauta)
+ OcorrenciaSessao, RetiradaPauta, TipoRetiradaPauta, OradorOrdemDia)
MES_CHOICES = RANGE_MESES
@@ -45,7 +45,8 @@ ORDENACAO_RESUMO = [('cont_mult', 'Conteúdo Multimídia'),
('oradores_expli', 'Oradores das Explicações Pessoais'),
('ocorr_sessao', 'Ocorrências da Sessão'),
('v_n_mat_exp', 'Votações Nominais - Matérias do Expediente'),
- ('v_n_mat_o_d', 'Votações Nominais - Matérias da Ordem do Dia')]
+ ('v_n_mat_o_d', 'Votações Nominais - Matérias da Ordem do Dia'),
+ ('oradores_o_d', 'Oradores da Ordem do Dia')]
class SessaoPlenariaForm(FileFieldCheckMixin, ModelForm):
@@ -758,6 +759,49 @@ class OradorExpedienteForm(ModelForm):
exclude = ['sessao_plenaria']
+class OradorOrdemDiaForm(ModelForm):
+
+ def __init__(self, *args, **kwargs):
+ super(OradorOrdemDiaForm, self).__init__(*args, **kwargs)
+
+ id_sessao = int(self.initial['id_sessao'])
+
+ ids = [p.parlamentar.id for p in PresencaOrdemDia.objects.filter(
+ sessao_plenaria_id=id_sessao
+ )]
+
+ self.fields['parlamentar'].queryset = Parlamentar.objects.filter(
+ id__in=ids
+ ).order_by('nome_parlamentar')
+
+
+ def clean(self):
+ super(OradorOrdemDiaForm, self).clean()
+ cleaned_data = self.cleaned_data
+
+ if not self.is_valid():
+ return self.cleaned_data
+
+ sessao_id = self.initial['id_sessao']
+ numero = self.initial.get('numero')
+ numero_ordem = cleaned_data['numero_ordem']
+ ordem = OradorOrdemDia.objects.filter(
+ sessao_plenaria_id=sessao_id,
+ numero_ordem=numero_ordem
+ ).exists()
+
+ if ordem and numero_ordem != numero:
+ raise ValidationError(_(
+ "Já existe orador nesta posição de ordem de pronunciamento"
+ ))
+
+ return self.cleaned_data
+
+ class Meta:
+ model = OradorOrdemDia
+ exclude = ['sessao_plenaria']
+
+
class PautaSessaoFilterSet(SessaoPlenariaFilterSet):
titulo = _('Pesquisa de Pauta de Sessão')
@@ -789,6 +833,8 @@ class ResumoOrdenacaoForm(forms.Form):
choices=ORDENACAO_RESUMO)
decimo_terceiro = forms.ChoiceField(label='13°',
choices=ORDENACAO_RESUMO)
+ decimo_quarto = forms.ChoiceField(label='14°',
+ choices=ORDENACAO_RESUMO)
def __init__(self, *args, **kwargs):
super(ResumoOrdenacaoForm, self).__init__(*args, **kwargs)
@@ -819,13 +865,16 @@ class ResumoOrdenacaoForm(forms.Form):
[('decimo_segundo', 12)])
row13 = to_row(
[('decimo_terceiro', 12)])
+ row14 = to_row(
+ [('decimo_quarto', 12)]
+ )
self.helper = SaplFormHelper()
self.helper.layout = Layout(
Fieldset(_(''),
row1, row2, row3, row4, row5,
row6, row7, row8, row9, row10,
- row11, row12, row13,
+ row11, row12, row13, row14,
form_actions(label='Atualizar'))
)
diff --git a/sapl/sessao/migrations/0034_oradorordemdia.py b/sapl/sessao/migrations/0034_oradorordemdia.py
new file mode 100644
index 000000000..b0e5976fb
--- /dev/null
+++ b/sapl/sessao/migrations/0034_oradorordemdia.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.20 on 2019-03-26 16:14
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+import sapl.sessao.models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('parlamentares', '0025_auto_20180924_1724'),
+ ('sessao', '0033_auto_20190228_1803'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='OradorOrdemDia',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('numero_ordem', models.PositiveIntegerField(verbose_name='Ordem de pronunciamento')),
+ ('url_discurso', models.URLField(blank=True, max_length=150, verbose_name='URL Vídeo')),
+ ('observacao', models.CharField(blank=True, max_length=150, verbose_name='Observação')),
+ ('upload_anexo', models.FileField(blank=True, null=True, upload_to=sapl.sessao.models.anexo_upload_path, verbose_name='Anexo do Orador')),
+ ('parlamentar', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Parlamentar', verbose_name='Parlamentar')),
+ ('sessao_plenaria', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria')),
+ ],
+ options={
+ 'verbose_name_plural': 'Oradores da Ordem do Dia',
+ 'verbose_name': 'Orador da Ordem do Dia',
+ },
+ ),
+ ]
diff --git a/sapl/sessao/migrations/0035_resumoordenacao_decimo_quarto.py b/sapl/sessao/migrations/0035_resumoordenacao_decimo_quarto.py
new file mode 100644
index 000000000..f8e00489e
--- /dev/null
+++ b/sapl/sessao/migrations/0035_resumoordenacao_decimo_quarto.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.20 on 2019-03-26 18:14
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('sessao', '0034_oradorordemdia'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='resumoordenacao',
+ name='decimo_quarto',
+ field=models.CharField(default='Oradores da Ordem do Dia', max_length=30),
+ ),
+ ]
diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py
index 34ed20cca..7267e78fc 100644
--- a/sapl/sessao/models.py
+++ b/sapl/sessao/models.py
@@ -378,6 +378,14 @@ class OradorExpediente(AbstractOrador): # OradoresExpediente
verbose_name_plural = _('Oradores do Expediente')
+@reversion.register()
+class OradorOrdemDia(AbstractOrador): # OradoresOrdemDia
+
+ class Meta:
+ verbose_name = _('Orador da Ordem do Dia')
+ verbose_name_plural = _('Oradores da Ordem do Dia')
+
+
@reversion.register()
class OrdemDia(AbstractOrdemDia):
@@ -579,6 +587,7 @@ class ResumoOrdenacao(models.Model):
decimo_primeiro = models.CharField(max_length=30,default="Ocorrências da Sessão")
decimo_segundo = models.CharField(max_length=30, default="Votos Nominais Mat Expediente")
decimo_terceiro = models.CharField(max_length=30, default="Votos Nominais Mat Ordem Dia")
+ decimo_quarto = models.CharField(max_length=30, default="Oradores da Ordem do Dia")
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 ba0735ec6..00add810a 100644
--- a/sapl/sessao/urls.py
+++ b/sapl/sessao/urls.py
@@ -4,7 +4,8 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
AdicionarVariasMateriasOrdemDia, BancadaCrud,
BlocoCrud, CargoBancadaCrud,
ExpedienteMateriaCrud, ExpedienteView, JustificativaAusenciaCrud,
- OcorrenciaSessaoView, MateriaOrdemDiaCrud, MesaView, OradorCrud,
+ OcorrenciaSessaoView, MateriaOrdemDiaCrud, OradorOrdemDiaCrud,
+ MesaView, OradorCrud,
OradorExpedienteCrud, PainelView,
PautaSessaoDetailView, PautaSessaoView,
PesquisarPautaSessaoView,
@@ -44,7 +45,9 @@ urlpatterns = [
OradorExpedienteCrud.get_urls() +
ExpedienteMateriaCrud.get_urls() +
JustificativaAusenciaCrud.get_urls() +
- MateriaOrdemDiaCrud.get_urls() + RetiradaPautaCrud.get_urls())),
+ MateriaOrdemDiaCrud.get_urls() +
+ OradorOrdemDiaCrud.get_urls() +
+ RetiradaPautaCrud.get_urls())),
url(r'^sessao/(?P\d+)/mesa$', MesaView.as_view(), name='mesa'),
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
index 550b231be..08adf1fa0 100755
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -42,14 +42,14 @@ from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm,
MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet,
PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet,
SessaoPlenariaForm, VotacaoEditForm, VotacaoForm,
- VotacaoNominalForm, RetiradaPautaForm)
+ VotacaoNominalForm, RetiradaPautaForm, OradorOrdemDiaForm)
from .models import (Bancada, Bloco, CargoBancada, CargoMesa,
ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa,
MateriaLegislativa, Orador, OradorExpediente, OrdemDia,
PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao,
SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente,
TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar, TipoRetiradaPauta,
- RetiradaPauta, TipoJustificativa, JustificativaAusencia)
+ RetiradaPauta, TipoJustificativa, JustificativaAusencia, OradorOrdemDia)
TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria')
@@ -618,6 +618,31 @@ class OradorExpedienteCrud(OradorCrud):
'numero': self.object.numero_ordem}
+class OradorOrdemDiaCrud(OradorCrud):
+ model = OradorOrdemDia
+
+ class CreateView(MasterDetailCrud.CreateView):
+ form_class = OradorOrdemDiaForm
+
+ def get_initial(self):
+ return {'id_sessao': self.kwargs['pk']}
+
+ def get_success_url(self):
+ return reverse('sapl.sessao:oradorordemdia_list',
+ kwargs={'pk': self.kwargs['pk']})
+
+ class UpdateView(MasterDetailCrud.UpdateView):
+ form_class = OradorOrdemDiaForm
+
+ 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
+
+
class OradorCrud(OradorCrud):
model = Orador
@@ -1290,7 +1315,8 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView):
'decimo': ordenacao.decimo,
'decimo_primeiro': ordenacao.decimo_primeiro,
'decimo_segundo': ordenacao.decimo_segundo,
- 'decimo_terceiro': ordenacao.decimo_terceiro})
+ 'decimo_terceiro': ordenacao.decimo_terceiro,
+ 'decimo_quarto': ordenacao.decimo_quarto})
return initial
def form_valid(self, form):
@@ -1309,6 +1335,7 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView):
ordenacao.decimo_primeiro = form.cleaned_data['decimo_primeiro']
ordenacao.decimo_segundo = form.cleaned_data['decimo_segundo']
ordenacao.decimo_terceiro = form.cleaned_data['decimo_terceiro']
+ ordenacao.decimo_quarto = form.cleaned_data['decimo_quarto']
ordenacao.save()
@@ -1584,6 +1611,32 @@ def get_materias_ordem_do_dia(sessao_plenaria):
return context
+def get_oradores_ordemdia(sessao_plenaria):
+ oradores = []
+
+ oradores_ordem_dia = OradorOrdemDia.objects.filter(
+ sessao_plenaria_id=sessao_plenaria.id
+ ).order_by('numero_ordem')
+
+ for orador in oradores_ordem_dia:
+ numero_ordem = orador.numero_ordem
+ url_discurso = orador.url_discurso
+ observacao = orador.observacao
+ parlamentar = Parlamentar.objects.get(
+ id=orador.parlamentar_id
+ )
+ o = {
+ 'numero_ordem': numero_ordem,
+ 'url_discurso': url_discurso,
+ 'parlamentar': parlamentar,
+ 'observacao': observacao
+ }
+ oradores.append(o)
+
+ context = {'oradores_ordemdia': oradores}
+ return context
+
+
def get_oradores_explicações_pessoais(sessao_plenaria):
oradores_explicacoes = []
for orador in Orador.objects.filter(
@@ -1698,6 +1751,9 @@ class ResumoView(DetailView):
context.update(get_materias_ordem_do_dia(self.object))
# =====================================================================
+ # Oradores Ordem do Dia
+ context.update(get_oradores_ordemdia(self.object))
+ # =====================================================================
# Oradores nas Explicações Pessoais
context.update(get_oradores_explicações_pessoais(self.object))
# =====================================================================
@@ -1718,6 +1774,7 @@ class ResumoView(DetailView):
'v_n_mat_o_d': 'votos_nominais_materias_ordem_dia.html',
'mesa_d': 'mesa_diretora.html',
'oradores_exped': 'oradores_expediente.html',
+ 'oradores_o_d': 'oradores_ordemdia.html',
'oradores_expli': 'oradores_explicacoes.html',
'ocorr_sessao': 'ocorrencias_da_sessao.html'
}
@@ -1737,7 +1794,8 @@ class ResumoView(DetailView):
'decimo_ordenacao': dict_ord_template[ordenacao.decimo],
'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_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro],
+ 'decimo_quarto_ordenacao': dict_ord_template[ordenacao.decimo_quarto]})
except KeyError as e:
self.logger.error('user=' + self.request.user.username + '. ' + "KeyError: " + str(e) + ". Erro "
"ao tentar utilizar configuração de ordenação. Utilizando ordenação padrão.")
@@ -1753,8 +1811,9 @@ class ResumoView(DetailView):
'nono_ordenacao': dict_ord_template['lista_p_o_d'],
'decimo_ordenacao': dict_ord_template['mat_o_d'],
'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'],
- 'decimo_segundo_ordenacao': dict_ord_template['oradores_expli'],
- 'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao']
+ 'decimo_segundo_ordenacao': dict_ord_template['oradores_o_d'],
+ 'decimo_terceiro_ordenacao': dict_ord_template['oradores_expli'],
+ 'decimo_quarto_ordenacao': dict_ord_template['ocorr_sessao']
})
else:
context.update(
@@ -1769,8 +1828,9 @@ class ResumoView(DetailView):
'nono_ordenacao': dict_ord_template['lista_p_o_d'],
'decimo_ordenacao': dict_ord_template['mat_o_d'],
'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'],
- 'decimo_segundo_ordenacao': dict_ord_template['oradores_expli'],
- 'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao']
+ 'decimo_segundo_ordenacao': dict_ord_template['oradores_o_d'],
+ 'decimo_terceiro_ordenacao': dict_ord_template['oradores_expli'],
+ 'decimo_quarto_ordenacao': dict_ord_template['ocorr_sessao']
})
return context
diff --git a/sapl/templates/relatorios/relatorio_ata.html b/sapl/templates/relatorios/relatorio_ata.html
index 7d6c45d7b..05c5355c4 100644
--- a/sapl/templates/relatorios/relatorio_ata.html
+++ b/sapl/templates/relatorios/relatorio_ata.html
@@ -46,6 +46,7 @@
{% include 'sessao/blocos_ata/oradores_expediente.html' %}
{% include 'sessao/blocos_ata/lista_presenca_ordem_dia.html' %}
{% include 'sessao/blocos_ata/materias_ordem_dia.html' %}
+ {% include 'sessao/blocos_ata/oradores_ordemdia.html' %}
{% include 'sessao/blocos_ata/oradores_explicacoes.html' %}
{% include 'sessao/blocos_ata/ocorrencias_da_sessao.html' %}
diff --git a/sapl/templates/sessao/blocos_ata/oradores_ordemdia.html b/sapl/templates/sessao/blocos_ata/oradores_ordemdia.html
new file mode 100644
index 000000000..62ec92e81
--- /dev/null
+++ b/sapl/templates/sessao/blocos_ata/oradores_ordemdia.html
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/sapl/templates/sessao/blocos_resumo/oradores_ordemdia.html b/sapl/templates/sessao/blocos_resumo/oradores_ordemdia.html
new file mode 100644
index 000000000..a1898cce0
--- /dev/null
+++ b/sapl/templates/sessao/blocos_resumo/oradores_ordemdia.html
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml
index 55e0db570..98307d74d 100644
--- a/sapl/templates/sessao/layouts.yaml
+++ b/sapl/templates/sessao/layouts.yaml
@@ -39,6 +39,12 @@ OradorExpediente:
- url_discurso observacao
- upload_anexo
+OradorOrdemDia:
+ {% trans 'Orador da Ordem do Dia' %}:
+ - numero_ordem parlamentar
+ - url_discurso observacao
+ - upload_anexo
+
ExpedienteMateria:
{% trans 'Matéria do Expediente' %}:
- data_ordem numero_ordem
diff --git a/sapl/templates/sessao/resumo.html b/sapl/templates/sessao/resumo.html
index bcedeedb8..0be605eb8 100644
--- a/sapl/templates/sessao/resumo.html
+++ b/sapl/templates/sessao/resumo.html
@@ -58,5 +58,8 @@
{% include 'sessao/blocos_resumo/'|add:decimo_terceiro_ordenacao %}
+
+ {% include 'sessao/blocos_resumo/'|add:decimo_quarto_ordenacao %}
+
{% endblock detail_content %}
diff --git a/sapl/templates/sessao/resumo_ata.html b/sapl/templates/sessao/resumo_ata.html
index 12507b79a..2f450b97e 100644
--- a/sapl/templates/sessao/resumo_ata.html
+++ b/sapl/templates/sessao/resumo_ata.html
@@ -32,5 +32,6 @@
{% include 'sessao/blocos_ata/'|add:decimo_primeiro_ordenacao %}
{% 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/assinaturas.html' %}
{% endblock detail_content %}
diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml
index 1decc0ded..28717e4ab 100644
--- a/sapl/templates/sessao/subnav.yaml
+++ b/sapl/templates/sessao/subnav.yaml
@@ -35,6 +35,8 @@
url: ordemdia_list
- title: {% trans 'Presença Ordem do Dia' %}
url: presencaordemdia
+ - title: {% trans 'Oradores da Ordem do Dia' %}
+ url: oradorordemdia_list
- title: {% trans 'Votação em Bloco' %}
url: votacao_bloco_ordemdia
check_permission: sessao.add_sessaoplenaria
From 9405129d1874b01ac3e4874341d261f57ae62fd0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vin=C3=ADcius=20Cantu=C3=A1ria?=
Date: Wed, 3 Apr 2019 11:39:09 -0300
Subject: [PATCH 2/6] =?UTF-8?q?Separa=20cria=C3=A7=C3=A3o=20de=20mandato?=
=?UTF-8?q?=20e=20parlamentar=20(#2579)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fix #2536
Adiciona cadastro de parlamentar na tabelas auxiliares
Remoção de mandato na criação do parlamentar
Corrige testes
Corrige título no CRUD de parlamentar
Corrige identação
Adiciona botão de criação de parlamentar após pesquisa
Corrige botões em parlamentares
Altera nomes
Remove intermediário para vinculação de parlamentar
Arruma bug
Altera redirecionamento para detales de parlamentar
Início da criação do form e view de vincular parlamentar
Corrige VincularParlamentarForm
Corrige VincularParlamentarView
Adiciona html de vincular parlamentar
Mostrar somente parlamentares ativos
Cria variável data_expedicao_diploma
Compara mandato por legislatura invés de data
Corrige verificação de existencia de chave no dicionário
Adiciona data fim do mandato na criação do mandato
Adiciona restrição para usuário não logado
Co-authored-by: UlyssesBML
Co-authored-by: Ricardo Lima Canela
---
sapl/parlamentares/forms.py | 62 +++++++++++++++++++
sapl/parlamentares/urls.py | 5 +-
sapl/parlamentares/views.py | 30 ++++++++-
sapl/templates/parlamentares/layouts.yaml | 8 +--
.../parlamentares/parlamentar_filter.html | 44 ++++++-------
.../parlamentares/parlamentares_list.html | 9 +++
.../parlamentares/vincular_parlamentar.html | 8 +++
7 files changed, 137 insertions(+), 29 deletions(-)
create mode 100644 sapl/templates/parlamentares/vincular_parlamentar.html
diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py
index c9d5d828d..e1e773d9b 100755
--- a/sapl/parlamentares/forms.py
+++ b/sapl/parlamentares/forms.py
@@ -525,3 +525,65 @@ class VotanteForm(ModelForm):
votante.user = u
votante.save()
return votante
+
+
+class VincularParlamentarForm(forms.Form):
+ logger = logging.getLogger(__name__)
+
+ parlamentar = forms.ModelChoiceField(
+ label=Parlamentar._meta.verbose_name,
+ queryset=Parlamentar.objects.filter(ativo=True),
+ required=True,
+ empty_label='Selecione'
+ )
+
+ legislatura = forms.ModelChoiceField(
+ label=Legislatura._meta.verbose_name,
+ queryset=Legislatura.objects.all(),
+ required=True,
+ empty_label='Selecione'
+ )
+
+ data_expedicao_diploma = forms.DateField(
+ label='Data de Expedição do Diploma',
+ required=False,
+ widget=forms.DateInput(format='%d/%m/%Y')
+ )
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+
+ row1 = to_row([
+ ('parlamentar', 6),
+ ('legislatura', 3),
+ ('data_expedicao_diploma', 3)
+ ])
+
+ self.helper = SaplFormHelper()
+ self.helper.layout = Layout(
+ Fieldset(
+ 'Vincular Parlamentar',
+ row1,
+ form_actions(label='Vincular')
+ )
+ )
+
+ def clean(self):
+ super().clean()
+
+ if not self.is_valid():
+ return self.cleaned_data
+
+ cleaned_data = self.cleaned_data
+ parlamentar = cleaned_data['parlamentar']
+ legislatura = cleaned_data['legislatura']
+ data_expedicao_diploma = cleaned_data['data_expedicao_diploma']
+
+ if parlamentar.mandato_set.filter(legislatura=legislatura):
+ self.logger.error('Parlamentar já está vinculado a legislatura informada.')
+ raise ValidationError(_('Parlamentar já está vinculado a legislatura informada.'))
+ elif data_expedicao_diploma and legislatura.data_inicio <= data_expedicao_diploma:
+ self.logger.error('Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.')
+ raise ValidationError(_('Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.'))
+
+ return cleaned_data
diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py
index 668a65653..51fb856b4 100644
--- a/sapl/parlamentares/urls.py
+++ b/sapl/parlamentares/urls.py
@@ -19,7 +19,7 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
parlamentares_frente_selected,
remove_parlamentar_composicao,
parlamentares_filiados,
- PesquisarParlamentarView)
+ PesquisarParlamentarView, VincularParlamentarView)
from .apps import AppConfig
@@ -41,6 +41,9 @@ urlpatterns = [
url(r'^parlamentar/(?P\d+)/materias$',
ParlamentarMateriasView.as_view(), name='parlamentar_materias'),
+ url(r'^parlamentar/vincular-parlamentar/$',
+ VincularParlamentarView.as_view(), name='vincular_parlamentar'),
+
url(r'^sistema/coligacao/',
include(ColigacaoCrud.get_urls() +
ComposicaoColigacaoCrud.get_urls())),
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
index 772f06eaa..d5e8cc41a 100644
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -3,6 +3,7 @@ import json
import logging
from django.contrib import messages
+from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
from django.core.urlresolvers import reverse, reverse_lazy
@@ -33,7 +34,7 @@ from sapl.parlamentares.apps import AppConfig
from sapl.utils import (parlamentares_ativos, show_results_filter_set)
from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm,
- ParlamentarCreateForm, ParlamentarForm, VotanteForm, ParlamentarFilterSet)
+ ParlamentarCreateForm, ParlamentarForm, VotanteForm, ParlamentarFilterSet, VincularParlamentarForm)
from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
Dependente, Filiacao, Frente, Legislatura, Mandato,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
@@ -1132,3 +1133,30 @@ def altera_field_mesa_public_view(request):
'lista_fotos': lista_fotos,
'sessao_selecionada': sessao_selecionada,
'msg': ('', 1)})
+
+
+class VincularParlamentarView(PermissionRequiredMixin, FormView):
+ logger = logging.getLogger(__name__)
+ form_class = VincularParlamentarForm
+ template_name = 'parlamentares/vincular_parlamentar.html'
+ permission_required = ('parlamentares.add_parlamentar', )
+
+ def get_success_url(self):
+ return reverse('sapl.parlamentares:parlamentar_list')
+
+ def form_valid(self, form):
+ kwargs = {
+ 'parlamentar': form.cleaned_data['parlamentar'],
+ 'legislatura': form.cleaned_data['legislatura'],
+ 'data_inicio_mandato': form.cleaned_data['legislatura'].data_inicio,
+ 'data_fim_mandato': form.cleaned_data['legislatura'].data_fim
+ }
+
+ data_expedicao_diploma = form.cleaned_data.get('data_expedicao_diploma')
+ if data_expedicao_diploma:
+ kwargs.update({'data_expedicao_diploma': data_expedicao_diploma})
+
+ mandato = Mandato.objects.create(**kwargs)
+ mandato.save()
+
+ return HttpResponseRedirect(self.get_success_url())
diff --git a/sapl/templates/parlamentares/layouts.yaml b/sapl/templates/parlamentares/layouts.yaml
index ded7ca647..030e32758 100644
--- a/sapl/templates/parlamentares/layouts.yaml
+++ b/sapl/templates/parlamentares/layouts.yaml
@@ -30,7 +30,7 @@ SessaoLegislativa:
- data_inicio_intervalo data_fim_intervalo
Parlamentar:
- {% trans 'Cadastro do Parlamentar' %}:
+ {% trans 'Dados do Parlamentar' %}:
- nome_parlamentar:8 ativo
- nome_completo
- nivel_instrucao sexo data_nascimento
@@ -47,7 +47,7 @@ Parlamentar:
- biografia
ParlamentarUpdate:
- {% trans 'Cadastro do Parlamentar' %}:
+ {% trans 'Dados do Parlamentar' %}:
- nome_parlamentar:8 ativo
- nome_completo
- nivel_instrucao sexo data_nascimento
@@ -64,9 +64,7 @@ ParlamentarUpdate:
- biografia
ParlamentarCreate:
- {% trans 'Dados do Mandato' %}:
- - legislatura data_expedicao_diploma
- {% trans 'Cadastro do Parlamentar' %}:
+ {% trans 'Dados do Parlamentar' %}:
- nome_parlamentar:8 ativo
- nome_completo
- nivel_instrucao sexo data_nascimento
diff --git a/sapl/templates/parlamentares/parlamentar_filter.html b/sapl/templates/parlamentares/parlamentar_filter.html
index 9a3ea54f7..dd6af7034 100644
--- a/sapl/templates/parlamentares/parlamentar_filter.html
+++ b/sapl/templates/parlamentares/parlamentar_filter.html
@@ -5,44 +5,44 @@
{% block base_content %}
{% if not show_results %}
{% crispy filter.form %}
- {% endif %}
-
- {% if show_results %}
-
+
{% if numero_res > 0 %}
{% if numero_res == 1 %}
Foi encontrado {{ numero_res }} resultado
{% else %}
Foram encontrados {{ numero_res }} resultados
{% endif %}
-
-
-
- | Nome do Parlamentar |
+
+
+
+ | Nome do Parlamentar |
Nome Completo |
Ativo |
-
-
-
- {% for usuario in page_obj %}
-
- |
+ |
+
+
+ {% for usuario in page_obj %}
+
+ |
{{usuario.nome_parlamentar}}
|
{{ usuario.nome_completo }} |
{% if usuario.ativo %} Sim {% else %} Não {% endif %} |
-
- {% endfor %}
-
-
+
+ {% endfor %}
+
+
{% else %}
{{ NO_ENTRIES_MSG }}
- {% endif %}
+ {% endif %}
{% endif %}
-
{% include 'paginacao.html'%}
diff --git a/sapl/templates/parlamentares/parlamentares_list.html b/sapl/templates/parlamentares/parlamentares_list.html
index 88ad4acfe..a91d50da9 100644
--- a/sapl/templates/parlamentares/parlamentares_list.html
+++ b/sapl/templates/parlamentares/parlamentares_list.html
@@ -1,6 +1,15 @@
{% extends "crud/list.html" %}
{% load i18n %}
{% load crispy_forms_tags cropping%}
+{% block actions %}
+
+{% endblock actions %}
{% block extra_content %}