diff --git a/core/middleware.py b/core/middleware.py index 45641e1f..538fc7cb 100644 --- a/core/middleware.py +++ b/core/middleware.py @@ -50,27 +50,31 @@ class AuthenticationMiddleware(DjangoAuthenticationMiddleware): def process_request(self, request): assert hasattr(request, "session"), ( "The Django authentication middleware requires session middleware " - "to be installed. Edit your MIDDLEWARE_CLASSES setting to insert " + "to be installed. Edit your MIDDLEWARE setting to insert " "'django.contrib.sessions.middleware.SessionMiddleware' before " "'account.middleware.AuthenticationMiddleware'." ) request.user = SimpleLazyObject(lambda: get_cached_user(request)) -class RequestMiddleware: +_threadlocal = threading.local() + + +def get_signal_request(): """ + !!! Do not use if your operation is asynchronus !!! Allow to access current request in signals This is a hack that looks into the thread - !!! Do not use if your operation is asynchronus !!! Mainly used for log purpose """ - def __init__(self, get_response, thread_local=threading.local()): + return getattr(_threadlocal, "request", None) + + +class SignalRequestMiddleware: + def __init__(self, get_response): self.get_response = get_response - self.thread_local = thread_local def __call__(self, request): - self.thread_local.current_request = request - - response = self.get_response(request) - return response + setattr(_threadlocal, "request", request) + return self.get_response(request) diff --git a/counter/signals.py b/counter/signals.py index 5dcbc39f..0f4fad70 100644 --- a/counter/signals.py +++ b/counter/signals.py @@ -26,7 +26,7 @@ from django.db.models.signals import pre_delete from django.dispatch import receiver from django.conf import settings -from core.middleware import RequestMiddleware +from core.middleware import get_signal_request from core.models import OperationLog from counter.models import Selling, Refilling, Counter @@ -34,13 +34,17 @@ from counter.models import Selling, Refilling, Counter def write_log(instance, operation_type): def get_user(): - request = RequestMiddleware(get_response=None).thread_local.current_request + request = get_signal_request() + + if not request: + return None # Get a random barmen if deletion is from a counter - session_token = request.session.get("counter_token", None) + session = getattr(request, "session", {}) + session_token = session.get("counter_token", None) if session_token: counter = Counter.objects.filter(token=session_token).first() - if counter: + if counter and len(counter.get_barmen_list()) > 0: return counter.get_random_barman() # Get the current logged user if not from a counter diff --git a/sith/settings.py b/sith/settings.py index 127c223e..fa2cb37e 100644 --- a/sith/settings.py +++ b/sith/settings.py @@ -106,7 +106,7 @@ MIDDLEWARE = ( "django.middleware.clickjacking.XFrameOptionsMiddleware", "django.middleware.security.SecurityMiddleware", "core.middleware.AuthenticationMiddleware", - "core.middleware.RequestMiddleware", + "core.middleware.SignalRequestMiddleware", ) ROOT_URLCONF = "sith.urls"