From 65dbe439d965f3e28f48d9072a5489ad62764ebe Mon Sep 17 00:00:00 2001 From: Edward Date: Tue, 9 Apr 2019 14:04:06 -0300 Subject: [PATCH 1/8] Update solr.rst --- docs/solr.rst | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/docs/solr.rst b/docs/solr.rst index ae8bbdb63..13bdbf02c 100644 --- a/docs/solr.rst +++ b/docs/solr.rst @@ -2,6 +2,8 @@ Instruções para instalar o Solr ================================ +**O servidor do Solr NÃO DEVE SER EXPOSTO NA INTERNET. Assim como o servidor de bancos de dados Postgres ele deve estar acessível pelo SAPL na rede interna (atrás de NATs/firewalls/proxies/etc).** + 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). Observação: Se a execução do SAPL for mediante containers Docker então use o arquivo *docker-compose.yml* disponível em @@ -45,11 +47,42 @@ Observação: Se a execução do SAPL for mediante containers Docker então use 8) Enquanto o Solr realiza a indexação da base de dados do SAPL, inicie em uma outra tela o SAPL; 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. +de 'Pesquisa Textual' na tela de busca tradicional. **Observações:** * Para parar o Solr execute o comando **$SOLR_HOME/bin/solr stop** -* 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). + +* Comandos de manutenção da base textual do Solr: + +1. **python3 manage.py rebuild_index** : Apaga os dados da coleção `sapl` no Solr e reindexa tudo do início; + +2. **python3 manage.py clear_index** : Apaga todos os dados da coleção `sapl` do Solr. **Este comando não irá apagar os dados do BD Postgres, somente os dados do Solr serão apagados.** + +3. **python3 manage.py update_index** : atualiza os dados do Solr: + +3.1. **python3 manage.py update_index --remove** : remove objetos do Solr que não mais existem no BD Postgres (no caso do Postgres e Solr derem dessincronizados). + +3.2. **python3 manage.py update_index --age ** : reindexa os documentos inseridos/alterados nas últimas horas; + +3.3. **python3 manage.py update_index -s YYYY-MM-DDTHH:MM:SS -e YYYY-MM-DDTHH:MM:SS** : reindexa os documentos que foram inseridos/atualizados entre a data inicial (-s) e a data final (-e). Ambos os argumentos de início e fim são opcionais. + + +### FAQ + +1. Uma dúvida quanto a indexação do Solr, pelo que entendi de tempos e tempos tenho que rodar o comando para poder indexar novos arquivos certo? + + Errado. Cada novo documento inserido, atualizado, ou removido do SAPL dispara uma nova indexação somente daquele documento no Solr automaticamente. + +2. O comando **python3 solr_api.py -c sapl -u http://localhost:8983** indexa os novos arquivos? + + Não. Este comando é para construir a coleção do Solr a primeira vez e, por acaso, faz a indexação inicial. Não deve ser usado se a coleção já foi criada. + +3. Ou teria que reindexar do zero com *rebuild_index*? + + Pode acontecer do Postgres e o Solr se dessincronizarem (ex: o Solr ficou fora do ar por um dia e foram inseridos registros no SAPL). Ou por algum motivo se deseja refazer o índice do Solr. Neste caso pode-se refazer a indexação no Solr com o comando : **python3 manage.py rebuild_index** (direto na linha de comando, a partir da pasta raiz do SAPL). Mas existem maneiras de atualizar somente os documentos inseridos/alterados a partir de uma determinada data ao invés de atualizar tudo do zero de novo. + +4. Pergunto isso pois estou querendo criar um script para crontab para indexar esses novos arquivos + +Desnecessário. From 035b7d352374f5739d4c8d67ede1263294ff977c Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Tue, 9 Apr 2019 15:41:18 -0300 Subject: [PATCH 2/8] =?UTF-8?q?Ajusta=20tags=20para=20n=C3=A3o=20estourar?= =?UTF-8?q?=20ml2pdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/relatorios/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 117b7a172..5bd3fe6f7 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -580,7 +580,9 @@ def get_sessao_plenaria(sessao, casa): # https://github.com/interlegis/sapl/issues/1046 conteudo = re.sub('style=".*?"', '', conteudo) conteudo = re.sub('class=".*?"', '', conteudo) + conteudo = re.sub('align=".*?"', '', conteudo) # OSTicket Ticket #796450 conteudo = re.sub('', '

