Browse Source

Merge branch 'interlegis:3.1.x' into painel

pull/3814/head
Heitor 4 weeks ago
committed by GitHub
parent
commit
c7a1587a13
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 12
      docker/config/nginx/sapl.conf
  2. 21
      sapl/logging/filters.py
  3. 0
      sapl/middleware/__init__.py
  4. 0
      sapl/middleware/check_password.py
  5. 0
      sapl/middleware/endpoint_restriction.py
  6. 24
      sapl/middleware/request_id.py
  7. 8
      sapl/painel/views.py
  8. 18
      sapl/settings.py
  9. 11
      sapl/templates/painel/voto_individual.html

12
docker/config/nginx/sapl.conf

@ -4,6 +4,13 @@ upstream sapl_server {
} }
# Se o cliente já manda X-Request-ID, reaproveita; senão, usa $request_id (nginx)
map $http_x_request_id $req_id {
default $http_x_request_id;
"" $request_id;
}
server { server {
listen 80; listen 80;
@ -30,7 +37,9 @@ server {
return 204; return 204;
} }
proxy_set_header X-Request-ID $req_id;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host; proxy_set_header Host $http_host;
proxy_redirect off; proxy_redirect off;
proxy_pass http://sapl_server; proxy_pass http://sapl_server;
@ -45,10 +54,11 @@ server {
} }
location / { location / {
proxy_set_header X-Request-ID $req_id;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host; proxy_set_header Host $http_host;
proxy_redirect off; proxy_redirect off;
proxy_pass http://sapl_server; proxy_pass http://sapl_server;
} }

21
sapl/logging/filters.py

@ -0,0 +1,21 @@
# sapl/logging/filters.py
import logging
import contextvars
_request_id = contextvars.ContextVar("request_id", default="-")
def set_request_id(value: str):
_request_id.set(value)
def get_request_id() -> str:
return _request_id.get()
class RequestIdFilter(logging.Filter):
def filter(self, record: logging.LogRecord) -> bool:
# garante que SEMPRE existe
if not hasattr(record, "request_id"):
record.request_id = get_request_id()
return True

0
sapl/middleware/__init__.py

0
sapl/middleware.py → sapl/middleware/check_password.py

0
sapl/endpoint_restriction_middleware.py → sapl/middleware/endpoint_restriction.py

24
sapl/middleware/request_id.py

@ -0,0 +1,24 @@
import uuid
from sapl.logging.filters import set_request_id
HEADER_NAME = "HTTP_X_REQUEST_ID"
RESPONSE_HEADER = "X-Request-ID"
def _new_id():
return uuid.uuid4().hex
class RequestIdMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# recebe `request_id` do nginx ou do cliente senão cria um
request_id = request.META.get(HEADER_NAME) or _new_id()
request_id = str(request_id)[:64]
request.request_id = request_id
set_request_id(request_id)
response = self.get_response(request)
response[RESPONSE_HEADER] = request_id
return response

8
sapl/painel/views.py

