Skip to content

Commit 8cd2198

Browse files
committed
add cuser middleware
1 parent 01ebaf4 commit 8cd2198

File tree

4 files changed

+50
-33
lines changed

4 files changed

+50
-33
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from __future__ import unicode_literals
2+
import threading
3+
from django.contrib.auth import get_user_model
4+
5+
6+
class CuserMiddleware:
7+
_thread_local = threading.local()
8+
9+
def __init__(self, get_response):
10+
self.get_response = get_response
11+
12+
def __call__(self, request):
13+
try:
14+
self.__class__.set_user(request.user)
15+
response = self.get_response(request)
16+
return response
17+
finally:
18+
self.__class__.del_user()
19+
20+
@classmethod
21+
def get_user(cls, default=None):
22+
"""
23+
Retrieve user info
24+
"""
25+
return getattr(cls._thread_local, 'user', default)
26+
27+
@classmethod
28+
def set_user(cls, user):
29+
"""
30+
Store user info
31+
"""
32+
if isinstance(user, str):
33+
user_model = get_user_model()
34+
user = user_model.objects.get(username=user)
35+
cls._thread_local.user = user
36+
37+
@classmethod
38+
def del_user(cls):
39+
"""
40+
Delete user info
41+
"""
42+
if hasattr(cls._thread_local, 'user'):
43+
del cls._thread_local.user

tracking_fields/tests/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
"django.middleware.common.CommonMiddleware",
4747
"django.middleware.csrf.CsrfViewMiddleware",
4848
"django.contrib.auth.middleware.AuthenticationMiddleware",
49+
"tracking_fields.middleware.cuser.CuserMiddleware",
4950
"django.contrib.messages.middleware.MessageMiddleware",
5051
"django.middleware.clickjacking.XFrameOptionsMiddleware",
5152
)

tracking_fields/tests/tests.py

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import datetime
55
import json
66

7-
from cuser.middleware import CuserMiddleware
7+
from tracking_fields.middleware.cuser import CuserMiddleware
88
from django.contrib.auth.models import User
99
from django.contrib.contenttypes.models import ContentType
1010
from django.core.files import File
@@ -55,26 +55,6 @@ def test_create(self):
5555
assert human_event.user == self.user
5656
assert human_event.user_repr == self.user_repr
5757

58-
def test_update_without_cuser(self):
59-
"""
60-
Test the CREATE event without the cuser module
61-
"""
62-
from tracking_fields import tracking
63-
64-
tracking.CUSER = False
65-
self.human.age = 43
66-
self.human.save()
67-
events = TrackingEvent.objects.order_by("date").all()
68-
assert events.count() == 3
69-
human_event = events.last()
70-
assert human_event.date is not None
71-
assert human_event.action == UPDATE
72-
assert human_event.object == self.human
73-
assert human_event.object_repr == self.human_repr
74-
assert human_event.user is None
75-
assert human_event.user_repr == "None"
76-
tracking.CUSER = True
77-
7858
def test_update(self):
7959
"""
8060
Test the UPDATE event

tracking_fields/tracking.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import logging
66
import uuid
77

8+
from tracking_fields.middleware.cuser import CuserMiddleware
89
from django.contrib.contenttypes.models import ContentType
910
from django.core.exceptions import ObjectDoesNotExist
1011
from django.db.models import ManyToManyField, Model
@@ -16,13 +17,6 @@
1617
except ImportError:
1718
StateWrapper = type("StateWrapper", (object,), dict())
1819

19-
try:
20-
from cuser.middleware import CuserMiddleware
21-
22-
CUSER = True
23-
except ImportError:
24-
CUSER = False
25-
2620
from tracking_fields.models import (
2721
CREATE,
2822
DELETE,
@@ -119,11 +113,10 @@ def _create_event(instance, action):
119113
"""
120114
user = None
121115
user_repr = repr(user)
122-
if CUSER:
123-
user = CuserMiddleware.get_user()
124-
user_repr = repr(user)
125-
if user is not None and user.is_anonymous:
126-
user = None
116+
user = CuserMiddleware.get_user()
117+
user_repr = repr(user)
118+
if user is not None and user.is_anonymous:
119+
user = None
127120
return TrackingEvent.objects.create(
128121
action=action,
129122
object_content_type=ContentType.objects.get_for_model(instance),

0 commit comments

Comments
 (0)