diff --git a/AUTHORS b/AUTHORS index 4a2c22cb5ad207170092bb7bf202b2c00997bb1a..01ba5d13fe409f072998be546dd0ec7bfb0a7413 100644 --- a/AUTHORS +++ b/AUTHORS @@ -92,4 +92,5 @@ Felipe Montoya <felipe.montoya@edunext.co> Julia Hansbrough <julia@edx.org> Pavel Yushchenko <pavelyushchenko@gmail.com> Nicolas Chevalier <nicolas.chevalier@epitech.eu> +Gabe Mulley <gabe@edx.org> Iain Dunning <idunning@mit.edu> diff --git a/common/djangoapps/track/middleware.py b/common/djangoapps/track/middleware.py index c5bba2e10cb488c16764b6df9caf7d55c2fa4338..54934c5f36a65fb680bfa66d1716127dd3b8c1fb 100644 --- a/common/djangoapps/track/middleware.py +++ b/common/djangoapps/track/middleware.py @@ -1,5 +1,6 @@ import json import re +import logging from django.conf import settings @@ -8,13 +9,20 @@ from track import contexts from eventtracking import tracker -COURSE_CONTEXT_NAME = 'edx.course' +log = logging.getLogger(__name__) + +CONTEXT_NAME = 'edx.request' class TrackMiddleware(object): + """ + Tracks all requests made, as well as setting up context for other server + emitted events. + """ + def process_request(self, request): try: - self.enter_course_context(request) + self.enter_request_context(request) if not self.should_process_request(request): return @@ -66,20 +74,29 @@ class TrackMiddleware(object): return False return True - def enter_course_context(self, request): + def enter_request_context(self, request): """ - Extract course information from the request and add it to the - tracking context. + Extract information from the request and add it to the tracking + context. """ + context = {} + context.update(contexts.course_context_from_url(request.build_absolute_uri())) + try: + context['user_id'] = request.user.pk + except AttributeError: + context['user_id'] = '' + if settings.DEBUG: + log.error('Cannot determine primary key of logged in user.') + tracker.get_tracker().enter_context( - COURSE_CONTEXT_NAME, - contexts.course_context_from_url(request.build_absolute_uri()) + CONTEXT_NAME, + context ) def process_response(self, request, response): # pylint: disable=unused-argument - """Exit the course context if it exists.""" + """Exit the context if it exists.""" try: - tracker.get_tracker().exit_context(COURSE_CONTEXT_NAME) + tracker.get_tracker().exit_context(CONTEXT_NAME) except: # pylint: disable=bare-except pass diff --git a/common/djangoapps/track/tests/test_middleware.py b/common/djangoapps/track/tests/test_middleware.py index 68cc7585f61d8241e83caa7c6d33b3424eb35c0a..78d5d46b61f5886a43b72d15af7a8bf319178d0b 100644 --- a/common/djangoapps/track/tests/test_middleware.py +++ b/common/djangoapps/track/tests/test_middleware.py @@ -2,6 +2,7 @@ import re from mock import patch +from django.contrib.auth.models import User from django.test import TestCase from django.test.client import RequestFactory from django.test.utils import override_settings @@ -52,15 +53,32 @@ class TrackMiddlewareTestCase(TestCase): def test_request_in_course_context(self): request = self.request_factory.get('/courses/test_org/test_course/test_run/foo') self.track_middleware.process_request(request) + captured_context = tracker.get_tracker().resolve_context() + self.track_middleware.process_response(request, None) + self.assertEquals( - tracker.get_tracker().resolve_context(), + captured_context, { 'course_id': 'test_org/test_course/test_run', - 'org_id': 'test_org' + 'org_id': 'test_org', + 'user_id': '' } ) - self.track_middleware.process_response(request, None) self.assertEquals( tracker.get_tracker().resolve_context(), {} ) + + def test_request_with_user(self): + request = self.request_factory.get('/courses/') + request.user = User(pk=1) + self.track_middleware.process_request(request) + self.addCleanup(self.track_middleware.process_response, request, None) + self.assertEquals( + tracker.get_tracker().resolve_context(), + { + 'course_id': '', + 'org_id': '', + 'user_id': 1 + } + )