Skip to content

Commit 52d182b

Browse files
author
Dena Mwangi
authored
Capture when user was last active (#5630)
* Add Middleware to track last time user was active
1 parent a5f8e7f commit 52d182b

File tree

6 files changed

+925
-0
lines changed

6 files changed

+925
-0
lines changed

CHANGES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ Schema Changes
4040
- Added ScheduledJob
4141
- Added GroupResolution.actor_id
4242
- Added ``ScheduledJob`` model
43+
- Added User.last_active
4344

4445
API Changes
4546
~~~~~~~~~~~

src/sentry/conf/server.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ def env(key, default='', type=None):
243243
'django.contrib.sessions.middleware.SessionMiddleware',
244244
'django.middleware.csrf.CsrfViewMiddleware',
245245
'sentry.middleware.auth.AuthenticationMiddleware',
246+
'sentry.middleware.user.UserActiveMiddleware',
246247
'sentry.middleware.sudo.SudoMiddleware',
247248
'sentry.middleware.superuser.SuperuserMiddleware',
248249
'sentry.middleware.locale.SentryLocaleMiddleware',

src/sentry/middleware/user.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from __future__ import absolute_import
2+
3+
import inspect
4+
from datetime import timedelta
5+
from django.utils import timezone
6+
7+
8+
class UserActiveMiddleware(object):
9+
disallowed_paths = (
10+
'sentry.web.frontend.generic.static_media',
11+
'sentry.web.frontend.user_avatar',
12+
)
13+
14+
def process_view(self, request, view_func, view_args, view_kwargs):
15+
view = view_func
16+
if not inspect.isfunction(view_func):
17+
view = view.__class__
18+
19+
try:
20+
path = '%s.%s' % (view.__module__, view.__name__)
21+
except AttributeError:
22+
return
23+
24+
if path.startswith(self.disallowed_paths):
25+
return
26+
27+
if not request.user.is_authenticated():
28+
return
29+
30+
now = timezone.now()
31+
freq = timedelta(minutes=5)
32+
last_active = request.user.last_active
33+
34+
if last_active and freq > (now - last_active):
35+
return
36+
37+
request.user.last_active = now
38+
request.user.update(last_active=now)

src/sentry/models/user.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class User(BaseModel, AbstractBaseUser):
6464
session_nonce = models.CharField(max_length=12, null=True)
6565

6666
date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
67+
last_active = models.DateTimeField(_('last active'), default=timezone.now, null=True)
6768

6869
objects = UserManager(cache_fields=['pk'])
6970

0 commit comments

Comments
 (0)