Merge pull request #23017 from edx/diana/remove-tracking-log-backend
Remove the tracking django backend and the TrackingLog tables.
This commit is contained in:
@@ -1,10 +0,0 @@
|
||||
'''
|
||||
django admin pages for courseware model
|
||||
'''
|
||||
|
||||
|
||||
from django.contrib import admin
|
||||
|
||||
from track.models import TrackingLog
|
||||
|
||||
admin.site.register(TrackingLog)
|
||||
@@ -1,89 +0,0 @@
|
||||
"""
|
||||
Event tracker backend that saves events to a Django database.
|
||||
|
||||
"""
|
||||
|
||||
# TODO: this module is very specific to the event schema, and is only
|
||||
# brought here for legacy support. It should be updated when the
|
||||
# schema changes or eventually deprecated.
|
||||
|
||||
|
||||
import logging
|
||||
|
||||
from django.db import models
|
||||
from django.utils.encoding import python_2_unicode_compatible
|
||||
|
||||
from track.backends import BaseBackend
|
||||
|
||||
log = logging.getLogger('track.backends.django')
|
||||
|
||||
|
||||
LOGFIELDS = [
|
||||
'username',
|
||||
'ip',
|
||||
'event_source',
|
||||
'event_type',
|
||||
'event',
|
||||
'agent',
|
||||
'page',
|
||||
'time',
|
||||
'host',
|
||||
]
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class TrackingLog(models.Model):
|
||||
"""
|
||||
Defines the fields that are stored in the tracking log database.
|
||||
|
||||
.. pii: Stores a great deal of PII as it is an event tracker of browsing history, unused and empty on edx.org
|
||||
.. pii_types: username, ip, other
|
||||
.. pii_retirement: retained
|
||||
"""
|
||||
|
||||
dtcreated = models.DateTimeField(u'creation date', auto_now_add=True)
|
||||
username = models.CharField(max_length=32, blank=True)
|
||||
ip = models.CharField(max_length=32, blank=True)
|
||||
event_source = models.CharField(max_length=32)
|
||||
event_type = models.CharField(max_length=512, blank=True)
|
||||
event = models.TextField(blank=True)
|
||||
agent = models.CharField(max_length=256, blank=True)
|
||||
page = models.CharField(max_length=512, blank=True, null=True)
|
||||
time = models.DateTimeField(u'event time')
|
||||
host = models.CharField(max_length=64, blank=True)
|
||||
|
||||
class Meta(object):
|
||||
app_label = 'track'
|
||||
db_table = 'track_trackinglog'
|
||||
|
||||
def __str__(self):
|
||||
fmt = (
|
||||
u"[{self.time}] {self.username}@{self.ip}: "
|
||||
u"{self.event_source}| {self.event_type} | "
|
||||
u"{self.page} | {self.event}"
|
||||
)
|
||||
return fmt.format(self=self)
|
||||
|
||||
|
||||
class DjangoBackend(BaseBackend):
|
||||
"""Event tracker backend that saves to a Django database"""
|
||||
def __init__(self, name='default', **options):
|
||||
"""
|
||||
Configure database used by the backend.
|
||||
|
||||
:Parameters:
|
||||
|
||||
- `name` is the name of the database as specified in the project
|
||||
settings.
|
||||
|
||||
"""
|
||||
super(DjangoBackend, self).__init__(**options)
|
||||
self.name = name
|
||||
|
||||
def send(self, event):
|
||||
field_values = {x: event.get(x, '') for x in LOGFIELDS}
|
||||
tldat = TrackingLog(**field_values)
|
||||
try:
|
||||
tldat.save(using=self.name)
|
||||
except Exception as e: # pylint: disable=broad-except
|
||||
log.exception(e)
|
||||
@@ -1,26 +0,0 @@
|
||||
|
||||
|
||||
from django.test import TestCase
|
||||
|
||||
from track.backends.django import DjangoBackend, TrackingLog
|
||||
|
||||
|
||||
class TestDjangoBackend(TestCase):
|
||||
def setUp(self):
|
||||
super(TestDjangoBackend, self).setUp()
|
||||
self.backend = DjangoBackend()
|
||||
|
||||
def test_django_backend(self):
|
||||
event = {
|
||||
'username': 'test',
|
||||
'time': '2013-01-01T12:01:00-05:00'
|
||||
}
|
||||
self.backend.send(event)
|
||||
|
||||
results = list(TrackingLog.objects.all())
|
||||
|
||||
self.assertEqual(len(results), 1)
|
||||
self.assertEqual(results[0].username, 'test')
|
||||
|
||||
# Check if time is stored in UTC
|
||||
self.assertEqual(str(results[0].time), '2013-01-01 17:01:00+00:00')
|
||||
@@ -1,4 +0,0 @@
|
||||
# pylint: disable=unused-import, missing-docstring
|
||||
|
||||
|
||||
from track.backends.django import TrackingLog
|
||||
@@ -1,61 +0,0 @@
|
||||
"""Tests that tracking data are successfully logged"""
|
||||
|
||||
|
||||
import unittest
|
||||
|
||||
import mock
|
||||
from django.conf import settings
|
||||
from django.test import TestCase
|
||||
from django.urls import reverse
|
||||
from six import unichr
|
||||
|
||||
from track.models import TrackingLog
|
||||
from track.views import user_track
|
||||
|
||||
|
||||
@unittest.skip("TODO: these tests were not being run before, and now that they are they're failing")
|
||||
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
|
||||
class TrackingTest(TestCase):
|
||||
"""
|
||||
Tests that tracking logs correctly handle events
|
||||
"""
|
||||
|
||||
def test_post_answers_to_log(self):
|
||||
"""
|
||||
Checks that student answer requests submitted to track.views via POST
|
||||
are correctly logged in the TrackingLog db table
|
||||
"""
|
||||
requests = [
|
||||
{"event": "my_event", "event_type": "my_event_type", "page": "my_page"},
|
||||
{"event": "{'json': 'object'}", "event_type": unichr(512), "page": "my_page"}
|
||||
]
|
||||
with mock.patch.dict('django.conf.settings.FEATURES', {'ENABLE_SQL_TRACKING_LOGS': True}):
|
||||
for request_params in requests:
|
||||
response = self.client.post(reverse(user_track), request_params)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.content, 'success')
|
||||
tracking_logs = TrackingLog.objects.order_by('-dtcreated')
|
||||
log = tracking_logs[0]
|
||||
self.assertEqual(log.event, request_params["event"])
|
||||
self.assertEqual(log.event_type, request_params["event_type"])
|
||||
self.assertEqual(log.page, request_params["page"])
|
||||
|
||||
def test_get_answers_to_log(self):
|
||||
"""
|
||||
Checks that student answer requests submitted to track.views via GET
|
||||
are correctly logged in the TrackingLog db table
|
||||
"""
|
||||
requests = [
|
||||
{"event": "my_event", "event_type": "my_event_type", "page": "my_page"},
|
||||
{"event": "{'json': 'object'}", "event_type": unichr(512), "page": "my_page"}
|
||||
]
|
||||
with mock.patch.dict('django.conf.settings.FEATURES', {'ENABLE_SQL_TRACKING_LOGS': True}):
|
||||
for request_params in requests:
|
||||
response = self.client.get(reverse(user_track), request_params)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.content, 'success')
|
||||
tracking_logs = TrackingLog.objects.order_by('-dtcreated')
|
||||
log = tracking_logs[0]
|
||||
self.assertEqual(log.event, request_params["event"])
|
||||
self.assertEqual(log.event_type, request_params["event_type"])
|
||||
self.assertEqual(log.page, request_params["page"])
|
||||
@@ -15,7 +15,6 @@ from ipware.ip import get_ip
|
||||
|
||||
from edxmako.shortcuts import render_to_response
|
||||
from track import contexts, shim, tracker
|
||||
from track.models import TrackingLog
|
||||
|
||||
|
||||
def log_event(event):
|
||||
@@ -159,8 +158,7 @@ def task_track(request_info, task_info, event_type, event, page=None):
|
||||
# about the task in which it is running.
|
||||
full_event = dict(event, **task_info)
|
||||
|
||||
# All fields must be specified, in case the tracking information is
|
||||
# also saved to the TrackingLog model. Get values from the task-level
|
||||
# Get values from the task-level
|
||||
# information, or just add placeholder values.
|
||||
with eventtracker.get_tracker().context('edx.course.task', contexts.course_context_from_url(page)):
|
||||
event = {
|
||||
@@ -177,31 +175,3 @@ def task_track(request_info, task_info, event_type, event, page=None):
|
||||
}
|
||||
|
||||
log_event(event)
|
||||
|
||||
|
||||
@login_required
|
||||
@ensure_csrf_cookie
|
||||
def view_tracking_log(request, args=''):
|
||||
"""View to output contents of TrackingLog model. For staff use only."""
|
||||
if not request.user.is_staff:
|
||||
return redirect('/')
|
||||
nlen = 100
|
||||
username = ''
|
||||
if args:
|
||||
for arg in args.split('/'):
|
||||
if arg.isdigit():
|
||||
nlen = int(arg)
|
||||
if arg.startswith('username='):
|
||||
username = arg[9:]
|
||||
|
||||
record_instances = TrackingLog.objects.all().order_by('-time')
|
||||
if username:
|
||||
record_instances = record_instances.filter(username=username)
|
||||
record_instances = record_instances[0:nlen]
|
||||
|
||||
# fix dtstamp
|
||||
fmt = '%a %d-%b-%y %H:%M:%S' # "%Y-%m-%d %H:%M:%S %Z%z"
|
||||
for rinst in record_instances:
|
||||
rinst.dtstr = rinst.time.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('US/Eastern')).strftime(fmt)
|
||||
|
||||
return render_to_response('tracking_log.html', {'records': record_instances})
|
||||
|
||||
@@ -223,6 +223,7 @@ class MigrationTests(TestCase):
|
||||
"""
|
||||
|
||||
@unittest.skip("Need to skip as part of renaming a field in schedules app. This will be unskipped in DE-1825")
|
||||
@unittest.skip("This is also being skipped as part of the dropping of tracking tables for DEPR-57")
|
||||
@override_settings(MIGRATION_MODULES={})
|
||||
def test_migrations_are_in_sync(self):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user