Fecha o gap entre o protocolo e a pendencia no app (ADR 0014): o post_save
de MateriaLegislativa grava uma marca leve (MateriaParaMaterializar) e o
laco, que agora acorda a cada --tick (15s), converte so as marcadas entre
uma varredura completa e outra (--intervalo, 300s, rede de seguranca).
O request nunca converte (dono unico da conversao, refinamento 5.1), o
lock unico de passada segue valendo para laco, tick e botao, e o painel
mostra a fila aguardando o proximo tick.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* 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>