add geo info to user table

This commit is contained in:
j 2011-12-03 17:17:07 +01:00
parent c31647358e
commit 3de8bbe367
5 changed files with 65 additions and 1 deletions

3
README
View file

@ -7,7 +7,8 @@ python, bazaar, pip and virtualenv and several other python modules:
* Packages
apt-get install bzr git subversion mercurial \
python-setuptools python-pip python-virtualenv ipython \
python-dev python-imaging python-numpy python-psycopg2
python-dev python-imaging python-numpy python-psycopg2 \
python-geoip
* Pan.do/ra
Get code from bazzar

View file

@ -100,6 +100,14 @@ def update_static():
if not os.path.exists(image):
shutil.copyfile(pandora, image)
#download geo data
path = os.path.join(settings.GEOIP_PATH, 'GeoLiteCity.dat')
if not os.path.exists(path):
url = 'http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz'
print 'download', url
ox.net.saveUrl(url, "%s.gz"%path)
os.system('gunzip "%s.gz"' % path)
def init():
load_config()
thread.start_new_thread(reloader_thread, ())

View file

@ -43,6 +43,7 @@ APPEND_SLASH = False
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = normpath(join(PROJECT_ROOT, '..', 'data'))
STATIC_ROOT = normpath(join(PROJECT_ROOT, '..', 'static'))
GEOIP_PATH = normpath(join(PROJECT_ROOT, '..', 'data', 'geo'))
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).

View file

@ -7,6 +7,7 @@ from django.contrib.auth.models import User
from django.db import models
from django.db.models import Max
from django.conf import settings
from django.contrib.gis.utils import GeoIP
import ox
from ox.django.fields import DictField
@ -31,12 +32,40 @@ class SessionData(models.Model):
screensize = models.CharField(default='', max_length=255)
info = DictField(default={})
location = models.CharField(default='', max_length=255)
system = models.CharField(default='', max_length=255)
browser = models.CharField(default='', max_length=255)
objects = managers.SessionDataManager()
def __unicode__(self):
return u"%s" % self.session_key
def parse_data(self):
if self.useragent:
self.browser = 'Unknown'
for browser in ('Webkit', 'Safari', 'Chrome', 'Firefox', 'Safari Mobile', 'Opera'):
if {
'Safari Mobile': 'Mobile/',
}.get(browser, browser) in self.useragent:
self.browser = browser
for system in ('Windows', 'Mac OS X', 'Andorid', 'iOS', 'Linux'):
if {
}.get(system, system) in self.useragent:
self.system = system
if self.ip:
try:
g = GeoIP()
location = g.city(self.ip)
if location:
self.location = u'%s, %s' % (location['city'].decode('latin-1'),
location['country_name'].decode('latin-1'))
else:
self.location = ''
except:
self.location = ''
pass
def save(self, *args, **kwargs):
if self.user:
self.username = self.user.username
@ -44,6 +73,7 @@ class SessionData(models.Model):
self.firstseen = self.user.date_joined
else:
self.level = 0
self.parse_data()
super(SessionData, self).save(*args, **kwargs)
@classmethod
@ -75,6 +105,7 @@ class SessionData(models.Model):
def json(self, keys=None, user=None):
j = {
'browser': self.browser,
'disabled': False,
'email': '',
'firstseen': self.firstseen,
@ -82,9 +113,11 @@ class SessionData(models.Model):
'id': self.get_id(),
'lastseen': self.lastseen,
'level': 'guest',
'location': self.location,
'notes': '',
'numberoflists': 0,
'screensize': self.screensize,
'system': self.system,
'timesseen': self.timesseen,
'username': self.username or '',
'useragent': self.useragent,

View file

@ -189,6 +189,27 @@ pandora.ui.usersDialog = function() {
visible: true,
width: 90
},
{
id: 'location',
operator: '+',
title: 'Location',
visible: true,
width: 120
},
{
id: 'browser',
operator: '+',
title: 'Browser',
visible: true,
width: 60
},
{
id: 'system',
operator: '+',
title: 'System',
visible: true,
width: 60
},
{
id: 'useragent',
operator: '+',