From 9a89c863dd811c877311dc19f40bddbddb7c9919 Mon Sep 17 00:00:00 2001
From: Cesar Augusto de Carvalho
Date: Mon, 8 Apr 2019 11:43:00 -0300
Subject: [PATCH 01/14] =?UTF-8?q?Adiciona=20bot=C3=A3o=20Adicionar=20Parla?=
=?UTF-8?q?mentar=20em=20Tabelas=20Auxiliares=20(#2697)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/templates/menu_tabelas_auxiliares.yaml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sapl/templates/menu_tabelas_auxiliares.yaml b/sapl/templates/menu_tabelas_auxiliares.yaml
index ced7bddf3..4f690ca00 100644
--- a/sapl/templates/menu_tabelas_auxiliares.yaml
+++ b/sapl/templates/menu_tabelas_auxiliares.yaml
@@ -20,6 +20,9 @@
- title: {% trans 'Pesquisar Parlamentar' %}
url: sapl.parlamentares:pesquisar_parlamentar
css_class: btn btn-link
+ - title: {% trans 'Adicionar Parlamentar' %}
+ url: sapl.parlamentares:parlamentar_create
+ css_class: btn btn-link
- title: {% trans 'Legislatura' %}
url: sapl.parlamentares:legislatura_list
css_class: btn btn-link
From 6906c620c22f48575fa5e5b438965eab3200c5ca Mon Sep 17 00:00:00 2001
From: Edward
Date: Mon, 8 Apr 2019 12:54:44 -0300
Subject: [PATCH 02/14] =?UTF-8?q?Atualiza=20vers=C3=A3o=20do=20SAPL?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
solr/docker-compose.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/solr/docker-compose.yml b/solr/docker-compose.yml
index 6349c8053..71e25c76c 100644
--- a/solr/docker-compose.yml
+++ b/solr/docker-compose.yml
@@ -24,7 +24,7 @@ services:
- "8983:8983"
sapl:
- image: interlegis/sapl:3.1.144
+ image: interlegis/sapl:3.1.152
# build: .
restart: always
environment:
From 7038d6f4e6f45adf8ee504cfe9f6a1b02ee1389d Mon Sep 17 00:00:00 2001
From: Edward
Date: Mon, 8 Apr 2019 12:55:42 -0300
Subject: [PATCH 03/14] Fix #2656 (#2698)
---
docs/solr.rst | 59 +++++++++++++++++++++++++++++++++++++++------------
1 file changed, 45 insertions(+), 14 deletions(-)
diff --git a/docs/solr.rst b/docs/solr.rst
index 4c82ab68d..d5da6d889 100644
--- a/docs/solr.rst
+++ b/docs/solr.rst
@@ -1,27 +1,58 @@
-**ESTAS INSTRUÇÕES ESTÃO DEFASADAS. EM BREVE IREMOS DISPONIBILIZAR UM TUTORIAL MAIS ATUALIZADO DE COMO INTEGRAR O SOLR AO SAPL**
-
================================
Instruções para instalar o Solr
================================
Solr é a ferramenta utilizada pelo SAPL 3.1 para indexar documentos para que possa ser feita
-a Pesquisa Textual.
+a Pesquisa Textual. Se a execução for mediante containers Docker então use o arquivo docker-compose.yml disponível em
+*https://github.com/interlegis/sapl/blob/3.1.x/solr/docker-compose.yml* (verifique os mapeamentos de volume, e realize o
+backup de seu BD antes de qualquer tentativa de substituição do arquivo docker-compose.yml em uso corrente).
+
+1) Faça o download da distribuição _binária_ do Apache Solr do site oficial do projeto *http://lucene.apache.org/solr* ;
+
+As instalações Solr suportadas até o momento vão da 7.4 à 8;
+
+2) Descompacte o arquivo em uma pasta do diretório (referenciada neste tutorial como $SOLR_HOME)
+
+3) Inicie o Solr com o comando:
+
+ **$SOLR_HOME/bin/solr start -c** ;
+
+4) Por meio do browser, acesse a URL **http://localhost:8983** (ou informe o endereço da máquina onde o Solr foi instalado)
+
+5) Pare o servidor do SAPL;
+
+6) Edite o arquivo .env adicionando as seguintes linhas:
+
+
+
+ USE_SOLR = True
+
+
+ SOLR_COLLECTION = sapl
+
+
+ SOLR_URL = http://localhost:8983
+
+
+
+
+(o valor do campo SOLR_URL deve corresponder à URL acessada no item 3)
+
+7) Entre no diretório raiz do SAPL e digite o comando: **python3 solr_api.py -c sapl -u http://localhost:8983`**
+
+(a URL informada acima deve ser a mesma dos itens 3 e 6)
-Adicione ao arquivo ``.env`` o seguinte atributo:
+8) Enquanto o Solr realiza a indexação da base de dados do SAPL, inicie em uma outra tela o SAPL;
-``SOLR_URL = 'http://127.0.0.1:8983/solr'``
+9) Após realizados os passos com sucesso, nas telas de busca de Matéria Legislativa e Normas deverá aparecer um botão
+de 'Busca Textual' próximo ao botão de busca tradicional.
-Dentro do diretório principal siga os seguintes passos::
+**Observações:**
- curl -LO https://archive.apache.org/dist/lucene/solr/4.10.2/solr-4.10.2.tgz
- tar xvzf solr-4.10.2.tgz
- cd solr-4.10.2
- cd example
- java -jar start.jar
- ./manage.py build_solr_schema --filename solr-4.10.2/example/solr/collection1/conf/schema.xml
+a) Para parar o Solr execute o comando **$SOLR_HOME/bin/solr stop**
+b) Para reindexar os dados do SAPL execute o comando `python3 manage.py rebuild_index` (isso irá apagar todos os dados
+do Solr e indexar tudo novamente).
-Após isso, deve-se parar o servidor do Solr e restartar com ``java -jar start.jar``
-**OBS: Toda vez que o código da pesquisa textual for modificado, os comandos de build_solr_schema e start.jar devem ser rodados, nessa mesma ordem.**
From 2406cff37fb3ea474d5473a13a0f1fec9487cdbf Mon Sep 17 00:00:00 2001
From: Edward
Date: Mon, 8 Apr 2019 13:44:54 -0300
Subject: [PATCH 04/14] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20da=20documenta?=
=?UTF-8?q?=C3=A7=C3=A3o=20Solr.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/solr.rst | 33 +++++++++++++++------------------
1 file changed, 15 insertions(+), 18 deletions(-)
diff --git a/docs/solr.rst b/docs/solr.rst
index d5da6d889..ae8bbdb63 100644
--- a/docs/solr.rst
+++ b/docs/solr.rst
@@ -2,20 +2,24 @@
Instruções para instalar o Solr
================================
-Solr é a ferramenta utilizada pelo SAPL 3.1 para indexar documentos para que possa ser feita
-a Pesquisa Textual. Se a execução for mediante containers Docker então use o arquivo docker-compose.yml disponível em
-*https://github.com/interlegis/sapl/blob/3.1.x/solr/docker-compose.yml* (verifique os mapeamentos de volume, e realize o
-backup de seu BD antes de qualquer tentativa de substituição do arquivo docker-compose.yml em uso corrente).
+Solr é uma plataforma open source de indexação e busca textual utilizada pelo SAPL 3.1 para indexar documentos (normas jurídicas, matérias legislativas e documentos acessórios).
-1) Faça o download da distribuição _binária_ do Apache Solr do site oficial do projeto *http://lucene.apache.org/solr* ;
+Observação: Se a execução do SAPL for mediante containers Docker então use o arquivo *docker-compose.yml* disponível em
+*https://github.com/interlegis/sapl/blob/3.1.x/solr/docker-compose.yml* (verifique os mapeamentos de volume estão corretos, a verso do SAPL referenciada no arquivo docker-compose.yml, e realize o backup de seu BD **antes** de qualquer tentativa de substituição do arquivo *docker-compose.yml* em uso corrente);
+
+1) Faça o download da distribuição *binária* do Apache Solr do site oficial do projeto **http://lucene.apache.org/solr**
+
+
+ As instalações Solr suportadas até o momento vão da 7.4 à 8;
-As instalações Solr suportadas até o momento vão da 7.4 à 8;
2) Descompacte o arquivo em uma pasta do diretório (referenciada neste tutorial como $SOLR_HOME)
+
3) Inicie o Solr com o comando:
- **$SOLR_HOME/bin/solr start -c** ;
+ **$SOLR_HOME/bin/solr start -c**
+
4) Por meio do browser, acesse a URL **http://localhost:8983** (ou informe o endereço da máquina onde o Solr foi instalado)
@@ -23,8 +27,6 @@ As instalações Solr suportadas até o momento vão da 7.4 à 8;
6) Edite o arquivo .env adicionando as seguintes linhas:
-
-
USE_SOLR = True
@@ -34,13 +36,11 @@ As instalações Solr suportadas até o momento vão da 7.4 à 8;
SOLR_URL = http://localhost:8983
-
-
-(o valor do campo SOLR_URL deve corresponder à URL acessada no item 3)
+ (o valor do campo SOLR_URL deve corresponder à URL acessada no item 3)
7) Entre no diretório raiz do SAPL e digite o comando: **python3 solr_api.py -c sapl -u http://localhost:8983`**
-(a URL informada acima deve ser a mesma dos itens 3 e 6)
+ (a URL informada acima deve ser a mesma dos itens 3 e 6)
8) Enquanto o Solr realiza a indexação da base de dados do SAPL, inicie em uma outra tela o SAPL;
@@ -49,10 +49,7 @@ de 'Busca Textual' próximo ao botão de busca tradicional.
**Observações:**
-a) Para parar o Solr execute o comando **$SOLR_HOME/bin/solr stop**
+* Para parar o Solr execute o comando **$SOLR_HOME/bin/solr stop**
-b) Para reindexar os dados do SAPL execute o comando `python3 manage.py rebuild_index` (isso irá apagar todos os dados
+* Para reindexar os dados do SAPL execute o comando **python3 manage.py rebuild_index** (isso irá apagar todos os dados
do Solr e indexar tudo novamente).
-
-
-
From 431a8fc294d0a9d5cff9d608198a44c24c66faa4 Mon Sep 17 00:00:00 2001
From: Cesar Augusto de Carvalho
Date: Mon, 8 Apr 2019 13:49:04 -0300
Subject: [PATCH 05/14] fix anexo norma para arquivos grandes (#2699)
---
sapl/norma/forms.py | 3 +--
sapl/norma/models.py | 17 +++++++++++++++++
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py
index 12eee547f..5a9e1b3f6 100644
--- a/sapl/norma/forms.py
+++ b/sapl/norma/forms.py
@@ -298,11 +298,10 @@ class AnexoNormaJuridicaForm(FileFieldCheckMixin, ModelForm):
def save(self, commit=False):
anexo = self.instance
anexo.ano = self.cleaned_data['norma'].ano
- anexo = super(AnexoNormaJuridicaForm, self).save(commit=True)
anexo.norma = self.cleaned_data['norma']
anexo.assunto_anexo = self.cleaned_data['assunto_anexo']
anexo.anexo_arquivo = self.cleaned_data['anexo_arquivo']
- anexo.save()
+ anexo = super(AnexoNormaJuridicaForm, self).save(commit=True)
return anexo
diff --git a/sapl/norma/models.py b/sapl/norma/models.py
index f7fcf17e9..5a5557e5b 100644
--- a/sapl/norma/models.py
+++ b/sapl/norma/models.py
@@ -351,3 +351,20 @@ class AnexoNormaJuridica(models.Model):
def __str__(self):
return _('Anexo: %(anexo)s da norma %(norma)s') % {
'anexo': self.anexo_arquivo, 'norma': self.norma}
+
+ def save(self, force_insert=False, force_update=False, using=None,
+ update_fields=None):
+
+ if not self.pk and self.anexo_arquivo:
+ anexo_arquivo = self.anexo_arquivo
+ self.anexo_arquivo = None
+ models.Model.save(self, force_insert=force_insert,
+ force_update=force_update,
+ using=using,
+ update_fields=update_fields)
+ self.anexo_arquivo = anexo_arquivo
+
+ return models.Model.save(self, force_insert=force_insert,
+ force_update=force_update,
+ using=using,
+ update_fields=update_fields)
\ No newline at end of file
From 34786902e63bd9a16b51f7fa3cb3f6b66ef33275 Mon Sep 17 00:00:00 2001
From: Cesar Augusto de Carvalho
Date: Mon, 8 Apr 2019 13:50:14 -0300
Subject: [PATCH 06/14] =?UTF-8?q?Fix=20Verifica=C3=A7=C3=A3o=20de=20Erros?=
=?UTF-8?q?=20do=20Formul=C3=A1rio=20em=20Documento=20Acess=C3=B3rio=20em?=
=?UTF-8?q?=20Lote=20(#2693)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Fix Verificação de Erros do Formulário em Documento Acessorio em Lote
* Altera o logger
---
sapl/materia/views.py | 31 ++++++++++++++++++++++++++-----
1 file changed, 26 insertions(+), 5 deletions(-)
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
index 6c0da0ce0..8d7278e5f 100644
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -14,7 +14,7 @@ from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import permission_required
from django.contrib.auth.mixins import PermissionRequiredMixin
-from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
+from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, ValidationError
from django.core.urlresolvers import reverse
from django.db.models import Max, Q
from django.http import HttpResponse, JsonResponse
@@ -1945,6 +1945,7 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
filterset_class = AcessorioEmLoteFilterSet
template_name = 'materia/em_lote/acessorio.html'
permission_required = ('materia.add_documentoacessorio',)
+ logger = logging.getLogger(__name__)
def get_context_data(self, **kwargs):
context = super(DocumentoAcessorioEmLoteView,
@@ -1966,6 +1967,7 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
return context
def post(self, request, *args, **kwargs):
+ username = request.user.username
marcadas = request.POST.getlist('materia_id')
if len(marcadas) == 0:
@@ -1981,14 +1983,21 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
msg = _('Autor tem que ter menos do que 50 caracteres.')
messages.add_message(request, messages.ERROR, msg)
return self.get(request, self.kwargs)
-
- tmp_name = os.path.join(tempfile.gettempdir(), request.FILES['arquivo'].name)
+
+ tmp_name = os.path.join(MEDIA_ROOT, request.FILES['arquivo'].name)
with open(tmp_name, 'wb') as destination:
for chunk in request.FILES['arquivo'].chunks():
destination.write(chunk)
+ try:
+ doc_data = tz.localize(datetime.strptime(
+ request.POST['data'], "%d/%m/%Y"))
+ except Exception as e:
+ msg = _('Formato da data incorreto. O formato deve ser da forma dd/mm/aaaa.')
+ messages.add_message(request, messages.ERROR, msg)
+ self.logger.error("User={}. {}. Data inserida: {}".format(username, str(msg), request.POST['data']))
+ os.remove(tmp_name)
+ return self.get(request, self.kwargs)
- doc_data = tz.localize(datetime.strptime(
- request.POST['data'], "%d/%m/%Y"))
for materia_id in marcadas:
doc = DocumentoAcessorio()
doc.materia_id = materia_id
@@ -1997,6 +2006,18 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
doc.data = doc_data
doc.autor = request.POST['autor']
doc.ementa = request.POST['ementa']
+ doc.arquivo.name = tmp_name
+ try:
+ doc.clean_fields()
+ except ValidationError as e:
+ for m in [ '%s: %s' % (DocumentoAcessorio()._meta.get_field(k).verbose_name, ''.join(v))
+ for k,v in e.message_dict.items() ]:
+ # Insere as mensagens de erro no formato:
+ # 'verbose_name do nome do campo': 'mensagem de erro'
+ messages.add_message(request, messages.ERROR, m)
+ self.logger.error("User={}. {}. Nome do arquivo: {}.".format(username, str(msg), request.FILES['arquivo'].name))
+ os.remove(tmp_name)
+ return self.get(request, self.kwargs)
doc.save()
diretorio = os.path.join(MEDIA_ROOT,
'sapl/public/documentoacessorio',
From 80babf2b4520af1665603ad2fced2475c28d3b88 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?=
Date: Mon, 8 Apr 2019 13:55:49 -0300
Subject: [PATCH 07/14] Fix #2682 (#2684)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Fix #2682
* retira if desnecessário
---
.../blocos_ata/identificacao_basica.html | 3 +-
.../sessao/blocos_ata/lista_presenca.html | 6 ++-
.../blocos_ata/lista_presenca_ordem_dia.html | 3 +-
.../blocos_ata/materias_expediente.html | 51 +++++++++++--------
.../sessao/blocos_ata/materias_ordem_dia.html | 35 +++++++------
.../sessao/blocos_ata/mesa_diretora.html | 3 +-
.../blocos_ata/oradores_expediente.html | 7 ++-
.../blocos_ata/oradores_explicacoes.html | 5 +-
8 files changed, 65 insertions(+), 48 deletions(-)
diff --git a/sapl/templates/sessao/blocos_ata/identificacao_basica.html b/sapl/templates/sessao/blocos_ata/identificacao_basica.html
index a6ec9c8c0..84eeb2a11 100644
--- a/sapl/templates/sessao/blocos_ata/identificacao_basica.html
+++ b/sapl/templates/sessao/blocos_ata/identificacao_basica.html
@@ -2,7 +2,8 @@
Identificação Básica:
{% for b in basica %}
- {{b}} ;
+ {{b}}
+ {% if not forloop.last %} ; {% endif %}
{% endfor %}
\ No newline at end of file
diff --git a/sapl/templates/sessao/blocos_ata/lista_presenca.html b/sapl/templates/sessao/blocos_ata/lista_presenca.html
index 329fde406..1efc2c8ea 100644
--- a/sapl/templates/sessao/blocos_ata/lista_presenca.html
+++ b/sapl/templates/sessao/blocos_ata/lista_presenca.html
@@ -5,7 +5,8 @@
{% if presenca_sessao %}
Lista de Presença na Sessão:
{% for p in presenca_sessao %}
- {{p.nome_completo}} / {{ p|filiacao_data_filter:object.data_inicio }} ;
+ {{p.nome_completo}} / {{ p|filiacao_data_filter:object.data_inicio }}
+ {% if not forloop.last %} ; {% endif %}
{% endfor %}
{% endif %}
@@ -13,7 +14,8 @@
{% if justificativa_ausencia %}
Justificativas de Ausências na Sessão:
{% for j in justificativa_ausencia %}
- {{j.parlamentar.nome_completo}} / {{ j.tipo_ausencia }} ;
+ {{j.parlamentar.nome_completo}} / {{ j.tipo_ausencia }}
+ {% if not forloop.last %} ; {% endif %}
{% endfor %}
{% endif %}
diff --git a/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html b/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html
index d6c8014ca..855d1be6f 100644
--- a/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html
+++ b/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html
@@ -5,7 +5,8 @@
{% if presenca_ordem %}
Lista de Presença na Ordem do Dia:
{% for p in presenca_ordem %}
- {{p.nome_completo}} / {{ p|filiacao_data_filter:object.data_inicio }} ;
+ {{p.nome_completo}} / {{ p|filiacao_data_filter:object.data_inicio }}
+ {% if not forloop.last %} ; {% endif %}
{% endfor %}
{% endif %}
diff --git a/sapl/templates/sessao/blocos_ata/materias_expediente.html b/sapl/templates/sessao/blocos_ata/materias_expediente.html
index 7613448fc..3ccc3fb84 100644
--- a/sapl/templates/sessao/blocos_ata/materias_expediente.html
+++ b/sapl/templates/sessao/blocos_ata/materias_expediente.html
@@ -1,27 +1,36 @@
\ No newline at end of file
diff --git a/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html b/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html
index d894e8a06..a167e01a1 100644
--- a/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html
+++ b/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html
@@ -2,29 +2,32 @@