pandora/pandora/user/statistics.py

135 lines
4.8 KiB
Python
Raw Normal View History

2013-10-22 15:58:47 +00:00
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
import ox.geo
colors = {
'system': {
'Android': [0, 255, 0],
'BlackBerry': [64, 64, 64],
'BSD': [255, 0, 0],
'iOS': [0, 128, 255],
'Java': [128, 128, 128],
'Linux': [255, 128, 0],
'Mac OS X': [0, 255, 255],
'Nokia': [255, 0, 255],
'PlayStation': [192, 192, 192],
'RIM Tablet OS': [64, 64, 64],
'Unix': [255, 255, 0],
'Wii': [192, 192, 192],
'Windows Phone': [0, 0, 128], #has to be before 'Windows'
'Windows': [0, 0, 255]
},
'browser': {
'Camino': [192, 192, 192],
'Chrome Frame': [255, 255, 0], #has to be before 'Chrome'
'Chrome': [0, 255, 0],
'Chromium': [128, 255, 0],
'Epiphany': [128, 128, 128],
'Firefox': [255, 128, 0],
'Internet Explorer': [0, 0, 255],
'Konqueror': [64, 64, 64],
'Nokia Browser': [255, 0, 255],
'Opera': [255, 0, 0],
'Safari': [0, 255, 255],
'WebKit': [0, 255, 128]
}
}
def get_name(key, version):
for name in colors[key]:
if version.startswith(name):
return name
return ''
class Statistics(dict):
def __init__(self):
for mode in ['all', 'registered']:
self[mode] = {
"year": {},
"month": {},
"day": {},
"weekday": {},
"hour": {},
"continent": {},
"region": {},
"country": {},
"city": {},
"system": {},
"browser": {},
"systemandbrowser": {},
"systemversion": {},
"browserversion": {},
"systemandbrowserversion": {}
}
def _increment(self, d, key, add=1, base=0):
if not key in d:
d[key] = base
d[key] += add
def add(self, item):
for mode in ['all', 'registered']:
if mode == 'all' or item['level'] != 'guest':
for key in ['firstseen', 'lastseen']:
year = '%s-%s' % (item[key].strftime('%Y'), key)
month = '%s-%s' % (item[key].strftime('%Y-%m'), key)
day = '%s-%s' % (item[key].strftime('%Y-%m-%d'), key)
weekday = item[key].strftime('%u')
hour = item[key].strftime('%H')
if not year in self[mode]['year']:
self[mode]['year'][year] = {}
2013-10-22 18:12:45 +00:00
self._increment(self[mode]['year'][year], month)
2013-10-22 15:58:47 +00:00
2013-10-22 18:12:45 +00:00
self._increment(self[mode]['month'], month)
2013-10-22 15:58:47 +00:00
if key == 'firstseen':
if not day in self[mode]['day']:
self[mode]['day'][day] = {}
2013-10-22 18:12:45 +00:00
self._increment(self[mode]['day'][day], hour)
2013-10-22 15:58:47 +00:00
if not weekday in self[mode]['weekday']:
self[mode]['weekday'][weekday] = {}
2013-10-22 18:12:45 +00:00
self._increment(self[mode]['weekday'][weekday], hour)
2013-10-22 15:58:47 +00:00
self._increment(self[mode]['hour'], hour)
if item['location']:
split = ox.geo.split_geoname(item['location'])
if len(split) == 1:
split.insert(0, None)
city, country = split
country_data = ox.geo.get_country(country)
continent = country_data.get('continent','')
region = ', '.join([continent, country_data.get('region', '')])
country = ', '.join([region, country])
2013-10-22 17:57:14 +00:00
city = ', '.join([country, city]) if city else ''
2013-10-22 15:58:47 +00:00
2013-10-22 17:57:14 +00:00
self._increment(self[mode]['continent'], continent)
2013-10-22 15:58:47 +00:00
self._increment(self[mode]['region'], region)
self._increment(self[mode]['country'], country)
if city:
self._increment(self[mode]['city'], city)
name = {}
for key in ['system', 'browser']:
2013-10-22 17:59:56 +00:00
version = item[key]
2013-10-22 15:58:47 +00:00
if version:
name[key] = get_name(key, version)
if name[key]:
self._increment(self[mode][key], name[key])
key = key + 'version';
self._increment(self[mode][key], version)
2013-10-22 17:59:56 +00:00
if name.get('system') and name.get('browser'):
2013-10-22 15:58:47 +00:00
name = name['system'] + ' / ' + name['browser']
self._increment(self[mode]['systemandbrowser'], name)
name = item['system'] + ' / ' + item['browser']
self._increment(self[mode]['systemandbrowserversion'], name)