Substitui o polling HTTP do painel legislativo por push via WebSockets
(um PainelConsumer por sessão, broadcast de snapshot completo a partir
de build_dados_painel()) e cobre com páginas Vue 2 + Pinia as telas de
exibição pública do painel, votação nominal, voto individual, votação
simbólica e leitura de matéria — todas consumindo o mesmo broadcast via
normalizePainelData()/painelStore, sem componentes Vuex remanescentes.
- Backend: PainelConsumer/ASGI (Channels + Redis), views Postgres
(SessaoPresencasView/SessaoMateriasVotacoesView) para eliminar N+1,
cronômetro com estado compartilhado em cache, migrations 0070-0073
como cadeia única.
- Máscara de voto preservada: o broadcast público continua sempre
mascarado por mostrar_voto; estado por-operador e por-eleitor vem de
endpoints HTTP dedicados (votante_status, _status_json), nunca do
broadcast compartilhado.
- Infra: docker-compose e nginx atualizados para /ws/, requirements
(channels/daphne/channels-redis) e vue.config.js com as novas entries
de webpack.
- Testes: test_broadcasts.py, test_consumers.py, test_votacao_nominal.py
e test_sessao_view.py cobrindo o novo backend.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H85beqPY6uKTmSdCEovbPa
Painel: remove polling fallback, WS-only with connection error UI
Documents local-dev setup requirements in sapl/sessao/README.md and
finishes the polling->push migration by removing the HTTP polling that
was still running as a fallback everywhere: the three legacy templates
(painel/index.html, voto_individual.html, sessao/votacao/nominal.html)
and voto-individual/main.js. Every painel/votação screen — legacy and
Vue — is now WebSocket-only.
- Reconnect: exponential backoff with jitter (was flat 500ms in Vue),
and connections now distinguish PainelConsumer's permanent close codes
(4401/4403/4404 — auth/permission/no-such-sessão) from transient drops
instead of retrying forever. New frontend/src/__apps/painel/ws/
painelSocket.js + WsStatusBanner.vue share this across the five Vue
apps; the three legacy templates get an equivalent vanilla-JS banner.
- Broadcast coverage: without polling to mask it, every write path that
changes the painel payload now has to call broadcast_dados_painel()
itself. Added it to PresencaView/PresencaOrdemDiaView, the three
Orador*Crud create/update/delete views (via a new
BroadcastPainelOnSaveMixin — covered by a new end-to-end test, since
self.kwargs['pk'] means the parent sessão in CreateView but the
Orador's own pk in Update/DeleteView), LeituraEmBloco, and
VotacaoEmBlocoSimbolicaView/VotacaoEmBlocoNominalView.
- voto_individual.html now opens its WebSocket whenever a sessão is
open (not just when a matéria is), gated on sessao_id being present
rather than on materia — otherwise a page with no votação aberta at
all had no sessao_id to build a WS URL from.
- Dead code removed: painel_mensagem/painel_parlamentar/painel_votacao
(views, urls, templates) had no references anywhere and predate this
work. dados_painel/get_dados_painel (the HTTP polling endpoint) and
its ETag helper are also removed now that nothing polls them, along
with the tests pinning their HTTP-specific behavior — build_dados_painel()
itself is untouched and still backs every WS broadcast.
- scripts/verify_painel_websockets.sh now runs a single Daphne process
instead of Daphne+runserver on separate ports: WS-only clients need
HTTP and WS on the same origin, which the old split-port setup never
actually provided (it only appeared to work via the polling fallback
that's now gone).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H85beqPY6uKTmSdCEovbPa
* Retorna último bump
* Atualiz de versões do front e impactos no código
Atualiza versões secundárias e de remendos x.Y.Z
Atualiza versões secundárias (minor version x.Y.z)
e de remendos (patch version x.y.Z)
em conjunto das libs de menor impacto no frontend.
Syncs webpack-bundle-tracker django-webpack-loader
A primeira delas é do frontend já a segunda é do backend.
Elas fazem a ponte entre o front e back. A primeira faz um catálogo
(webpack-stats-json) de todo material compilado para produção pelo webpack.
Em tempo de desenvolvimento, esses catálogo não possui referências para
arquivos, mas para urls do servidor de desenvolvimento do frontend.
Já a segunda, lê todo o material produzido pela primeira, disponibiliza
filters para acesso geral, modular ou diretamente a arquivos
específicos.
bump vs secundária do vue e vue-template-compiler
Já existe atualização de versão primária do VueJs mas atualizá-la algo
em ~3.0.0 exige revisão, refatoração e/ou reimplementação de código.
vue-template-compiler anda junto com vue e é usado para possui compilar
container pre-alimentado no backend como é o caso de:
https://github.com/interlegis/sapl/blob/3.1.x/sapl/templates/parlamentares/parlamentares_list.html
migra libs para devDependencies
bump version frontend
* Movendo package.json para root do projeto
* Consertando algumas referencias
* Removendo arquivos do frontend/ que foram transferidos para o root
* Force build copy frontend/public-->sapl/static/...
* Rebuild frontend com arq de cfg na raiz do projeto
Co-authored-by: Leandro Roberto <leandroroberto.br@gmail.com>