* fix(assinatura): materializacao do PDF-alvo sobe com o servico
O comando `materializar_pdfs_para_assinatura` era idempotente e "feito para
cron" — mas nada o agendava: nem crontab no repo, nem celery, nem timer, nem
entrada em /etc/cron.d na imagem. Na pratica virava passo manual de
implantacao, e a falha e MUDA: materia protocolada nunca vira pendencia no
app, sem erro nenhum, sem log. So aparece quando um vereador reclama que a
materia nao chegou para assinar.
- `--intervalo SEGUNDOS` no proprio comando. 0 (padrao) preserva a passada
unica da invocacao manual; maior que zero fica em laco. A logica ficou em
Python, e nao num `while true` de shell, para ser testavel, logar pelo
Django e sobreviver a passada que estoura — um laco que morre em silencio
seria o mesmo problema, so que mais dificil de achar.
- `start.sh` sobe o laco junto do gunicorn, ao lado de migrate_db e
create_admin. Onde a imagem subir, a rotina sobe. Intervalo por
MATERIALIZACAO_INTERVALO_SEGUNDOS, padrao 300s.
- compose de dev faz o mesmo, para o ambiente local nao divergir.
Testes: passada unica preservada, laco dorme entre passadas e nao retorna, e
laco sobrevive a passada que levanta excecao.
Refs: refinamento da assinatura §5/§5.1 (o doc ja previa "em cron na VPS" —
isto tira a dependencia de alguem lembrar de instalar).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Fix(Assinatura): pendencia carrega o id do keyset e PDF sumido nao derruba o lote AB#1473
Dois defeitos mudos no mesmo caminho, os dois cortando a pendencia antes de
ela chegar ao app:
1. `serializar_pendencia` nao emitia `id` no topo. O hub le exatamente esse
campo para avancar o cursor (PollerSapl.pollAssinaturasPendentes) e devolve
como `id_gt`, que a view filtra em `materia_id__gt`. Sem ele o cursor virava
string vazia e a fonte relia a primeira pagina para sempre. Vai o id da
MATERIA, nao o do registro de pendencia: o alvo e OneToOne e a view pagina
por materia_id. Mesmo tratamento na fonte de concluidas, onde o id e o
desempate do cursor composto (assinado_em, id).
2. Referencia no banco sem binario no MEDIA (969 materias em Franco, dump
restaurado sem a media) levantava OSError em `.size`/`.read()` e derrubava
a resposta INTEIRA do poll com 500 — uma materia podre travava a fonte para
todas as outras. Agora o item continua na lista com `documento` nulo, o
cursor anda e o buraco grita no log.
Testes: 61 passed em sapl/integracao_hub/tests/.
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
- Renomeia DEBUG para DJANGO_DEBUG nos docker-compose de dev,
alinhando com o que settings.py espera via python-decouple
- Corrige bug em menus.py onde itens com check_permission tinham
a URL limpa mesmo quando o usuário possuía a permissão,
causando o menu Sistema vazio
Signed-off-by: rangelbruno <rangelbruno@users.noreply.github.com>
- Adiciona botão "Editar com OnlyOffice" na detail de Matéria Legislativa
para administradores, operadores de matéria e protocolo
- Adiciona botão OnlyOffice na listagem e detail de Documento Acessório
- Refatora URLs do OnlyOffice usando SAPL_INTERNAL_URL para comunicação
entre containers Docker (evita URLs hardcoded)
- Centraliza lógica de URL em build_onlyoffice_url() e
get_onlyoffice_browser_url() no utils.py
- Altera URL padrão do OnlyOffice para https://onlyoffice.legisinc.com.br
- Configura JWT para autenticação com o servidor OnlyOffice remoto
- Remove serviço OnlyOffice local do docker-compose-dev-db.yml
Mudando docker/docker-compose.yml para dist/docker-compose.yml
Alteração no readme sobre a atualização do solr no docker
Mudança do caminho do solr no arquivo solr.rst