From 7e31c95c45fd91fa48b8c9583086d235041380d2 Mon Sep 17 00:00:00 2001 From: Brian Wilson Date: Fri, 3 Jan 2014 15:16:37 -0500 Subject: [PATCH] Modify server_track to handle being called without a request. --- common/djangoapps/track/tests/test_views.py | 18 +++++++++ common/djangoapps/track/views.py | 44 +++++++++++---------- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/common/djangoapps/track/tests/test_views.py b/common/djangoapps/track/tests/test_views.py index c05d4f2f4d..ca09e519ab 100644 --- a/common/djangoapps/track/tests/test_views.py +++ b/common/djangoapps/track/tests/test_views.py @@ -78,6 +78,24 @@ class TestTrackViews(TestCase): } self.mock_tracker.send.assert_called_once_with(expected_event) + def test_server_track_with_no_request(self): + request = None + views.server_track(request, str(sentinel.event_type), '{}') + + expected_event = { + 'username': 'anonymous', + 'ip': '', + 'event_source': 'server', + 'event_type': str(sentinel.event_type), + 'event': '{}', + 'agent': '', + 'page': None, + 'time': self._expected_timestamp, + 'host': '', + 'context': {}, + } + self.mock_tracker.send.assert_called_once_with(expected_event) + def test_task_track(self): request_info = { 'username': 'anonymous', diff --git a/common/djangoapps/track/views.py b/common/djangoapps/track/views.py index ec05232395..522773a4cb 100644 --- a/common/djangoapps/track/views.py +++ b/common/djangoapps/track/views.py @@ -1,6 +1,5 @@ import datetime -import pytz from pytz import UTC from django.contrib.auth.decorators import login_required @@ -22,6 +21,14 @@ def log_event(event): tracker.send(event) +def _get_request_header(request, header_name, default=''): + """Helper method to get header values from a request's META dict, if present.""" + if request is not None and hasattr(request, 'META') and header_name in request.META: + return request.META[header_name] + else: + return default + + def user_track(request): """ Log when POST call to "event" URL is made by a user. Uses request.REQUEST @@ -40,25 +47,20 @@ def user_track(request): except: scookie = "" - try: - agent = request.META['HTTP_USER_AGENT'] - except: - agent = '' - page = request.REQUEST['page'] with eventtracker.get_tracker().context('edx.course.browser', contexts.course_context_from_url(page)): event = { "username": username, "session": scookie, - "ip": request.META['REMOTE_ADDR'], + "ip": _get_request_header(request, 'REMOTE_ADDR'), "event_source": "browser", "event_type": request.REQUEST['event_type'], "event": request.REQUEST['event'], - "agent": agent, + "agent": _get_request_header(request, 'HTTP_USER_AGENT'), "page": page, "time": datetime.datetime.now(UTC), - "host": request.META['SERVER_NAME'], + "host": _get_request_header(request, 'SERVER_NAME'), "context": eventtracker.get_tracker().resolve_context(), } @@ -68,33 +70,33 @@ def user_track(request): def server_track(request, event_type, event, page=None): - """Log events related to server requests.""" + """ + Log events related to server requests. + + Handle the situation where the request may be NULL, as may happen with management commands. + """ + if event_type.startswith("/event_logs") and request.user.is_staff: + return # don't log + try: username = request.user.username except: username = "anonymous" - try: - agent = request.META['HTTP_USER_AGENT'] - except: - agent = '' - + # define output: event = { "username": username, - "ip": request.META['REMOTE_ADDR'], + "ip": _get_request_header(request, 'REMOTE_ADDR'), "event_source": "server", "event_type": event_type, "event": event, - "agent": agent, + "agent": _get_request_header(request, 'HTTP_USER_AGENT'), "page": page, "time": datetime.datetime.now(UTC), - "host": request.META['SERVER_NAME'], + "host": _get_request_header(request, 'SERVER_NAME'), "context": eventtracker.get_tracker().resolve_context(), } - if event_type.startswith("/event_logs") and request.user.is_staff: - return # don't log - log_event(event)