mirror of https://github.com/interlegis/sapl.git
4 changed files with 315 additions and 6 deletions
@ -0,0 +1,54 @@ |
|||
|
|||
# Websockets |
|||
|
|||
Rodar o container antes de iniciar o SAPL: |
|||
|
|||
```commandline |
|||
sudo docker run --rm -p 6379:6379 redis:7-alpine redis-server --save "" --appendonly no |
|||
``` |
|||
|
|||
Executar o SAPL |
|||
|
|||
Instalar dependências do Websockets e Redis: |
|||
|
|||
```commandline |
|||
pip install -r requirements/dev-requirements.txt |
|||
``` |
|||
|
|||
Abrir um terminal e rodar `yarn` para servir as páginas VueJS: |
|||
|
|||
```commandline |
|||
yarn serve |
|||
``` |
|||
|
|||
Executar o SAPL (duas formas): |
|||
|
|||
DAPHNE: |
|||
|
|||
Em outro terminal, no diretório raiz, execute como Daphne abaixo: |
|||
```commandline |
|||
daphne -b 127.0.0.1 -p 8000 sapl.asgi:application |
|||
``` |
|||
|
|||
Daphne é excelente para debugar a parte de WebSockets, pois contém melhores mensagens de erro e log. |
|||
O runserver geralmente só vai dar crash ou falhar ao enviar as mensagens via WebSocket. |
|||
|
|||
**MAS atenção: Daphne não faz reload automático após mudanças na página!** |
|||
|
|||
Para isso é que parar e reiniciar o Daphne ou usar `.manage.py runserver` |
|||
|
|||
|
|||
RUNSERVER: |
|||
Em outro terminal, no diretório raiz, execute como Daphne abaixo para debugar os websockets (melhores mensagens de log) |
|||
```commandline |
|||
./manage.py runserver |
|||
``` |
|||
|
|||
Logar no SAPL e acessar a página `http://localhost:8000/painel/v2` |
|||
|
|||
|
|||
Ferramentas: |
|||
|
|||
`wscat`: permite fazer chamadas a websockets via CLI, mas para acessar o WS endpoint do painel precisa estar autenticado. |
|||
|
|||
**Redis Insight:** GUI que é tipo um pgAdmin para o Redis; |
|||
@ -0,0 +1,255 @@ |
|||
# Generated by Django 2.2.28 on 2025-11-17 17:55 |
|||
|
|||
from django.db import migrations |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('sessao', '0069_auto_20220919_1705'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.RunSQL( |
|||
""" |
|||
CREATE OR REPLACE VIEW sessao_presenca_view AS |
|||
-- |
|||
-- PRESENCAS DE PARLAMENTARES COM FILIACAO (SE HOUVER) |
|||
-- MANDATO DEVE ESTAR ATIVO NA LEGISLATIURA |
|||
-- PARLAMENTAR DEVE ESTAR ATIVO |
|||
-- |
|||
-- EXPEDIENTE |
|||
SELECT |
|||
p.id, |
|||
presenca.sessao_plenaria_id, |
|||
'expediente' AS etapa_sessao, |
|||
p.id as parlamentar_id, |
|||
p.nome_parlamentar as nome_parlamentar, |
|||
COALESCE(af.sigla, 'SEM PARTIDO') AS filiacao |
|||
FROM sessao_sessaoplenariapresenca AS presenca |
|||
JOIN sessao_sessaoplenaria AS sp |
|||
ON presenca.sessao_plenaria_id = sp.id |
|||
JOIN parlamentares_parlamentar AS p |
|||
ON presenca.parlamentar_id = p.id |
|||
JOIN parlamentares_mandato AS m |
|||
ON p.id = m.parlamentar_id |
|||
AND m.legislatura_id = sp.legislatura_id |
|||
AND m.data_inicio_mandato <= sp.data_inicio |
|||
AND (m.data_fim_mandato IS NULL OR m.data_fim_mandato >= sp.data_inicio) |
|||
-- recupera uma filiacao partidaria, se existir |
|||
LEFT JOIN LATERAL ( |
|||
SELECT pa.sigla |
|||
FROM parlamentares_filiacao f |
|||
JOIN parlamentares_partido pa ON pa.id = f.partido_id |
|||
WHERE f.parlamentar_id = p.id |
|||
AND f.data <= sp.data_inicio |
|||
AND (f.data_desfiliacao IS NULL OR f.data_desfiliacao >= sp.data_inicio) |
|||
ORDER BY f.data DESC |
|||
LIMIT 1 |
|||
) AS af ON TRUE |
|||
WHERE p.ativo = TRUE |
|||
|
|||
UNION ALL |
|||
|
|||
-- ORDEM DO DIA |
|||
SELECT |
|||
p.id, |
|||
presenca.sessao_plenaria_id, |
|||
'ordemdia' AS etapa_sessao, |
|||
p.id as parlamentar_id, |
|||
p.nome_parlamentar as nome_parlamentar, |
|||
COALESCE(af.sigla, 'SEM PARTIDO') AS filiacao |
|||
FROM sessao_presencaordemdia AS presenca |
|||
JOIN sessao_sessaoplenaria AS sp |
|||
ON presenca.sessao_plenaria_id = sp.id |
|||
JOIN parlamentares_parlamentar AS p |
|||
ON presenca.parlamentar_id = p.id |
|||
JOIN parlamentares_mandato AS m |
|||
ON p.id = m.parlamentar_id |
|||
AND m.legislatura_id = sp.legislatura_id |
|||
AND m.data_inicio_mandato <= sp.data_inicio |
|||
AND (m.data_fim_mandato IS NULL OR m.data_fim_mandato >= sp.data_inicio) |
|||
-- recupera uma filiacao partidaria, se existir |
|||
LEFT JOIN LATERAL ( |
|||
SELECT pa.sigla |
|||
FROM parlamentares_filiacao f |
|||
JOIN parlamentares_partido pa ON pa.id = f.partido_id |
|||
WHERE f.parlamentar_id = p.id |
|||
AND f.data <= sp.data_inicio |
|||
AND (f.data_desfiliacao IS NULL OR f.data_desfiliacao >= sp.data_inicio) |
|||
ORDER BY f.data DESC |
|||
LIMIT 1 |
|||
) AS af ON TRUE |
|||
WHERE p.ativo = TRUE |
|||
ORDER BY sessao_plenaria_id, etapa_sessao, nome_parlamentar |
|||
""" |
|||
), |
|||
migrations.RunSQL( |
|||
""" |
|||
CREATE OR REPLACE VIEW sessao_orador_view AS |
|||
-- |
|||
-- ORADORES DE ORDEMDIA/EXPEDIENTE |
|||
-- * PARLAMENTARES ATIVOS |
|||
-- |
|||
SELECT od.id, |
|||
sessao_plenaria_id, |
|||
'ordemdia' as etapa_sessao, |
|||
numero_ordem as ordem_pronunciamento, |
|||
parlamentar_id, |
|||
nome_parlamentar, |
|||
COALESCE(af.sigla, 'SEM PARTIDO') AS filiacao |
|||
FROM sessao_oradorordemdia od |
|||
JOIN sessao_sessaoplenaria sp ON (od.sessao_plenaria_id = sp.id) |
|||
JOIN parlamentares_parlamentar p ON (od.parlamentar_id = p.id) |
|||
-- recupera uma filiacao partidaria, se existir |
|||
LEFT JOIN LATERAL ( |
|||
SELECT pa.sigla |
|||
FROM parlamentares_filiacao f |
|||
JOIN parlamentares_partido pa ON pa.id = f.partido_id |
|||
WHERE f.parlamentar_id = p.id |
|||
AND f.data <= sp.data_inicio |
|||
AND (f.data_desfiliacao IS NULL OR f.data_desfiliacao >= sp.data_inicio) |
|||
ORDER BY f.data DESC |
|||
LIMIT 1 |
|||
) AS af ON TRUE |
|||
AND p.ativo = TRUE |
|||
UNION ALL |
|||
SELECT ex.id, |
|||
sessao_plenaria_id, |
|||
'expediente' as etapa_sessao, |
|||
numero_ordem as ordem_pronunciamento, |
|||
parlamentar_id, |
|||
nome_parlamentar, |
|||
COALESCE(af.sigla, 'SEM PARTIDO') AS filiacao |
|||
FROM sessao_oradorexpediente ex |
|||
JOIN sessao_sessaoplenaria sp ON (ex.sessao_plenaria_id = sp.id) |
|||
JOIN parlamentares_parlamentar p on (ex.parlamentar_id = p.id) |
|||
-- recupera uma filiacao partidaria, se existir |
|||
LEFT JOIN LATERAL ( |
|||
SELECT pa.sigla |
|||
FROM parlamentares_filiacao f |
|||
JOIN parlamentares_partido pa ON pa.id = f.partido_id |
|||
WHERE f.parlamentar_id = p.id |
|||
AND f.data <= sp.data_inicio |
|||
AND (f.data_desfiliacao IS NULL OR f.data_desfiliacao >= sp.data_inicio) |
|||
ORDER BY f.data DESC |
|||
LIMIT 1 |
|||
) AS af ON TRUE |
|||
AND p.ativo = TRUE |
|||
ORDER BY sessao_plenaria_id, etapa_sessao, ordem_pronunciamento |
|||
""" |
|||
), |
|||
migrations.RunSQL( |
|||
""" |
|||
CREATE OR REPLACE VIEW sessao_materias_votacoes_view AS |
|||
-- |
|||
-- Votacao/Leitura de Materias |
|||
-- |
|||
|
|||
-- EXPEDIENTE |
|||
WITH votacao_materias AS ( |
|||
SELECT em.sessao_plenaria_id, |
|||
em.id id, |
|||
'expediente' etapa_sessao, |
|||
em.numero_ordem, |
|||
em.materia_id, |
|||
ml.ementa, |
|||
tipo_votacao, |
|||
CASE tipo_votacao |
|||
WHEN 1 THEN 'Simbólia' |
|||
WHEN 2 THEN 'Nominal' |
|||
WHEN 3 THEN 'Secreta' |
|||
WHEN 4 THEN 'Leitura' |
|||
ELSE '' |
|||
END as tipo_votacao_descricao, |
|||
resultado_votacao, |
|||
em.resultado, |
|||
total_votos, |
|||
votos_parlamentares, |
|||
votacao_aberta |
|||
FROM sessao_expedientemateria em |
|||
JOIN materia_materialegislativa ml ON (em.materia_id = ml.id) |
|||
LEFT JOIN sessao_registroleitura rl on (rl.expediente_id = em.id) |
|||
LEFT JOIN LATERAL ( |
|||
SELECT jsonb_build_object( |
|||
'sim', coalesce(rv.numero_votos_sim, 0), |
|||
'não', coalesce(rv.numero_votos_nao, 0), |
|||
'abstencoes', coalesce(rv.numero_abstencoes, 0) |
|||
) as total_votos, |
|||
trv.nome resultado_votacao |
|||
FROM sessao_registrovotacao rv |
|||
JOIN sessao_tiporesultadovotacao trv on (rv.tipo_resultado_votacao_id = trv.id) |
|||
WHERE rv.expediente_id = em.id AND tipo_votacao != 4) rv ON TRUE |
|||
LEFT JOIN LATERAL ( |
|||
SELECT em.sessao_plenaria_id, |
|||
em.numero_ordem, |
|||
jsonb_agg(jsonb_build_object( |
|||
'materia_id', em.materia_id, |
|||
'parlamentar_id', vp.parlamentar_id, |
|||
'parlamentar_nome', p.nome_parlamentar, |
|||
'voto', vp.voto |
|||
) ORDER BY em.materia_id) as votos_parlamentares |
|||
FROM sessao_votoparlamentar vp |
|||
JOIN parlamentares_parlamentar p ON (vp.parlamentar_id = p.id) |
|||
WHERE vp.expediente_id = em.id AND em.tipo_votacao != 4 |
|||
GROUP BY em.sessao_plenaria_id, em.numero_ordem |
|||
ORDER BY em.sessao_plenaria_id, em.numero_ordem |
|||
) vp ON TRUE |
|||
|
|||
UNION ALL |
|||
|
|||
-- ORDEM DIA |
|||
SELECT od.sessao_plenaria_id, |
|||
od.id id, |
|||
'ordemdia' etapa_sessao, |
|||
od.numero_ordem, |
|||
od.materia_id, |
|||
ml.ementa, |
|||
tipo_votacao, |
|||
CASE tipo_votacao |
|||
WHEN 1 THEN 'Simbólia' |
|||
WHEN 2 THEN 'Nominal' |
|||
WHEN 3 THEN 'Secreta' |
|||
WHEN 4 THEN 'Leitura' |
|||
ELSE '' |
|||
END as tipo_votacao_descricao, |
|||
resultado_votacao, |
|||
od.resultado, |
|||
total_votos, |
|||
votos_parlamentares, |
|||
votacao_aberta |
|||
FROM sessao_ordemdia od |
|||
JOIN materia_materialegislativa ml ON (od.materia_id = ml.id) |
|||
LEFT JOIN sessao_registroleitura rl on (od.id = rl.expediente_id) |
|||
LEFT JOIN LATERAL ( |
|||
SELECT jsonb_build_object( |
|||
'sim', coalesce(rv.numero_votos_sim, 0), |
|||
'não', coalesce(rv.numero_votos_nao, 0), |
|||
'abstencoes', coalesce(rv.numero_abstencoes, 0) |
|||
) as total_votos, |
|||
trv.nome resultado_votacao |
|||
FROM sessao_registrovotacao rv |
|||
JOIN sessao_tiporesultadovotacao trv on (rv.tipo_resultado_votacao_id = trv.id) |
|||
WHERE rv.expediente_id = od.id AND tipo_votacao != 4) rv ON TRUE |
|||
LEFT JOIN LATERAL ( |
|||
SELECT od.sessao_plenaria_id, |
|||
od.numero_ordem, |
|||
jsonb_agg(jsonb_build_object( |
|||
'materia_id', od.materia_id, |
|||
'parlamentar_id', vp.parlamentar_id, |
|||
'parlamentar_nome', p.nome_parlamentar, |
|||
'voto', vp.voto |
|||
) ORDER BY od.materia_id) as votos_parlamentares |
|||
FROM sessao_votoparlamentar vp |
|||
JOIN parlamentares_parlamentar p ON (vp.parlamentar_id = p.id) |
|||
WHERE vp.expediente_id = od.id AND od.tipo_votacao != 4 |
|||
GROUP BY od.sessao_plenaria_id, od.numero_ordem |
|||
ORDER BY od.sessao_plenaria_id, od.numero_ordem |
|||
) vp ON TRUE |
|||
) |
|||
SELECT * |
|||
FROM votacao_materias |
|||
ORDER BY sessao_plenaria_id, etapa_sessao, numero_ordem |
|||
""" |
|||
) |
|||
] |
|||
Loading…
Reference in new issue