@ -205,7 +205,7 @@ def votante_view(request):
username = request.user.username if request.user.is_authenticated else 'AnonymousUser' username = request.user.username if request.user.is_authenticated else 'AnonymousUser'
# Pega o votante relacionado ao usuário # Pega o votante relacionado ao usuário
template_name = 'painel/voto_nominal.html' template_name = 'painel/voto_individual.html'
context = {} context = {}
context_vars = {} context_vars = {}
@ -238,13 +238,15 @@ def votante_view(request):
if request.method == 'POST': if request.method == 'POST':
if context_vars['ordem_dia']: if context_vars['ordem_dia']:
try: try:
logger.info("user=" + username + ". Tentando obter objeto VotoParlamentar para parlamentar={} e ordem={}." logger.info("user=" + username + ". Tentando obter objeto VotoParlamentar para parlamentar={} e "
"ordem={}. "
.format(context_vars['parlamentar'], context_vars['ordem_dia'])) .format(context_vars['parlamentar'], context_vars['ordem_dia']))
voto = VotoParlamentar.objects.get( voto = VotoParlamentar.objects.get(
parlamentar=context_vars['parlamentar'], parlamentar=context_vars['parlamentar'],
ordem=context_vars['ordem_dia']) ordem=context_vars['ordem_dia'])
except ObjectDoesNotExist: except ObjectDoesNotExist:
logger.error("user=" + username + ". Erro ao obter VotoParlamentar para parlamentar={} e ordem={}. Criando objeto." logger.error("user=" + username + ". Erro ao obter VotoParlamentar para parlamentar={} e ordem={}. "
"Criando objeto. "
.format(context_vars['parlamentar'], context_vars['ordem_dia'])) .format(context_vars['parlamentar'], context_vars['ordem_dia']))
voto = VotoParlamentar.objects.create( voto = VotoParlamentar.objects.create(
parlamentar=context_vars['parlamentar'], parlamentar=context_vars['parlamentar'],

18
sapl/settings.py

@ -138,11 +138,12 @@ HAYSTACK_CONNECTIONS = {
} }
MIDDLEWARE = [ MIDDLEWARE = [
'sapl.middleware.request_id.RequestIdMiddleware',
'django_prometheus.middleware.PrometheusBeforeMiddleware', 'django_prometheus.middleware.PrometheusBeforeMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware', 'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'sapl.endpoint_restriction_middleware.EndpointRestrictionMiddleware', 'sapl.middleware.endpoint_restriction.EndpointRestrictionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
@ -150,7 +151,7 @@ MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', 'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware',
'waffle.middleware.WaffleMiddleware', 'waffle.middleware.WaffleMiddleware',
'sapl.middleware.CheckWeakPasswordMiddleware', 'sapl.middleware.check_password.CheckWeakPasswordMiddleware',
'django_prometheus.middleware.PrometheusAfterMiddleware', 'django_prometheus.middleware.PrometheusAfterMiddleware',
] ]
if DEBUG: if DEBUG:
@ -421,32 +422,37 @@ LOGGING = {
'require_debug_true': { 'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue', '()': 'django.utils.log.RequireDebugTrue',
}, },
'request_id': {
"()": 'sapl.logging.filters.RequestIdFilter',
},
}, },
'formatters': { 'formatters': {
'verbose': { 'verbose': {
'format': '%(levelname)s %(asctime)s ' + host + ' %(pathname)s %(name)s:%(funcName)s:%(lineno)d %(message)s' 'format': '%(levelname)s %(asctime)s [%(request_id)s] ' + host + '%(pathname)s %(name)s:%(funcName)s:%('
'lineno)d %(message)s '
}, },
'simple': { 'simple': {
'format': '%(levelname)s %(asctime)s - %(message)s' 'format': '%(levelname)s %(asctime)s [%(request_id)s] - %(message)s'
}, },
}, },
'handlers': { 'handlers': {
'console': { 'console': {
'level': 'INFO', 'level': 'INFO',
'class': 'logging.StreamHandler', 'class': 'logging.StreamHandler',
'filters': ['require_debug_true'], 'filters': ['request_id', 'require_debug_true'],
'formatter': 'simple', 'formatter': 'simple',
}, },
'console_verbose': { 'console_verbose': {
'level': 'DEBUG', 'level': 'DEBUG',
'class': 'logging.StreamHandler', 'class': 'logging.StreamHandler',
'filters': ['require_debug_true'], 'filters': ['request_id', 'require_debug_true'],
'formatter': 'verbose', 'formatter': 'verbose',
}, },
'applogfile': { 'applogfile': {
'level': 'INFO', 'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', 'class': 'logging.handlers.RotatingFileHandler',
'filename': 'sapl.log', 'filename': 'sapl.log',
'filters': ['request_id'],
'maxBytes': 1024 * 1024 * 15, # 15MB 'maxBytes': 1024 * 1024 * 15, # 15MB
'backupCount': 10, 'backupCount': 10,
'formatter': 'verbose', 'formatter': 'verbose',

11
sapl/templates/painel/voto_nominal.html → sapl/templates/painel/voto_individual.html

@ -132,9 +132,6 @@
{% render_bundle 'painel' 'js' %} {% render_bundle 'painel' 'js' %}
<script type="text/javascript"> <script type="text/javascript">
var d = new Date();
var n = d.toLocaleDateString();
document.getElementById("date").innerHTML = n;
$(window).on('beforeunload', function () { $(window).on('beforeunload', function () {
$("input[type=submit], input[type=button]").prop("disabled", "disabled"); $("input[type=submit], input[type=button]").prop("disabled", "disabled");
@ -177,12 +174,14 @@
m = checkTime(m); m = checkTime(m);
s = checkTime(s); s = checkTime(s);
$("#relogio").text(h+":"+m+":"+s) $("#relogio").text(h+":"+m+":"+s)
var t = setTimeout(function(){ var t = setInterval(() => startTime(), 500);
startTime()
}, 500);
} }
$(document).ready(function(){ $(document).ready(function(){
var d = new Date();
var n = d.toLocaleDateString();
$("#date").text(n);
startTime(); startTime();
setTimeout(function() { setTimeout(function() {
Loading…
Cancel
Save