MateriaLegislativaCrud.DetailView and SessaoCrud.DetailView are the two
highest-traffic public views not yet covered by anonymous page caching.
Both are read-only for anonymous visitors, making them safe cache targets.
- MateriaLegislativaCrud.DetailView: 300s TTL (PAGE_CACHE_TTL_DETAIL)
- SessaoCrud.DetailView: 120s TTL (PAGE_CACHE_TTL_LIST — sessions update
more frequently during active legislative sittings)
NormaCrud.DetailView intentionally left uncached: it writes NormaEstatisticas
on every access, and caching would suppress per-visit statistics for anonymous
users.
Also includes the RATELIMIT_DRY_RUN=False docker-compose.yaml change
from the previous session (rate limiting now enforced in docker-compose).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GeoIP (docker/Dockerfile):
Remove at-build-time MaxMind download (required BuildKit secrets, caused
cache-miss issues). Replace with COPY from docker/geoip/GeoLite2-ASN.mmdb
(git-ignored binary). If absent, build succeeds with ASN blocking disabled.
Add docker/geoip/update_geoip.sh — run before each build to refresh the
database from MaxMind using MAXMIND_LICENSE_KEY from env or .env file.
Redis inspection / synthetic test data:
Add docker/scripts/redis_populate_test_data.py — injects synthetic rl:*
entries into Redis DB1 to validate key schema and blocking thresholds
without waiting for real traffic. Supports DRY_RUN and CLEAR modes.
Add §4.5 (Redis CLI quick-reference + RedisInsight guide) to rate-limiter-v2.md.
Auth-aware @ratelimit decorators (smart_rate / smart_key):
All 51 @ratelimit decorators across 9 files used rate=RATE_LIMITER_RATE
(35/m) regardless of authentication, silently over-throttling logged-in
users compared to what RateLimitMiddleware allows (120/m).
Add smart_key() and smart_rate() to sapl/middleware/ratelimit.py:
- smart_key: user pk for authenticated requests, masked IP for anon
- smart_rate: RATE_LIMITER_RATE_AUTHENTICATED (120/m) for auth,
RATE_LIMITER_RATE (35/m) for anon — mirrors middleware thresholds
Update all 51 decorators across crud/base.py + 8 view files.
Remove now-unused RATE_LIMITER_RATE imports from those files.
Cache KEY_PREFIX (settings.py):
Change KEY_PREFIX from POD_NAMESPACE ("sapl") to f"cache:{POD_NAMESPACE}"
so DB0 cache keys are unambiguously prefixed cache:{ns}:* — distinct from
any future static or file cache key patterns.
Update key schema table and code examples in rate-limiter-v2.md to match.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Import fixes (all three imported get_client_ip/ratelimit_ip from sapl.utils
which no longer exports them — causing the ImportError at startup):
- sapl/materia/forms.py: move get_client_ip to sapl.middleware.ratelimit
- sapl/materia/views.py: move get_client_ip + ratelimit_ip; keep
RATE_LIMITER_RATE in sapl.settings (used by @ratelimit decorators)
- sapl/base/views.py: same pattern as materia/views.py
Docs:
- rate-limiter-v2.md: remove Phase 5 section (§8); renumber Open Questions
to §8; update Table of Contents
- work_queues.md (new): Async PDF via Celery + Django Channels WebSocket
voting panel, with full context, Redis B topology rationale, k8s manifest
list, and open questions. Planned start: after rate-limiter-2026 is stable.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refact: cria método get_proximo_numero
* feat: impl numeração automática em cadastros via API
* Update sapl/materia/models.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update sapl/api/serializers.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update sapl/api/views_materia.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update sapl/materia/models.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update sapl/materia/models.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Add transaction atomic no endpoint create
* add validação de tipo se tipo não é objeto do model TipoMateriaLegislativa
* refact: aplica solicitações de reviewer e cria testes
* fix: altera numero_preferido para numero_candidato
* fix: remove espaços entre classes
* fix: corrige uso de transaction e ausencia dele
* fix: corrige testes devido mudança de norme de variável
* fix: altera seleção para select_for_update
* fix: mudança de nome remanescente para numero_candidato
* fix: retorna decorator na view function recuperar_materia
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Ajusta link do texto original da Matéria
A url gerada não está localizando o arquivo do Texto Original da matéria, o que é consertado inserindo "/media/" na composição do link.
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.
* Update instalacao31.rst
* Update instalacao31.rst
* Update instalacao31.rst
* Update instalacao31.rst
* Update instalacao31.rst
* #3672 feat: Rotinas implementada para ordernar a materia pela sequencia regimental
* #3672 feat: Alterado o campo para indicar a ordem da materia
* #3675 Incluido Hiperlink para abrir as correspondencia e matérias em outra aba o navegador
* #3672 Correções finalizadas, conforme solicitado.
---------
Co-authored-by: Roberio (Camara de Sapezal) <roberio@sapezal.mt.leg.br>
Co-authored-by: Edward <9326037+edwardoliveira@users.noreply.github.com>
* revert: remove url model_list deprecated de api
* impl: isola api para futura transf em interlegis/drfautoapi
* refactor: ref sapl/api para impl drfautoapi
* elimina viewset.py
* separa customização de classes em modulos
* cria class method import_modules
* cria class method router()
* altera nome de classmethod
* elimina endpoint obsoleto e migra outro"
* migra endpoint deprecated para drfautoapi
* migra endpoint .../provaveis para drfautoapi
* migra endpoint api/autor para drfautoapi
* rebuild frontend
* inclui em drfautoapi a construção individual para models
* insere field tramitacao_origem_fixa
* ajusta default para True do field tramitacao_origem_fixa
* adiciona tramitacao_origem_fixa ao form de Configurações da aplicação
* refatora form e view materia para tramitacao_origem_fixa
* altera help text de tramitacao_origem_fixa
- Remove a analise de vínculos cíclicos na construção inicial
do form do filterset.
- O item anterior deve resolver o timeout causado na abertura da
anexação em lote, no entanto os timeouts do nginx e gunicorn foram
aumentados.
* add model OperadorAutor
* refatora autor e impl form e view para operadores
* refatora AutorForm para seleção de usuários
* remove OperadorAutorCrud
* restrige usuários na lista de operadores
* ajusta qs p/ lista de usuários em autor
* add listview com pesquisa para autores
* remove pesquisa independente de autores
* ajustes no filtro de autores e display de operadores
* refatora restrições de usuário em proposição
* corrige exclusão de vinculo de usuário votante
* impl edição de votante e autor para usuário
* corrige run python em migration
* organia imports em sapl/base/forms.py
* add restrição de user ativo na lista de user de autor
* corrige erro apontado por test_str_sanity
* ajusta teste de criação de proposição
* ajusta erro apontado em rules/test_rules
* alterações de IDE
* Refatora forms de acomp via email e recup de senha
Implementa mixin de registro de email para encaminhamento de emails com
google recaptcha.
* Impl registro do Google Recaptcha
* Substitui urllib3 por requests
Co-authored-by: eribeiro <edwardr@senado.leg.br>
Adiciona novas entradas no menu tabela aux
Adiciona form pesquisa
Adiciona template pesquisa e resultados
Adiciona view pesquisa
Altera template status tram detail
Atualiza url sucesso delete status tram
Co-authored-by: Vinícius Cantuária <cantuariavc@gmail.com>
* refatora auditlog para post_save e post_delete generico
* muda teste para captura de auth.User
* ignora auditlog se sender não faz parte das apps do sapl
* corrige teste de sender a ser ignorado
* retira audit_log dos saves executados dentro de migrate
* corrige código para erros apontados no travis no ultimo commit
* Gera arquivos PDF e Zip em memória
* Apagando compilado de pdf após ser utilizado em documentos acessórios
* Gera PDFs em memória
* Gera PDFs em memória
Co-authored-by: eribeiro <edwardr@senado.leg.br>
Co-authored-by: ulyssesBML <ulysses3353@gmail.com>
* 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>