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
* Adiciona script para restaurar a base de dados e migra-lá sem erros
Separa comando em funções
Finaliza script
Adiciona alerta de operação
Troca interpretador para facilitar portabilidade
Adiciona getopts para pegar parâmetros
Adiciona alerta para migração
Adiciona mensagem de uso com erro
Corrige verificação de parâmetros
Corrige confirmação de operação
Corrige verificações e criações de diretórios de log
Adiciona parada quando há erro na restauração
Adiciona criação da role postgres
Altera padrão de nome para arquivos de logs
Altera nome de função
Corrige configuração de parâmetros
Altera espaços por \t
Altera nomes dos diretórios para as restaurações
Adiciona diretório restauracoes no gitignore
Adiciona usuário da base de dados
Corrige restauração da base de dados
Corrige verificação do esquema public
Corrige verificação da role postgres
* Update scripts/restore_db.sh
Co-authored-by: Edward <9326037+edwardoliveira@users.noreply.github.com>
* Aprimorando script check_migrations.sh para executa-lo de qualquer pasta do repositório
Signed-off-by: Eliseu Egewarth <eliseuegewarth@gmail.com>
* Movendo script check_migrations.sh para a pasta scripts
Signed-off-by: Eliseu Egewarth <eliseuegewarth@gmail.com>
* Atualizando caminho do arquivo check_migrations.sh em .travis.yml e hooks/pre-commit
Signed-off-by: Eliseu Egewarth <eliseuegewarth@gmail.com>
* Modificando script fix_qa.sh para executar sempre na raiz do repositório
Signed-off-by: Eliseu Egewarth <eliseuegewarth@gmail.com>
* Movendo script fix_qa.sh para a pasta scripts/django/
Signed-off-by: Eliseu Egewarth <eliseuegewarth@gmail.com>
* Removendo caminho hard-coded do script redbaron
Signed-off-by: Eliseu Egewarth <eliseuegewarth@gmail.com>
* Adaptando script reset_all_migrations.sh. Sempre executará a partir da raiz do repositório
Signed-off-by: Eliseu Egewarth <eliseuegewarth@gmail.com>
* Adaptando script gerar_grafico_apps.sh
Signed-off-by: Eliseu Egewarth <eliseuegewarth@gmail.com>
* Alterando scripts de QA para executar sempre na raiz do projeto
Signed-off-by: Eliseu Egewarth <eliseuegewarth@gmail.com>
* Fix QA script auto reference
Signed-off-by: Eliseu Egewarth <eliseuegewarth@gmail.com>
* Inicia a reestruturação
* Adiciona lógica para aparecer ou esconder caixa de seleção de parlamentares
* Cria o campo de data de inicio do mandato
* Adiciona campo de inicio de mandato nos forms e details
* Cria logica para mostrar somente os ativos
* Finaliza as melhorias em Frente
* Tira obrigatoriedade do campo Data Inicio de Mandato
* Conserta teste de mandato
* Coloca FK para ProtocoloAdm em DocAdm e faz script de substituicao
* Trata e salva o Protocolo na criação e edição de DocAdm
* Mostra documentos relacionados ao protocolo ordenados
* Adiciona Protocolo a listagem de Docs Adm
- Grupos foram definidos em sapl.rules.__init__.py
- as Regras que relac grupos e permissões estão
sapl.rules.map_rules.py
- em sapl.rules.apps.py estão dois signals post_migrate que indicam
ao django tarefas a serem feias após a migração, são elas:
- adicionar duas rules além das padrões do django, list e detail.
- carregar as rules_patterns definidas em map_rules e criar os
grupos referentes e, em modo debug criar alguns usuários relevantes.
- adiciona testes de validação das rules que:
- testa se todos os grupos definidos estão em rules_patterns
- testa se todos os models do SAPL estão na rules_patterns
- testa se todas as permissões adicionadas em rules_patterns foram
definidas nas classes Meta de cada model
* Ref Autor, TipoAutor, cria app api DRF
- Autor e TipoAutor migrados para app base.
- Foram refatorados para GR - Generic Relations
- Em TipoAutor: passou se a apontar também para um ContentType que
é usado para contextualização de dados da GR em Autor.
- A captura da combo de ContentTypes é feita através do apontamento
reverso nos models que se queira disponibilizar conceitualmente como
Autor
- Em Autor: neste commit, o form de create está em desenvolvimento, com
o buscador de possiveis autores baseados na seleção do usuário de
TipoAutor que, se não possui ContentType, abre o campo nome para
insersão, se possui ContentType, abre caixa de busca com atualização
jquery de radiobox's para o usuário selecionar um possível autor.
- api rest: para a busca funcionar e como objetivo de futuras
implementações em DRF, a app api foi criada, anotada nas configurações
gerais de sapl.urls com o prefixo /api.
- na api foi criada a uma ListAPIView para pesquisa de possiveis autores
baseados no tipo autor enviado, url /api/autor/possiveis/?P<pk>[0-9]*)$
que sem pk devolve a lista de TipoAutor e, com pk, devolve a lista dos
registros ligados ao ContentType, filtrados pelo parametro q
* Ajusta front para busca por possiveis autores
Ajusta front e implementa SaplGenericRelation, uma customização que
adiciona o atributo fields_search que possibilita passar para qualquer
implementação de busca quais são os campos de busca padrão do do
GenericRelation
* Conc refatoração no Cada de Autor e Tipos de Autor
* Alt backend de perm e pag de drf e ref layout topo
* Add procedimento na alteração de username de Autor
Na edição de Autores foi adicionado o tratamento por opção do usuário do
que deve ser feito com o usuário que está sendo desvinculado no caso de
uma alteração do username de um Autor.
Foram dadas três opções:
1) Apenas retirar Perfil de Autor do Usuário que está sendo desvinculado
2) Retirar Perfil de Autor e desativar Usuário que está sendo desvinculado
3) Excluir Usuário
* Add field cargo em AutorForm para tipos sem CT
Cadastro de Autores de Tipos sem ContentType podem adicionar nome, cargo
e usuário.
* Add Bloco, Bancada, Frente possíveis Tip de Autores
* Corrige frase de mensagem no cadastro de Autor
* ref buscador modal de Autores c pesq param reversa
* Add documentação e faz modificações na api/autor
* Ref Crud para Listar GenericRelations
* Ref List da aba Proposições para parlamentares
* Altera imports de teste na app materia
* Corrige comentários da classe AutorListView
* Customiza layout do drf docs.
* Altera criação do grp Autor para inc list e detail
* Remove customização do bootstrap
Após fork e ajustes feitos no tema drunken-parrot-ui-flat, alterações
feitas nos arquivos deste commit não são mais necessárias, passando a
ser renderizado os arquivos que são padrão da biblioteca
django-crispy-forms.
* Adequa inserção dinamica de radio ao crispy-forms
Na edição de Autores foi adicionado o tratamento por opção do usuário do
que deve ser feito com o usuário que está sendo desvinculado no caso de
uma alteração do username de um Autor.
Foram dadas três opções:
1) Apenas retirar Perfil de Autor do Usuário que está sendo desvinculado
2) Retirar Perfil de Autor e desativar Usuário que está sendo desvinculado
3) Excluir Usuário
O teste adicionado faz login com todos os perfis criados para testar os
grupos triviais. Segundo o mapa de usuários e prefixos de urls
permitidas, espera-se que não haja, ou haja, redirecionamento para login
mediante as configurações do mapa de usuários.
O mapa que serve tanto para o novo teste de conexão, quanto para o de
validação de prefixos de urls, é uma mapa base e não é absoluto.
Se algo novo for criado ou exitir uma alteração que não se encaixe no
mapa, o teste quebrará, portanto, caberá ao autor da inovação decidir
se, para passar pelo teste o mapa deve ser mudado, ou se algo deve ser
feito em sua implementação para se adequar ao mapa.
- Teste de padrão da url de telas auxiliares que implementam CrudAux
- Teste de presença da chamada de todos os CrudAux na interface de
Tabelas auxiliares.