diff --git a/docker-compose.yml b/docker-compose.yml
index 5ef3b240e..edc04b07e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.150
+ image: interlegis/sapl:3.1.152
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
index 1283d45ec..e41328d17 100644
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -1987,7 +1987,7 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
file_path = os.path.join(diretorio,
request.FILES['arquivo'].name)
shutil.copy2(tmp_name, file_path)
- doc.arquivo.name = file_path.split(MEDIA_ROOT)[1] # Retira MEDIA_ROOT do nome
+ doc.arquivo.name = file_path.split(MEDIA_ROOT + "/")[1] # Retira MEDIA_ROOT do nome
doc.save()
os.remove(tmp_name)
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/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..117b7a172 100755
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -23,7 +23,7 @@ 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
@@ -31,6 +31,7 @@ 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_ordem_do_dia, get_materias_ordem_do_dia,
+ get_oradores_ordemdia,
get_oradores_explicações_pessoais, get_ocorrencias_da_sessão, get_assinaturas)
from .templates import (pdf_capa_processo_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/settings.py b/sapl/settings.py
index 8bad6c92e..057e8ec75 100644
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -41,7 +41,7 @@ ALLOWED_HOSTS = ['*']
LOGIN_REDIRECT_URL = '/'
LOGIN_URL = '/login/?next='
-SAPL_VERSION = '3.1.150'
+SAPL_VERSION = '3.1.152'
if DEBUG:
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index 2fa19c1cd..3048f83b2 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -179,7 +179,7 @@
Desenvolvido pelo Interlegis em software livre e aberto.
- Release: 3.1.150
+ Release: 3.1.152
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 %}