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:
Diana Huang
2020-02-05 08:54:47 -05:00
committed by GitHub
7 changed files with 2 additions and 221 deletions

View File

@@ -1,10 +0,0 @@
'''
django admin pages for courseware model
'''
from django.contrib import admin
from track.models import TrackingLog
admin.site.register(TrackingLog)

View File

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

View File

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

View File

@@ -1,4 +0,0 @@
# pylint: disable=unused-import, missing-docstring
from track.backends.django import TrackingLog

View File

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

View File

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

View File

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