Com o ambiente em produção, os arquivos estáticos devem ser servidos pelo web service, em nosso caso o `NGINX`, logo para ter acesso aos arquivos primeiro devemos rodar o seguinte comando::
Com o ambiente em produção, os arquivos estáticos devem ser servidos pelo web service, em nosso caso o `NGINX`,
em ambiente de produção, para tanto, rode::
./manage.py compilescss
para que os arquivos SASS/SCSS sejam compilados em arquivos .css em ambiente de produção, e em seguida rode::
@ -39,14 +39,14 @@ Instalar o virtualenv usando python 3 para o projeto.
sudo mkdir -p /var/interlegis/.virtualenvs
sudo mkdir -p /var/interlegis/.virtualenvs
* Ajustar as permissões - onde ``sapl31`` trocar por usuario::
* Ajustar as permissões::
sudo chown -R sapl31:sapl31 /var/interlegis/
sudo chown -R $USER:$USER /var/interlegis/
* Edite o arquivo ``.bashrc`` e adicione ao seu final as configurações abaixo para o virtualenvwrapper::
* Edite o arquivo ``.bashrc`` e adicione ao seu final as configurações abaixo para o virtualenvwrapper::
nano /home/sapl31/.bashrc
nano /home/$USER/.bashrc
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export WORKON_HOME=/var/interlegis/.virtualenvs
export WORKON_HOME=/var/interlegis/.virtualenvs
@ -56,7 +56,7 @@ Instalar o virtualenv usando python 3 para o projeto.
* Carregue as configurações do virtualenvwrapper::
* Carregue as configurações do virtualenvwrapper::
source /home/sapl31/.bashrc
source /home/$USER/.bashrc
@ -116,7 +116,7 @@ Instalação e configuração das dependências do projeto
* (caso você já possua uma instalação do postrgresql anterior ao processo de instalação do ambiente de desenvolvimento do SAPL em sua máquina e sábia como fazer, esteja livre para proceder como desejar, porém, ao configurar o arquivo ``.env`` no próximo passo, as mesmas definições deverão ser usadas)
* (caso você já possua uma instalação do postrgresql anterior ao processo de instalação do ambiente de desenvolvimento do SAPL em sua máquina e sábia como fazer, esteja livre para proceder como desejar, porém, ao configurar o arquivo ``.env`` no próximo passo, as mesmas definições deverão ser usadas)
* **Ajustar as permissões - onde $USER trocar por usuario**::
* **Ajustar as permissões - onde $USER trocar por usuário**::
@ -281,4 +282,15 @@ Feito isso, e você ativando a variável de ambiente FRONTEND_CUSTOM=True (vide
**Deste ponto em diante, é exigido o conhecimento que você pode adquirir em https://cli.vuejs.org/guide/ e em https://vuejs.org/v2/guide/ para colaborar com sapl-frontend**
**Deste ponto em diante, é exigido o conhecimento que você pode adquirir em https://cli.vuejs.org/guide/ e em https://vuejs.org/v2/guide/ para colaborar com sapl-frontend**
**OBS: após a separação do sapl para o sapl-frontend, o conteúdo da pasta static é compilado e minificado. É gerado pelo build do sapl-frontend e não deve-se tentar customizar ou criar elementos manipulando diretamente informações na pasta static.**
Sobre a pasta static
--------------------
Após a separação do sapl em sapl e sapl-frontend, o conteúdo da pasta sapl/static/sapl/frontend é compilado e minificado. É gerado pelo build do sapl-frontend e não deve-se tentar customizar ou criar elementos manipulando diretamente informações na pasta sapl/static/sapl/frontend.
Para aplicar css e javascript sem sapl-frontend:
1) Não altere diretamente o conteúdo da pasta sapl/static/sapl/frontend. Isso deve ser feito no projeto sapl-frontend. Você perderá qualquer manipulação dentro desta pasta.
2) Caso venha a criar algum código css/js diretamente no django, crie seus arquivos na pasta sapl/static/sapl.
3) Não crie nenhum novo conteúdo na pasta sapl/static. Projetos Django podem ser usados como app de outro projeto. É o que ocorre com o Sapl, que é usado como uma app em outros projetos. Qualquer conteúdo colocado dentro sapl/static e não em sapl/static/sapl, pode estar causando erro no uso do Sapl como app em outro projeto.
Solr é a ferramenta utilizada pelo SAPL 3.1 para indexar documentos para que possa ser feita
**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).**
a Pesquisa Textual.
Adicione ao arquivo ``.env`` o seguinte atributo:
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).
``SOLR_URL = 'http://127.0.0.1:8983/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);
Dentro do diretório principal siga os seguintes passos::
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;
Após isso, deve-se parar o servidor do Solr e restartar com ``java -jar start.jar``
2) Descompacte o arquivo em uma pasta do diretório (referenciada neste tutorial como $SOLR_HOME)
**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.**
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)
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 'Pesquisa Textual' na tela de busca tradicional.
**Observações:**
* Para parar o Solr execute o comando **$SOLR_HOME/bin/solr stop**
* 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 <N>** : reindexa os documentos inseridos/alterados nas últimas <N> 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
field=models.CharField(choices=[('A','Sequencial por ano para cada autor'),('B','Sequencial por ano indepententemente do autor'),('L','Sequencial por legislatura'),('U','Sequencial único')],default='A',max_length=1,verbose_name='Sequência de numeração'),
field=models.CharField(choices=[('A','Sequencial por ano para cada autor'),('B','Sequencial por ano indepententemente do autor'),('L','Sequencial por legislatura'),('U','Sequencial único')],default='A',max_length=1,verbose_name='Sequência de numeração de proposições'),
),
migrations.AddField(
model_name='appconfig',
name='sequencia_numeracao_protocolo',
field=models.CharField(choices=[('A','Sequencial por ano para cada autor'),('L','Sequencial por legislatura'),('U','Sequencial único')],default='A',max_length=1,verbose_name='Sequência de numeração de protocolos'),
field=models.CharField(choices=[('A','Sequencial por ano para cada autor'),('B','Sequencial por ano indepententemente do autor')],default='A',max_length=1,verbose_name='Sequência de numeração de proposições'),
field=models.CharField(choices=[('A','Sequencial por ano'),('L','Sequencial por legislatura'),('U','Sequencial único')],default='A',max_length=1,verbose_name='Sequência de numeração de protocolos'),
field=models.TextField(default='',help_text='A cada Tipo de Texto Articulado pode ser adicionado uma nota global de rodapé!',verbose_name='Rodapé Global'),
default=0,help_text='A sequência regimental diz respeito ao que define o regimento da Casa Legislativa sobre qual a ordem de entrada das proposições nas Sessões Plenárias.',verbose_name='Sequência Regimental'),
options={'ordering':['sequencia_regimental','descricao'],'verbose_name':'Tipo de Matéria Legislativa','verbose_name_plural':'Tipos de Matérias Legislativas'},
field=models.CharField(blank=True,choices=[('A','Sequencial por ano para cada autor'),('B','Sequencial por ano indepententemente do autor'),('L','Sequencial por legislatura'),('U','Sequencial único')],max_length=1,verbose_name='Sequência de numeração'),
field=models.CharField(blank=True,choices=[('A','Sequencial por ano para cada autor'),('L','Sequencial por legislatura'),('U','Sequencial único')],max_length=1,verbose_name='Sequência de numeração'),
field=models.CharField(blank=True,choices=[('A','Sequencial por ano'),('L','Sequencial por legislatura'),('U','Sequencial único')],max_length=1,verbose_name='Sequência de numeração'),