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
Impl Mixin para gerar relatórios de pesquisas
MultiFormatOutputMixin sobrescreve render_to_response e, com base no
parametro format=[xlsx, csv, json], gerar versão não paginada dos
resultados de FilterView. O mixin foi aplicado na pesquisa de matérias e
de normas e pode ser extendido para outras filterview's ou mesmo
listviews, internas ao Crud.
* 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
- Rm drf-yasg e add drj-spectacular
- corrige schema de listagem
- ajusta urls para /api/schema, /api/schema/swagger-ui, api/schema/redoc
- insere na paginação links diretos de next e previous com filtro
* Fix#3138 - Iniciando etiqueta de materia legislativa
* Gerando pdf com codigo de barra e opção largura/altura
* Anexando etiqueta em Texto Articulado
* Adaptando pra ficar parecido com protocolo Fix #3138
* Colocando classe de configuração de etiqueta da materia no map rules
* Ajustando importações
* Melhorando a disposição dos elementos da etiqueta
* Mudando fontes da etiqueta
* Melhorando formato da etiqueta
* Limitando campo ementa para no maximo 200 caracteres em ementa de materia legislativa
* Aumenta um pouco mais o tam máx
Co-authored-by: eribeiro <edwardr@senado.leg.br>
* Fix #3127
* Adiciona merger de PDF
* Adiciona pypdf4 em requirements.txt
* Adicionando mensagem de erro caso não tenha documento acessório
* Subido algumas recomendações(logs, exceptions, localização de imports)
* Mudando maneira de pegar o diretorio tmp
* Concertando problema de css
* Arrumando mensagem de erro para quando todos os documentos acessorios não tem pdf cadastrados
* Generalizando tmp file para utils.py
* Adicionando logs de info e quebrando linhas grandes
Co-authored-by: eribeiro <edwardr@senado.leg.br>
Co-authored-by: ulysses <ulysses3353@gmail.com>
* Refatora num matérias por tipo
* Adaptação p/ caso que utiliza MateriaEmTramitacao
* Update sapl/utils.py
Co-Authored-By: Edward <9326037+edwardoliveira@users.noreply.github.com>
* Update sapl/utils.py
Co-Authored-By: Edward <9326037+edwardoliveira@users.noreply.github.com>
* Update utils.py
Co-authored-by: João Rodrigues <cont.joaorodrigues@gmail.com>
Co-authored-by: Edward <9326037+edwardoliveira@users.noreply.github.com>