1
from datetime import datetime
5
from django.conf import settings
6
from django.http import Http404, HttpResponse
7
from django.shortcuts import render_to_response
8
from django.template import RequestContext, Context, loader
9
from django.utils.simplejson import JSONEncoder
10
from django.utils.translation import ungettext
11
from django.views.decorators.cache import never_cache
12
from tracking.models import Visitor
13
from tracking.utils import u_clean as uc
15
DEFAULT_TRACKING_TEMPLATE = getattr(settings, 'DEFAULT_TRACKING_TEMPLATE',
16
'tracking/visitor_map.html')
17
log = logging.getLogger('tracking.views')
19
def update_active_users(request):
21
Returns a list of all active users
24
active = Visitor.objects.active()
25
user = getattr(request, 'user', None)
29
'registered': active.filter(user__isnull=False),
30
'guests': active.filter(user__isnull=True),
34
# render the list of active users
35
t = loader.get_template('tracking/_active_users.html')
37
users = {'users': t.render(c)}
39
return HttpResponse(content=JSONEncoder().encode(users))
41
# if the request was not made via AJAX, raise a 404
45
def get_active_users(request):
47
Retrieves a list of active users which is returned as plain JSON for
48
easier manipulation with JavaScript.
51
active = Visitor.objects.active().reverse()
54
# we don't put the session key or IP address here for security reasons
59
'user_agent': uc(v.user_agent),
60
'referrer': uc(v.referrer),
62
'page_views': v.page_views,
63
'geoip': v.geoip_data_json,
64
'last_update': (now - v.last_update).seconds,
65
'friendly_time': ', '.join(friendly_time((now - v.last_update).seconds)),
68
log.error('There was a problem putting all of the visitor data together:\n%s\n\n%s' % (traceback.format_exc(), locals()))
69
return HttpResponse(content='{}', mimetype='text/javascript')
71
response = HttpResponse(content=JSONEncoder().encode(data),
72
mimetype='text/javascript')
73
response['Content-Length'] = len(response.content)
77
# if the request was not made via AJAX, raise a 404
80
def friendly_time(last_update):
81
minutes = last_update / 60
82
seconds = last_update % 60
86
friendly_time.append(ungettext(
88
'%(minutes)i minutes',
90
) % {'minutes': minutes })
92
friendly_time.append(ungettext(
94
'%(seconds)i seconds',
96
) % {'seconds': seconds })
98
return friendly_time or 0
100
def display_map(request, template_name=DEFAULT_TRACKING_TEMPLATE,
101
extends_template='base.html'):
103
Displays a map of recently active users. Requires a Google Maps API key
104
and GeoIP in order to be most effective.
107
GOOGLE_MAPS_KEY = getattr(settings, 'GOOGLE_MAPS_KEY', None)
109
return render_to_response(template_name,
110
{'GOOGLE_MAPS_KEY': GOOGLE_MAPS_KEY,
111
'template': extends_template},
112
context_instance=RequestContext(request))