', conteudo) + conteudo = re.sub('', '
', conteudo) # OSTicket Ticket #796450 conteudo = html.unescape(conteudo) # escape special character '&' From 313979fc5335d3fc769dcfe81f2a8c876f3b367f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Matheus?= Date: Wed, 10 Apr 2019 08:45:23 -0300 Subject: [PATCH 3/8] HOT-FIX: Adiciona migracao para passar no teste --- .../migrations/0036_auto_20190410_0836.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 sapl/sessao/migrations/0036_auto_20190410_0836.py diff --git a/sapl/sessao/migrations/0036_auto_20190410_0836.py b/sapl/sessao/migrations/0036_auto_20190410_0836.py new file mode 100644 index 000000000..981734928 --- /dev/null +++ b/sapl/sessao/migrations/0036_auto_20190410_0836.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-04-10 11:36 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0035_resumoordenacao_decimo_quarto'), + ] + + operations = [ + migrations.AlterField( + model_name='expedientesessao', + name='sessao_plenaria', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='expedientesessao_set', to='sessao.SessaoPlenaria'), + ), + ] From 5adcf9c4843d0af108f6245b56fcec9c2dca78bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Cantu=C3=A1ria?= Date: Wed, 10 Apr 2019 14:20:04 -0300 Subject: [PATCH 4/8] HOT-FIX: Corrige contagem de autores duplicados --- sapl/base/views.py | 7 ++----- sapl/templates/base/autores_duplicados.html | 8 +++----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/sapl/base/views.py b/sapl/base/views.py index 2312ab721..3226b4926 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -1081,9 +1081,7 @@ class ListarBancadaComissaoAutorExternoView(PermissionRequiredMixin, ListView): def autores_duplicados(): - return [autor.values() for autor in Autor.objects.values( - 'nome', 'tipo__descricao').order_by( - "nome").annotate(count=Count('nome')).filter(count__gt=1)] + return [autor for autor in Autor.objects.values('nome').annotate(count=Count('nome')).filter(count__gt=1)] class ListarAutoresDuplicadosView(PermissionRequiredMixin, ListView): @@ -1097,8 +1095,7 @@ class ListarAutoresDuplicadosView(PermissionRequiredMixin, ListView): return autores_duplicados() def get_context_data(self, **kwargs): - context = super( - ListarAutoresDuplicadosView, self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) paginator = context['paginator'] page_obj = context['page_obj'] context['page_range'] = make_pagination( diff --git a/sapl/templates/base/autores_duplicados.html b/sapl/templates/base/autores_duplicados.html index a7861aecd..361ff7add 100644 --- a/sapl/templates/base/autores_duplicados.html +++ b/sapl/templates/base/autores_duplicados.html @@ -11,16 +11,14 @@ Autor - Tipo de Autor Quantidade - {% for autor, tipo, quantidade in autores_duplicados %} + {% for autor in autores_duplicados %} - {{ autor }} - {{ tipo }} - {{ quantidade }} + {{ autor.nome }} + {{ autor.count }} {% endfor %} From d55a7a54febd2f1e821c890036b3403736fdc21d Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Wed, 10 Apr 2019 15:16:21 -0300 Subject: [PATCH 5/8] HOT-FIX: limita caracteres capa processo --- sapl/protocoloadm/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index bb5d12ed1..c400cf9a2 100755 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -1232,8 +1232,8 @@ class FichaSelecionaAdmView(PermissionRequiredMixin, FormView): self.messages.add_message(self.request, messages.INFO, mensagem) return self.render_to_response(context) - if len(documento.assunto) > 301: - documento.assunto = documento.assunto[0:300] + '[...]' + if len(documento.assunto) > 201: + documento.assunto = documento.assunto[0:200] + '[...]' context['documento'] = documento return gerar_pdf_impressos(self.request, context, From 33e7db1a42ee599474fe73e5f751a4b31b70a1dd Mon Sep 17 00:00:00 2001 From: Cesar Carvalho Date: Wed, 10 Apr 2019 15:19:09 -0300 Subject: [PATCH 6/8] Adiciona script de checar os commits entre 3.1.x e master --- scripts/check_commits.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 scripts/check_commits.py diff --git a/scripts/check_commits.py b/scripts/check_commits.py new file mode 100644 index 000000000..f34c6f0c6 --- /dev/null +++ b/scripts/check_commits.py @@ -0,0 +1,27 @@ +import requests + +branch_master = requests.get('https://api.github.com/repos/interlegis/sapl/commits?per_page=100&sha=master') +branch_master = branch_master.json() + +commits_master = [e['commit']['message'] for e in branch_master] + +branch_3_1_x = requests.get('https://api.github.com/repos/interlegis/sapl/commits?per_page=70&sha=3.1.x') +branch_3_1_x = branch_3_1_x.json() + +commits_3_1_x = [(e['commit']['message'], {'sha':e['sha'], 'data':e['commit']['author']['date']}) for e in branch_3_1_x] + +print("\nCommits que estão em 3.1.x, mas não em master:\n") + +# retira os \r para evitar bugs +commits_master = [commit.replace('\r', '') for commit in commits_master] + +for c, s in commits_3_1_x: + # retira os \r para evitar bugs + c = c.replace('\r', '') + if c not in commits_master: + print('---------------------------------------------------------------------') + print('Data: ' + s['data'][:10]) + print(s['sha'][:7] + '-> ' + c) + +print('---------------------------------------------------------------------') + From 661615116b514cc18d42be91761af81cb8e7f38b Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Wed, 10 Apr 2019 17:16:52 -0300 Subject: [PATCH 7/8] HOT-FIX: Fix #2717 --- sapl/rules/map_rules.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index d09e65961..d7f3e0b48 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -118,6 +118,8 @@ rules_group_materia = { (materia.Autoria, __base__, __perms_publicas__), (materia.DespachoInicial, __base__, __perms_publicas__), (materia.DocumentoAcessorio, __base__, __perms_publicas__), + (materia.MateriaAssunto, __base__, __perms_publicas__), + (materia.AssuntoMateria, __base__, __perms_publicas__), (materia.MateriaLegislativa, __base__ + ['can_access_impressos'], __perms_publicas__), From e72f65bb024d9ef903c5e1b56c17521b4bc9418e Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Fri, 12 Apr 2019 07:43:17 -0300 Subject: [PATCH 8/8] Fix #2658 (#2718) --- sapl/templates/sessao/painel.html | 98 ++++++------------------------- 1 file changed, 17 insertions(+), 81 deletions(-) diff --git a/sapl/templates/sessao/painel.html b/sapl/templates/sessao/painel.html index 9e1ed742b..7d8a4a104 100644 --- a/sapl/templates/sessao/painel.html +++ b/sapl/templates/sessao/painel.html @@ -116,11 +116,11 @@ $(function() { } startTime(); - - $('#discurso').prop('disabled', true); - $('#aparte').prop('disabled', true); - $('#ordem').prop('disabled', true); - $('#consideracoes').prop('disabled', true); + var audioAlertFinish = document.getElementById("audio"); + $('#discurso').prop('disabled', false); + $('#aparte').prop('disabled', false); + $('#ordem').prop('disabled', false); + $('#consideracoes').prop('disabled', false); $('#discurso').runner({ autostart: false, @@ -130,16 +130,10 @@ $(function() { milliseconds: false }).on('runnerFinish', function(eventObject, info){ $.get('/painel/cronometro', { tipo: 'discurso', action: 'stop' } ); - + audioAlertFinish.play(); $('#discursoReset').show(); $('#discurso').runner('stop'); $('#discursoStart').text('Iniciar'); - $('#aparteStart').prop('disabled', false); - $('#aparteReset').prop('disabled', false); - $('#ordemStart').prop('disabled', false); - $('#ordemReset').prop('disabled', false); - $('#consideracoesStart').prop('disabled', false); - $('#consideracoesReset').prop('disabled', false); }); @@ -152,12 +146,6 @@ $(function() { $('#discursoReset').hide(); $('#discurso').runner('start'); $('#discursoStart').text('Parar'); - $('#aparteStart').prop('disabled', false); - $('#aparteReset').prop('disabled', false); - $('#ordemStart').prop('disabled', false); - $('#ordemReset').prop('disabled', false); - $('#consideracoesStart').prop('disabled', false); - $('#consideracoesReset').prop('disabled', false); } else { @@ -166,12 +154,6 @@ $(function() { $('#discursoReset').show(); $('#discurso').runner('stop'); $('#discursoStart').text('Iniciar'); - $('#aparteStart').prop('disabled', false); - $('#aparteReset').prop('disabled', false); - $('#ordemStart').prop('disabled', false); - $('#ordemReset').prop('disabled', false); - $('#consideracoesStart').prop('disabled', false); - $('#consideracoesReset').prop('disabled', false); } }); @@ -191,16 +173,10 @@ $(function() { milliseconds: false }).on('runnerFinish', function(eventObject, info){ $.get('/painel/cronometro', { tipo: 'aparte', action: 'stop' } ); - + audioAlertFinish.play(); $('#aparteReset').show(); $('#aparte').runner('stop'); $('#aparteStart').text('Iniciar'); - $('#discursoStart').prop('disabled', false); - $('#discursoReset').prop('disabled', false); - $('#ordemStart').prop('disabled', false); - $('#ordemReset').prop('disabled', false); - $('#consideracoesStart').prop('disabled', false); - $('#consideracoesReset').prop('disabled', false); }); @@ -212,12 +188,7 @@ $(function() { $('#aparteReset').hide(); $('#aparte').runner('start'); $('#aparteStart').text('Parar'); - $('#discursoStart').prop('disabled', false); - $('#discursoReset').prop('disabled', false); - $('#ordemStart').prop('disabled', false); - $('#ordemReset').prop('disabled', false); - $('#consideracoesStart').prop('disabled', false); - $('#consideracoesReset').prop('disabled', false); + } else { $.get('/painel/cronometro', { tipo: 'aparte', action: 'stop' } ); @@ -225,12 +196,7 @@ $(function() { $('#aparteReset').show(); $('#aparte').runner('stop'); $('#aparteStart').text('Iniciar'); - $('#discursoStart').prop('disabled', false); - $('#discursoReset').prop('disabled', false); - $('#ordemStart').prop('disabled', false); - $('#ordemReset').prop('disabled', false); - $('#consideracoesStart').prop('disabled', false); - $('#consideracoesReset').prop('disabled', false); + } }); @@ -250,16 +216,11 @@ $(function() { milliseconds: false }).on('runnerFinish', function(eventObject, info){ $.get('/painel/cronometro', { tipo: 'ordem', action: 'stop' } ); - + audioAlertFinish.play(); $('#ordemReset').show(); $('#ordem').runner('stop'); $('#ordemStart').text('Iniciar'); - $('#discursoStart').prop('disabled', false); - $('#discursoReset').prop('disabled', false); - $('#aparteStart').prop('disabled', false); - $('#aparteReset').prop('disabled', false); - $('#consideracoesStart').prop('disabled', false); - $('#consideracoesReset').prop('disabled', false); + }); $('#ordemStart').click(function() { @@ -270,12 +231,7 @@ $(function() { $('#ordemReset').hide(); $('#ordem').runner('start'); $('#ordemStart').text('Parar'); - $('#discursoStart').prop('disabled', false); - $('#discursoReset').prop('disabled', false); - $('#aparteStart').prop('disabled', false); - $('#aparteReset').prop('disabled', false); - $('#consideracoesStart').prop('disabled', false); - $('#consideracoesReset').prop('disabled', false); + } else { @@ -284,12 +240,7 @@ $(function() { $('#ordemReset').show(); $('#ordem').runner('stop'); $('#ordemStart').text('Iniciar'); - $('#discursoStart').prop('disabled', false); - $('#discursoReset').prop('disabled', false); - $('#aparteStart').prop('disabled', false); - $('#aparteReset').prop('disabled', false); - $('#consideracoesStart').prop('disabled', false); - $('#consideracoesReset').prop('disabled', false); + } }); @@ -309,16 +260,11 @@ $(function() { milliseconds: false }).on('runnerFinish', function(eventObject, info){ $.get('/painel/cronometro', { tipo: 'consideracoes', action: 'stop' } ); - + audioAlertFinish.play(); $('#consideracoesReset').show(); $('#consideracoes').runner('stop'); $('#consideracoesStart').text('Iniciar'); - $('#discursoStart').prop('disabled', false); - $('#discursoReset').prop('disabled', false); - $('#ordemStart').prop('disabled', false); - $('#ordemReset').prop('disabled', false); - $('#aparteStart').prop('disabled', false); - $('#aparteReset').prop('disabled', false); + }); @@ -330,12 +276,7 @@ $(function() { $('#consideracoesReset').hide(); $('#consideracoes').runner('start'); $('#consideracoesStart').text('Parar'); - $('#discursoStart').prop('disabled', false); - $('#discursoReset').prop('disabled', false); - $('#ordemStart').prop('disabled', false); - $('#ordemReset').prop('disabled', false); - $('#aparteStart').prop('disabled', false); - $('#aparteReset').prop('disabled', false); + } else { $.get('/painel/cronometro', { tipo: 'consideracoes', action: 'stop' } ); @@ -343,12 +284,7 @@ $(function() { $('#consideracoesReset').show(); $('#consideracoes').runner('stop'); $('#consideracoesStart').text('Iniciar'); - $('#discursoStart').prop('disabled', false); - $('#discursoReset').prop('disabled', false); - $('#ordemStart').prop('disabled', false); - $('#ordemReset').prop('disabled', false); - $('#aparteStart').prop('disabled', false); - $('#aparteReset').prop('disabled', false); + } });