Commit f7eb7df5 by Gabe Mulley

Remove duplicated data from legacy events

When event-tracking was fully integrated into the platform, some data was replicated in the context in the middleware and then later extracted and moved the old location by event-tracking. The legacy code path was not updated to remove this transient shim data from the context resulting in duplication of the information. This patch ensures that the transient information is removed from the context before emitting the event.

Fixes: AN-2369
parent 79945533
...@@ -18,9 +18,9 @@ class LegacyFieldMappingProcessor(object): ...@@ -18,9 +18,9 @@ class LegacyFieldMappingProcessor(object):
for field in CONTEXT_FIELDS_TO_INCLUDE: for field in CONTEXT_FIELDS_TO_INCLUDE:
if field in context: if field in context:
event[field] = context[field] event[field] = context[field]
del context[field]
else: else:
event[field] = '' event[field] = ''
remove_shim_context(event)
if 'event_type' in event.get('context', {}): if 'event_type' in event.get('context', {}):
event['event_type'] = event['context']['event_type'] event['event_type'] = event['context']['event_type']
...@@ -40,3 +40,11 @@ class LegacyFieldMappingProcessor(object): ...@@ -40,3 +40,11 @@ class LegacyFieldMappingProcessor(object):
event['event_source'] = 'server' event['event_source'] = 'server'
event['page'] = None event['page'] = None
def remove_shim_context(event):
if 'context' in event:
context = event['context']
for field in CONTEXT_FIELDS_TO_INCLUDE:
if field in context:
del context[field]
# pylint: disable=missing-docstring,maybe-no-member # pylint: disable=missing-docstring,maybe-no-member
from track import views from track import views
from track.middleware import TrackMiddleware
from mock import patch, sentinel from mock import patch, sentinel
from freezegun import freeze_time from freezegun import freeze_time
...@@ -53,12 +54,46 @@ class TestTrackViews(TestCase): ...@@ -53,12 +54,46 @@ class TestTrackViews(TestCase):
'context': { 'context': {
'course_id': 'foo/bar/baz', 'course_id': 'foo/bar/baz',
'org_id': 'foo', 'org_id': 'foo',
'session': sentinel.session,
}, },
} }
self.mock_tracker.send.assert_called_once_with(expected_event) self.mock_tracker.send.assert_called_once_with(expected_event)
@freeze_time(expected_time) @freeze_time(expected_time)
def test_user_track_with_middleware(self):
middleware = TrackMiddleware()
request = self.request_factory.get('/event', {
'page': self.url_with_course,
'event_type': sentinel.event_type,
'event': {}
})
middleware.process_request(request)
try:
views.user_track(request)
expected_event = {
'username': 'anonymous',
'session': '',
'ip': '127.0.0.1',
'event_source': 'browser',
'event_type': str(sentinel.event_type),
'event': '{}',
'agent': '',
'page': self.url_with_course,
'time': expected_time,
'host': 'testserver',
'context': {
'course_id': 'foo/bar/baz',
'org_id': 'foo',
'user_id': '',
'path': u'/event'
},
}
finally:
middleware.process_response(request, None)
self.mock_tracker.send.assert_called_once_with(expected_event)
@freeze_time(expected_time)
def test_server_track(self): def test_server_track(self):
request = self.request_factory.get(self.path_with_course) request = self.request_factory.get(self.path_with_course)
views.server_track(request, str(sentinel.event_type), '{}') views.server_track(request, str(sentinel.event_type), '{}')
...@@ -78,6 +113,38 @@ class TestTrackViews(TestCase): ...@@ -78,6 +113,38 @@ class TestTrackViews(TestCase):
self.mock_tracker.send.assert_called_once_with(expected_event) self.mock_tracker.send.assert_called_once_with(expected_event)
@freeze_time(expected_time) @freeze_time(expected_time)
def test_server_track_with_middleware(self):
middleware = TrackMiddleware()
request = self.request_factory.get(self.path_with_course)
middleware.process_request(request)
# The middleware emits an event, reset the mock to ignore it since we aren't testing that feature.
self.mock_tracker.reset_mock()
try:
views.server_track(request, str(sentinel.event_type), '{}')
expected_event = {
'username': 'anonymous',
'ip': '127.0.0.1',
'event_source': 'server',
'event_type': str(sentinel.event_type),
'event': '{}',
'agent': '',
'page': None,
'time': expected_time,
'host': 'testserver',
'context': {
'user_id': '',
'course_id': u'foo/bar/baz',
'org_id': 'foo',
'path': u'/courses/foo/bar/baz/xmod/'
},
}
finally:
middleware.process_response(request, None)
self.mock_tracker.send.assert_called_once_with(expected_event)
@freeze_time(expected_time)
def test_server_track_with_no_request(self): def test_server_track_with_no_request(self):
request = None request = None
views.server_track(request, str(sentinel.event_type), '{}') views.server_track(request, str(sentinel.event_type), '{}')
......
...@@ -12,6 +12,7 @@ from edxmako.shortcuts import render_to_response ...@@ -12,6 +12,7 @@ from edxmako.shortcuts import render_to_response
from track import tracker from track import tracker
from track import contexts from track import contexts
from track import shim
from track.models import TrackingLog from track.models import TrackingLog
from eventtracking import tracker as eventtracker from eventtracking import tracker as eventtracker
...@@ -59,6 +60,10 @@ def user_track(request): ...@@ -59,6 +60,10 @@ def user_track(request):
"context": context, "context": context,
} }
# Some duplicated fields are passed into event-tracking via the context by track.middleware.
# Remove them from the event here since they are captured elsewhere.
shim.remove_shim_context(event)
log_event(event) log_event(event)
return HttpResponse('success') return HttpResponse('success')
...@@ -92,6 +97,10 @@ def server_track(request, event_type, event, page=None): ...@@ -92,6 +97,10 @@ def server_track(request, event_type, event, page=None):
"context": eventtracker.get_tracker().resolve_context(), "context": eventtracker.get_tracker().resolve_context(),
} }
# Some duplicated fields are passed into event-tracking via the context by track.middleware.
# Remove them from the event here since they are captured elsewhere.
shim.remove_shim_context(event)
log_event(event) log_event(event)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment