Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions common/djangoapps/track/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,24 @@ def test_server_track(self):
}
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',
Expand Down
44 changes: 23 additions & 21 deletions common/djangoapps/track/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import datetime

import pytz
from pytz import UTC

from django.contrib.auth.decorators import login_required
Expand All @@ -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
Expand All @@ -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(),
}

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


Expand Down