Merge pull request #2076 from edx/brian/server-track-null-request

Modify server_track to handle being called without a request.
This commit is contained in:
brianhw
2014-01-06 07:15:14 -08:00
2 changed files with 41 additions and 21 deletions

View File

@@ -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',

View File

@@ -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)