84 lines
2.2 KiB
Python
84 lines
2.2 KiB
Python
"""
|
|
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.
|
|
|
|
from __future__ import absolute_import
|
|
|
|
import logging
|
|
|
|
from django.db import models
|
|
|
|
from track.backends import BaseBackend
|
|
|
|
|
|
log = logging.getLogger('track.backends.django')
|
|
|
|
|
|
LOGFIELDS = [
|
|
'username',
|
|
'ip',
|
|
'event_source',
|
|
'event_type',
|
|
'event',
|
|
'agent',
|
|
'page',
|
|
'time',
|
|
'host'
|
|
]
|
|
|
|
|
|
class TrackingLog(models.Model):
|
|
"""Defines the fields that are stored in the tracking log database."""
|
|
|
|
dtcreated = models.DateTimeField('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('event time')
|
|
host = models.CharField(max_length=64, blank=True)
|
|
|
|
class Meta:
|
|
app_label = 'track'
|
|
db_table = 'track_trackinglog'
|
|
|
|
def __unicode__(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)
|