' + str(votacao['num_ordem']) + ' - ' + \
+ votacao["tipo_materia"] + ' No. ' + \
+ str(votacao['id_materia']) + ' \n' + 'Processo: ' + \
+ str(votacao['des_numeracao']) + ' \n' + 'Turno: ' + \
+ str(votacao['des_turno']) + ' \n' + 'Autor: ' + \
+ str(votacao['nom_autor']) + ' \n'
tmp += '' + \
str(votacao['txt_ementa']) + ' \n'
tmp += '' + \
diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py
index 2f48f627f..cfbf784eb 100644
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -1061,6 +1061,7 @@ def get_pauta_sessao(sessao, casa):
id=expediente_materia.materia.id).first()
dic_expediente_materia = {}
+ dic_expediente_materia["tipo_materia"] = materia.tipo.sigla + ' - ' + materia.tipo.descricao
dic_expediente_materia["num_ordem"] = str(
expediente_materia.numero_ordem)
dic_expediente_materia["id_materia"] = str(
@@ -1113,6 +1114,7 @@ def get_pauta_sessao(sessao, casa):
id=votacao.materia.id).first()
dic_votacao = {}
+ dic_votacao["tipo_materia"] = materia.tipo.sigla + ' - ' + materia.tipo.descricao
dic_votacao["num_ordem"] = votacao.numero_ordem
dic_votacao["id_materia"] = str(
materia.numero) + "/" + str(materia.ano)
From 59d6bcd76ba7bcccc0219a8e3c2dc2776e24f221 Mon Sep 17 00:00:00 2001
From: VictorFabreF
Date: Tue, 16 Oct 2018 09:23:09 -0300
Subject: [PATCH 34/50] Release: 3.1.125
---
docker-compose.yml | 2 +-
setup.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index dc3c58dfd..0ead1dd69 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.124
+ image: interlegis/sapl:3.1.125
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/setup.py b/setup.py
index 0b7838be2..b94e66bb0 100644
--- a/setup.py
+++ b/setup.py
@@ -49,7 +49,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
- version='3.1.124',
+ version='3.1.125',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',
From 5e6ecde9da49e2e4aecccb4565ace8a257be1b00 Mon Sep 17 00:00:00 2001
From: VictorFabreF
Date: Tue, 16 Oct 2018 11:54:23 -0300
Subject: [PATCH 35/50] bump release version
---
sapl/templates/base.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index b93260845..b148e3463 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -184,7 +184,7 @@
Desenvolvido pelo Interlegis em software livre e aberto.
- Release: 3.1.124
+ Release: 3.1.125
From 338c0c7b7ded217758069ab716e20f3b7a7e42f6 Mon Sep 17 00:00:00 2001
From: VictorFabreF
Date: Tue, 16 Oct 2018 12:06:54 -0300
Subject: [PATCH 36/50] Atualiza script para gerar release
---
release.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/release.sh b/release.sh
index 958e91b21..d8301aafe 100755
--- a/release.sh
+++ b/release.sh
@@ -21,7 +21,7 @@ function bump_version {
function commit_and_push {
echo "committing..."
- git add docker-compose.yml setup.py
+ git add docker-compose.yml setup.py sapl/templates/base.html
git commit -m "Release: $NEXT_VERSION"
git tag $NEXT_VERSION
From e877aa6248dec36458e77279c5551746fe0a5f2f Mon Sep 17 00:00:00 2001
From: Edward
Date: Tue, 16 Oct 2018 13:36:29 -0300
Subject: [PATCH 37/50] Fixes #2302 (#2303)
---
sapl/materia/views.py | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
index 767726a97..e3d62c2bf 100644
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -481,10 +481,13 @@ class ReceberProposicao(PermissionRequiredForAppCrudMixin, FormView):
form = ReceberProposicaoForm(request.POST)
if form.is_valid():
- proposicoes = Proposicao.objects.filter(
- data_envio__isnull=False, data_recebimento__isnull=True)
+ try:
+ # A ultima parte do código deve ser a pk da Proposicao
+ id = form.cleaned_data["cod_hash"].split("/")[1]
+ proposicao = Proposicao.objects.get(id=id,
+ data_envio__isnull=False,
+ data_recebimento__isnull=True)
- for proposicao in proposicoes:
if proposicao.texto_articulado.exists():
ta = proposicao.texto_articulado.first()
# FIXME hash para textos articulados
@@ -492,7 +495,7 @@ class ReceberProposicao(PermissionRequiredForAppCrudMixin, FormView):
else:
hasher = gerar_hash_arquivo(
proposicao.texto_original.path,
- str(proposicao.pk)) \
+ str(proposicao.id)) \
if proposicao.texto_original else None
if hasher == form.cleaned_data['cod_hash']:
return HttpResponseRedirect(
@@ -500,8 +503,12 @@ class ReceberProposicao(PermissionRequiredForAppCrudMixin, FormView):
kwargs={
'hash': hasher.split('/')[0][1:],
'pk': proposicao.pk}))
-
- messages.error(request, _('Proposição não encontrada!'))
+ except ObjectDoesNotExist:
+ messages.error(request, _('Proposição não encontrada!'))
+ except IndexError:
+ messages.error(request, _('Código de recibo mal formado!'))
+ except IOError:
+ messages.error(request, _('Erro abrindo texto original de proposição'))
return self.form_invalid(form)
def get_success_url(self):
From 2e4cce7b58613726be06f8ff116ff8abc369af9d Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Tue, 16 Oct 2018 13:39:16 -0300
Subject: [PATCH 38/50] Release: 3.1.126
---
docker-compose.yml | 2 +-
sapl/templates/base.html | 2 +-
setup.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index 0ead1dd69..5f0d9c6fa 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.125
+ image: interlegis/sapl:3.1.126
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index b148e3463..7e071d372 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -184,7 +184,7 @@
Desenvolvido pelo Interlegis em software livre e aberto.
- Release: 3.1.125
+ Release: 3.1.126
diff --git a/setup.py b/setup.py
index b94e66bb0..9f5b99a69 100644
--- a/setup.py
+++ b/setup.py
@@ -49,7 +49,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
- version='3.1.125',
+ version='3.1.126',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',
From 9510d896d30a994e649d693b37deef3764c49eac Mon Sep 17 00:00:00 2001
From: Edward
Date: Tue, 16 Oct 2018 14:08:15 -0300
Subject: [PATCH 39/50] Fixes #2305 (#2306)
---
.../materia/materialegislativa_detail.html | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/sapl/templates/materia/materialegislativa_detail.html b/sapl/templates/materia/materialegislativa_detail.html
index 0a5f06259..f2c986fd5 100644
--- a/sapl/templates/materia/materialegislativa_detail.html
+++ b/sapl/templates/materia/materialegislativa_detail.html
@@ -10,6 +10,21 @@
{% endblock sub_actions %}
{% block detail_content %}
{{ block.super }}
+ {% if object.registrovotacao_set.exists %}
+ Data Votação:
+ {% for rv in object.registrovotacao_set.all %}
+ {% if rv.ordem %}
+
+ {{ rv.ordem.sessao_plenaria.data_inicio }}
+
+ {% elif rv.expediente %}
+
+ {{ rv.expediente.sessao_plenaria.data_inicio }}
+
+ {% endif %}
+
+ {% endfor %}
+ {% endif %}
{% if object.normajuridica_set.last %}
Norma Jurídica Relacionada
From 860d755d63250c2b0c925d3092e95b24d75eec23 Mon Sep 17 00:00:00 2001
From: Edward
Date: Wed, 17 Oct 2018 13:53:23 -0300
Subject: [PATCH 40/50] Fixes #2310 (#2311)
---
sapl/audiencia/views.py | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/sapl/audiencia/views.py b/sapl/audiencia/views.py
index c999cf4ff..fa9084520 100644
--- a/sapl/audiencia/views.py
+++ b/sapl/audiencia/views.py
@@ -1,4 +1,5 @@
from django.http import HttpResponse
+from django.core.urlresolvers import reverse
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.generic import UpdateView
from sapl.crud.base import RP_DETAIL, RP_LIST, Crud
@@ -23,6 +24,22 @@ class AudienciaCrud(Crud):
class ListView(Crud.ListView):
paginate_by = 10
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+
+ audiencia_materia = {}
+ for o in context['object_list']:
+ audiencia_materia[str(o.id)] = o.materia
+
+ for row in context['rows']:
+ coluna_materia = row[3] # se mudar a ordem de listagem mudar aqui
+ if coluna_materia[0]:
+ materia = audiencia_materia[row[0][0]]
+ url_materia = reverse('sapl.materia:materialegislativa_detail',
+ kwargs={'pk': materia.id})
+ row[3] = (coluna_materia[0], url_materia)
+ return context
+
class CreateView(Crud.CreateView):
form_class = AudienciaForm
From 29f105dc84b60701ceed5dc5b52d3868e18ec2c8 Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Wed, 17 Oct 2018 14:08:14 -0300
Subject: [PATCH 41/50] Release: 3.1.127
---
docker-compose.yml | 2 +-
sapl/templates/base.html | 2 +-
setup.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index 5f0d9c6fa..db9019eba 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.126
+ image: interlegis/sapl:3.1.127
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index 7e071d372..d8644b046 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -184,7 +184,7 @@
Desenvolvido pelo Interlegis em software livre e aberto.
- Release: 3.1.126
+ Release: 3.1.127
diff --git a/setup.py b/setup.py
index 9f5b99a69..50895497c 100644
--- a/setup.py
+++ b/setup.py
@@ -49,7 +49,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
- version='3.1.126',
+ version='3.1.127',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',
From 5b8a9d35f9e5d76bf8a020b01c5408617c749a54 Mon Sep 17 00:00:00 2001
From: Talitha Pumar
Date: Wed, 17 Oct 2018 14:42:35 -0300
Subject: [PATCH 42/50] =?UTF-8?q?Cascade=20Sess=C3=A3o=20Plenaria=20(#2312?=
=?UTF-8?q?)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* first
* add testes
* add migrations
* fix testes
* Update sapl/sessao/tests/test_sessao.py
* Update test_sessao.py
* Update test_sessao.py
---
.../migrations/0026_auto_20181016_1944.py | 66 +++++++++
sapl/sessao/models.py | 24 ++--
sapl/sessao/tests/test_sessao.py | 132 +++++++++++++++++-
3 files changed, 206 insertions(+), 16 deletions(-)
create mode 100644 sapl/sessao/migrations/0026_auto_20181016_1944.py
diff --git a/sapl/sessao/migrations/0026_auto_20181016_1944.py b/sapl/sessao/migrations/0026_auto_20181016_1944.py
new file mode 100644
index 000000000..97ae02603
--- /dev/null
+++ b/sapl/sessao/migrations/0026_auto_20181016_1944.py
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.13 on 2018-10-16 22:44
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('sessao', '0025_auto_20180919_1116'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='expedientesessao',
+ name='sessao_plenaria',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'),
+ ),
+ migrations.AlterField(
+ model_name='integrantemesa',
+ name='sessao_plenaria',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'),
+ ),
+ migrations.AlterField(
+ model_name='orador',
+ name='sessao_plenaria',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'),
+ ),
+ migrations.AlterField(
+ model_name='oradorexpediente',
+ name='sessao_plenaria',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'),
+ ),
+ migrations.AlterField(
+ model_name='presencaordemdia',
+ name='sessao_plenaria',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'),
+ ),
+ migrations.AlterField(
+ model_name='registrovotacao',
+ name='expediente',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.ExpedienteMateria'),
+ ),
+ migrations.AlterField(
+ model_name='registrovotacao',
+ name='materia',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='materia.MateriaLegislativa'),
+ ),
+ migrations.AlterField(
+ model_name='registrovotacao',
+ name='ordem',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.OrdemDia'),
+ ),
+ migrations.AlterField(
+ model_name='sessaoplenaria',
+ name='sessao_legislativa',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.SessaoLegislativa', verbose_name='Sessão Legislativa'),
+ ),
+ migrations.AlterField(
+ model_name='sessaoplenariapresenca',
+ name='sessao_plenaria',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria'),
+ ),
+ ]
diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py
index 7f8ea0882..824d9ad2d 100644
--- a/sapl/sessao/models.py
+++ b/sapl/sessao/models.py
@@ -121,7 +121,7 @@ class SessaoPlenaria(models.Model):
verbose_name=_('Tipo'))
sessao_legislativa = models.ForeignKey(
SessaoLegislativa,
- on_delete=models.PROTECT,
+ on_delete=models.CASCADE,
verbose_name=_('Sessão Legislativa'))
legislatura = models.ForeignKey(Legislatura,
on_delete=models.PROTECT,
@@ -288,7 +288,7 @@ class TipoExpediente(models.Model):
@reversion.register()
class ExpedienteSessao(models.Model): # ExpedienteSessaoPlenaria
sessao_plenaria = models.ForeignKey(SessaoPlenaria,
- on_delete=models.PROTECT)
+ on_delete=models.CASCADE)
tipo = models.ForeignKey(TipoExpediente, on_delete=models.PROTECT)
conteudo = models.TextField(
blank=True, verbose_name=_('Conteúdo do expediente'))
@@ -319,7 +319,7 @@ class OcorrenciaSessao(models.Model): # OcorrenciaSessaoPlenaria
@reversion.register()
class IntegranteMesa(models.Model): # MesaSessaoPlenaria
sessao_plenaria = models.ForeignKey(SessaoPlenaria,
- on_delete=models.PROTECT)
+ on_delete=models.CASCADE)
cargo = models.ForeignKey(CargoMesa, on_delete=models.PROTECT)
parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT)
@@ -334,7 +334,7 @@ class IntegranteMesa(models.Model): # MesaSessaoPlenaria
@reversion.register()
class AbstractOrador(models.Model): # Oradores
sessao_plenaria = models.ForeignKey(SessaoPlenaria,
- on_delete=models.PROTECT)
+ on_delete=models.CASCADE)
parlamentar = models.ForeignKey(Parlamentar,
on_delete=models.PROTECT,
verbose_name=_('Parlamentar'))
@@ -387,7 +387,7 @@ class OrdemDia(AbstractOrdemDia):
@reversion.register()
class PresencaOrdemDia(models.Model): # OrdemDiaPresenca
sessao_plenaria = models.ForeignKey(SessaoPlenaria,
- on_delete=models.PROTECT)
+ on_delete=models.CASCADE)
parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT)
class Meta:
@@ -427,15 +427,15 @@ class RegistroVotacao(models.Model):
TipoResultadoVotacao,
on_delete=models.PROTECT,
verbose_name=_('Resultado da Votação'))
- materia = models.ForeignKey(MateriaLegislativa, on_delete=models.PROTECT)
+ materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE)
ordem = models.ForeignKey(OrdemDia,
blank=True,
null=True,
- on_delete=models.PROTECT)
+ on_delete=models.CASCADE)
expediente = models.ForeignKey(ExpedienteMateria,
blank=True,
null=True,
- on_delete=models.PROTECT)
+ on_delete=models.CASCADE)
numero_votos_sim = models.PositiveIntegerField(verbose_name=_('Sim'))
numero_votos_nao = models.PositiveIntegerField(verbose_name=_('Não'))
numero_abstencoes = models.PositiveIntegerField(
@@ -476,7 +476,7 @@ class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar
'''
votacao = models.ForeignKey(RegistroVotacao,
blank=True,
- null=True)
+ null=True,on_delete=models.CASCADE)
parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT)
voto = models.CharField(max_length=10)
@@ -496,10 +496,10 @@ class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar
ordem = models.ForeignKey(OrdemDia,
blank=True,
- null=True)
+ null=True, on_delete=models.CASCADE)
expediente = models.ForeignKey(ExpedienteMateria,
blank=True,
- null=True)
+ null=True, on_delete=models.CASCADE)
class Meta:
verbose_name = _('Registro de Votação de Parlamentar')
@@ -513,7 +513,7 @@ class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar
@reversion.register()
class SessaoPlenariaPresenca(models.Model):
sessao_plenaria = models.ForeignKey(SessaoPlenaria,
- on_delete=models.PROTECT)
+ on_delete=models.CASCADE)
parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT)
data_sessao = models.DateField(blank=True, null=True)
diff --git a/sapl/sessao/tests/test_sessao.py b/sapl/sessao/tests/test_sessao.py
index c1af4fc7e..3ed1e47f6 100644
--- a/sapl/sessao/tests/test_sessao.py
+++ b/sapl/sessao/tests/test_sessao.py
@@ -5,11 +5,14 @@ from django.utils.translation import ugettext_lazy as _
from model_mommy import mommy
from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
-from sapl.parlamentares.models import Legislatura, Partido, SessaoLegislativa
+from sapl.parlamentares.models import Legislatura, Parlamentar, Partido,SessaoLegislativa
from sapl.sessao import forms
-from sapl.sessao.models import (ExpedienteMateria, OrdemDia, RegistroVotacao,
- SessaoPlenaria, TipoSessaoPlenaria)
-
+from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao,
+ IntegranteMesa, Orador, OrdemDia,
+ PresencaOrdemDia, RegistroVotacao,
+ SessaoPlenaria, SessaoPlenariaPresenca,
+ TipoResultadoVotacao, TipoSessaoPlenaria,
+ VotoParlamentar)
def test_valida_campos_obrigatorios_sessao_plenaria_form():
form = forms.SessaoPlenariaForm(data={})
@@ -170,3 +173,124 @@ def test_registro_votacao_tem_ordem_xor_expediente():
# a validação NÃO funciona quando ambos são preenchidos
with pytest.raises(ValidationError):
registro_votacao_com(ordem, expediente).full_clean()
+
+def create_sessao_plenaria():
+ legislatura = mommy.make(Legislatura)
+ sessao = mommy.make(SessaoLegislativa)
+ tipo = mommy.make(TipoSessaoPlenaria)
+ return mommy.make(SessaoPlenaria,
+ legislatura=legislatura,
+ sessao_legislativa=sessao,
+ tipo=tipo,
+ numero=1)
+
+def create_materia_legislativa():
+ tipo_materia = mommy.make(TipoMateriaLegislativa)
+ return mommy.make(MateriaLegislativa, tipo=tipo_materia)
+
+@pytest.mark.django_db(transaction=False)
+def test_delete_sessao_plenaria_cascade_registro_votacao_ordemdia():
+ materia = create_materia_legislativa()
+ sessao_plenaria = create_sessao_plenaria()
+ ordem = mommy.make(OrdemDia,
+ sessao_plenaria=sessao_plenaria,
+ materia=materia,
+ tipo_votacao='2')
+ tipo_resultado_votacao = mommy.make(TipoResultadoVotacao,
+ nome='ok',
+ natureza="A")
+ registro = mommy.make(RegistroVotacao,
+ tipo_resultado_votacao=tipo_resultado_votacao,
+ materia=materia,
+ ordem=ordem)
+ presenca = mommy.make(PresencaOrdemDia,
+ sessao_plenaria=sessao_plenaria)
+ parlamentar = mommy.make(Parlamentar)
+ voto_parlamentar = mommy.make(VotoParlamentar,
+ votacao=registro,
+ parlamentar=parlamentar,
+ ordem=ordem)
+ sessao_plenaria.delete()
+ presenca_filter = PresencaOrdemDia.objects.filter(
+ sessao_plenaria=sessao_plenaria).exists()
+ ordem_filter = OrdemDia.objects.filter(
+ sessao_plenaria=sessao_plenaria).exists()
+ registro_filter = RegistroVotacao.objects.filter(
+ tipo_resultado_votacao=tipo_resultado_votacao,
+ materia=materia,
+ ordem=ordem).exists()
+ materia_filter = MateriaLegislativa.objects.filter(id=materia.id).exists()
+ parlamentar_filter = Parlamentar.objects.exists()
+ voto_parlamentar_filter = VotoParlamentar.objects.filter(
+ ordem=ordem).exists()
+ assert not registro_filter
+ assert not ordem_filter
+ assert not presenca_filter
+ assert not voto_parlamentar_filter
+ assert materia_filter # Não exclui materia
+ assert parlamentar_filter # Não exclui Parlamentar
+
+@pytest.mark.django_db(transaction=False)
+def test_delete_sessao_plenaria_cascade_registro_votacao_expediente():
+ materia = create_materia_legislativa()
+ sessao_plenaria = create_sessao_plenaria()
+ expediente = mommy.make(ExpedienteMateria,
+ sessao_plenaria=sessao_plenaria,
+ materia=materia,
+ tipo_votacao='2')
+ tipo_resultado_votacao = mommy.make(TipoResultadoVotacao,
+ nome='ok',
+ natureza="A")
+ registro = mommy.make(RegistroVotacao,
+ tipo_resultado_votacao=tipo_resultado_votacao,
+ materia=materia,
+ expediente=expediente)
+ presenca = mommy.make(SessaoPlenariaPresenca,
+ sessao_plenaria=sessao_plenaria)
+ parlamentar = mommy.make(Parlamentar)
+ voto_parlamentar = mommy.make(VotoParlamentar,
+ votacao=registro,
+ parlamentar=parlamentar,
+ expediente=expediente)
+ sessao_plenaria.delete()
+ expediente_filter = ExpedienteMateria.objects.filter(
+ sessao_plenaria=sessao_plenaria).exists()
+ registro_filter = RegistroVotacao.objects.filter(
+ tipo_resultado_votacao=tipo_resultado_votacao,
+ materia=materia,
+ expediente=expediente).exists()
+ presenca_filter = SessaoPlenariaPresenca.objects.filter(
+ sessao_plenaria=sessao_plenaria).exists()
+ parlamentar_filter = Parlamentar.objects.exists()
+ voto_parlamentar_filter = VotoParlamentar.objects.filter(
+ expediente=expediente).exists()
+ assert not registro_filter
+ assert not expediente_filter
+ assert not presenca_filter
+ assert not voto_parlamentar_filter
+ assert parlamentar_filter # Não exclui Parlamentar
+
+
+@pytest.mark.django_db(transaction=False)
+def test_delete_sessao_plenaria_cascade_integrante_mesa():
+ sessao_plenaria = create_sessao_plenaria()
+ mesa = mommy.make(IntegranteMesa,sessao_plenaria=sessao_plenaria)
+ sessao_plenaria.delete()
+ mesa_filter = IntegranteMesa.objects.filter(sessao_plenaria=sessao_plenaria).exists()
+ assert not mesa_filter
+
+@pytest.mark.django_db(transaction=False)
+def test_delete_sessao_plenaria_cascade_expedientesessao():
+ sessao_plenaria = create_sessao_plenaria()
+ expediente_sessao = mommy.make(ExpedienteSessao, sessao_plenaria=sessao_plenaria)
+ sessao_plenaria.delete()
+ expediente_sessao_filter = ExpedienteSessao.objects.filter(sessao_plenaria=sessao_plenaria).exists()
+ assert not expediente_sessao_filter
+
+@pytest.mark.django_db(transaction=False)
+def test_delete_sessao_plenaria_cascade_orador():
+ sessao_plenaria = create_sessao_plenaria()
+ expediente_sessao = mommy.make(Orador, sessao_plenaria=sessao_plenaria)
+ sessao_plenaria.delete()
+ orador_filter = Orador.objects.filter(sessao_plenaria=sessao_plenaria).exists()
+ assert not orador_filter
From df770218bba3e9fbc46082961c6ecac381577c00 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Thu, 18 Oct 2018 11:02:36 -0300
Subject: [PATCH 43/50] add msg info em busca de dispositivos e msg de erro
---
sapl/compilacao/views.py | 16 +++++++++++++++-
.../dispositivo_form_search_fragment.html | 9 +++++++++
sapl/templates/compilacao/messages.html | 10 ++++++++++
3 files changed, 34 insertions(+), 1 deletion(-)
create mode 100644 sapl/templates/compilacao/messages.html
diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py
index 82b5cbd10..6cf1911d6 100644
--- a/sapl/compilacao/views.py
+++ b/sapl/compilacao/views.py
@@ -2892,7 +2892,21 @@ class DispositivoSearchFragmentFormView(ListView):
itens.append(item)
return JsonResponse(itens, safe=False)
- return ListView.get(self, request, *args, **kwargs)
+ response = ListView.get(self, request, *args, **kwargs)
+
+ if not self.object_list.exists():
+ messages.info(
+ request, _('Não foram encontrados resultados '
+ 'com seus critérios de busca!'))
+
+ try:
+ r = response.render()
+ return response
+ except Exception as e:
+ messages.error(request, "Erro - %s" % e)
+ context = {}
+ self.template_name = 'compilacao/messages.html'
+ return self.render_to_response(context)
def get_queryset(self):
try:
diff --git a/sapl/templates/compilacao/dispositivo_form_search_fragment.html b/sapl/templates/compilacao/dispositivo_form_search_fragment.html
index 95d91a2cf..2df5aa0de 100644
--- a/sapl/templates/compilacao/dispositivo_form_search_fragment.html
+++ b/sapl/templates/compilacao/dispositivo_form_search_fragment.html
@@ -1,5 +1,14 @@
{% load i18n compilacao_filters %}
+{% for message in messages %}
+
+
+
+
+ {{ message|safe }}
+
+{% endfor %}
+
{% if object_list.count >= 100 %}
{% trans 'Use argumentos para simplificar listagem...' %}
diff --git a/sapl/templates/compilacao/messages.html b/sapl/templates/compilacao/messages.html
new file mode 100644
index 000000000..1777831c7
--- /dev/null
+++ b/sapl/templates/compilacao/messages.html
@@ -0,0 +1,10 @@
+{% load i18n compilacao_filters %}
+
+{% for message in messages %}
+
+
+
+
+ {{ message|safe }}
+
+{% endfor %}
\ No newline at end of file
From ae849f2c1f0c5481681ac8c6c07c90c1f0f1b99e Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Thu, 18 Oct 2018 13:24:27 -0300
Subject: [PATCH 44/50] Fix #2316 (#2317)
---
sapl/base/forms.py | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index 028f2c464..7d6705687 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -262,6 +262,32 @@ class TipoAutorForm(ModelForm):
super(TipoAutorForm, self).__init__(*args, **kwargs)
+ def clean(self):
+ super(TipoAutorForm, self).clean()
+
+ if not self.is_valid():
+ return self.cleaned_data
+
+ cd = self.cleaned_data
+ lista = ['comissão',
+ 'comis',
+ 'parlamentar',
+ 'bancada',
+ 'bloco',
+ 'comissao',
+ 'vereador',
+ 'órgão',
+ 'orgao',
+ 'deputado',
+ 'senador',
+ 'vereadora',
+ 'frente']
+
+ for l in lista:
+ if l in cd['descricao'].lower():
+ raise ValidationError(_('A descrição colocada não pode ser usada '
+ 'por ser equivalente a um tipo já existente'))
+
class AutorForm(ModelForm):
senha = forms.CharField(
From 8eecfabcd0ad2592ea78a0b5d4e033aae5ee3b3f Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Mon, 22 Oct 2018 13:16:15 -0300
Subject: [PATCH 45/50] =?UTF-8?q?HOT-FIX:=20conserta=20indexacao=20por=20n?=
=?UTF-8?q?umero=20de=20audi=C3=AAncia?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/audiencia/views.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sapl/audiencia/views.py b/sapl/audiencia/views.py
index fa9084520..0a8da8af1 100644
--- a/sapl/audiencia/views.py
+++ b/sapl/audiencia/views.py
@@ -29,7 +29,8 @@ class AudienciaCrud(Crud):
audiencia_materia = {}
for o in context['object_list']:
- audiencia_materia[str(o.id)] = o.materia
+ # indexado pelo numero da audiencia
+ audiencia_materia[str(o.numero)] = o.materia
for row in context['rows']:
coluna_materia = row[3] # se mudar a ordem de listagem mudar aqui
From b4f5651d6cf3df7e17209cb1c49099f4a398c97a Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Mon, 22 Oct 2018 13:17:59 -0300
Subject: [PATCH 46/50] Release: 3.1.128
---
docker-compose.yml | 2 +-
sapl/templates/base.html | 2 +-
setup.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index db9019eba..3982527fb 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.127
+ image: interlegis/sapl:3.1.128
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index d8644b046..58f191e19 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -184,7 +184,7 @@
Desenvolvido pelo Interlegis em software livre e aberto.
- Release: 3.1.127
+ Release: 3.1.128
diff --git a/setup.py b/setup.py
index 50895497c..c11a354b1 100644
--- a/setup.py
+++ b/setup.py
@@ -49,7 +49,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
- version='3.1.127',
+ version='3.1.128',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',
From e3f47a2ce8ca1a789c3b664b620100671aad9cf7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?=
Date: Mon, 22 Oct 2018 16:48:18 -0300
Subject: [PATCH 47/50] =?UTF-8?q?Fix=20Ocorr=C3=AAncias=20da=20Sess=C3=A3o?=
=?UTF-8?q?=20(#2322)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html b/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html
index b1385e7c2..9b65733f9 100644
--- a/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html
+++ b/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html
@@ -1,6 +1,6 @@
Ocorrências da Sessão:
- {{object.ocorrenciasessao.conteudo|safe}}
+ {{object.ocorrenciasessao.conteudo|striptags|safe}}
From 4ae0f1ab843dd8fe3f77cbb83107beed7cf2edf3 Mon Sep 17 00:00:00 2001
From: Cesar Carvalho
Date: Mon, 22 Oct 2018 16:55:31 -0300
Subject: [PATCH 48/50] HOTFIX: conserto de bug em ExclusaoAcompanhamento
docadm
---
.gitignore | 1 +
sapl/protocoloadm/views.py | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index 429873229..65adbb56b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -87,6 +87,7 @@ target/
*.sublime-workspace
.ipynb_checkpoints/
*.ipynb
+.vscode/
# specific to this project
diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py
index 67ea62d5d..84280796f 100644
--- a/sapl/protocoloadm/views.py
+++ b/sapl/protocoloadm/views.py
@@ -136,7 +136,7 @@ class AcompanhamentoExcluirView(TemplateView):
kwargs={'pk': self.kwargs['pk']})
def get(self, request, *args, **kwargs):
- materia_id = kwargs['pk']
+ documento_id = kwargs['pk']
hash_txt = request.GET.get('hash_txt', '')
try:
From 3230a6a8a29533865530546063df6768ea81269c Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Mon, 22 Oct 2018 18:25:50 -0300
Subject: [PATCH 49/50] Fix #2323 (#2324)
---
.../migrations/0032_auto_20181022_1743.py | 21 +++++++++++++++++++
sapl/materia/models.py | 2 +-
2 files changed, 22 insertions(+), 1 deletion(-)
create mode 100644 sapl/materia/migrations/0032_auto_20181022_1743.py
diff --git a/sapl/materia/migrations/0032_auto_20181022_1743.py b/sapl/materia/migrations/0032_auto_20181022_1743.py
new file mode 100644
index 000000000..8721e831b
--- /dev/null
+++ b/sapl/materia/migrations/0032_auto_20181022_1743.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.13 on 2018-10-22 20:43
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('materia', '0031_auto_20180924_1724'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='autoria',
+ name='autor',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='base.Autor', verbose_name='Autor'),
+ ),
+ ]
diff --git a/sapl/materia/models.py b/sapl/materia/models.py
index dd9f8ddab..3c1b4862e 100644
--- a/sapl/materia/models.py
+++ b/sapl/materia/models.py
@@ -307,7 +307,7 @@ class MateriaLegislativa(models.Model):
class Autoria(models.Model):
autor = models.ForeignKey(Autor,
verbose_name=_('Autor'),
- on_delete=models.CASCADE)
+ on_delete=models.PROTECT)
materia = models.ForeignKey(
MateriaLegislativa, on_delete=models.CASCADE,
verbose_name=_('Matéria Legislativa'))
From 01e97daa7ecb19b2975fbee14d1ab9a984adbe23 Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Tue, 23 Oct 2018 08:20:19 -0300
Subject: [PATCH 50/50] Fix #2308 (#2325)
---
sapl/templates/materia/impressos/ficha_pdf.html | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/sapl/templates/materia/impressos/ficha_pdf.html b/sapl/templates/materia/impressos/ficha_pdf.html
index 07ad4092a..faa7163e2 100644
--- a/sapl/templates/materia/impressos/ficha_pdf.html
+++ b/sapl/templates/materia/impressos/ficha_pdf.html
@@ -70,7 +70,7 @@ body
PROCESSO Nº {{ materia.numeracao_set.first.numero_materia }} / {{ materia.numeracao_set.first.ano_materia }}
{% else %}
- PROCESSO Nº: {{ materia.numero }}
+ PROCESSO Nº: {{ materia.numero }} / {{materia.ano}}
{% endif %}
@@ -96,6 +96,14 @@ body
Autor: {{materia.autoria_set.first.autor.nome}}