~widelands-dev/widelands-website/trunk

« back to all changes in this revision

Viewing changes to tracking/views.py

  • Committer: franku
  • Date: 2016-07-02 12:38:06 UTC
  • mfrom: (404.2.56 widelands)
  • Revision ID: somal@arcor.de-20160702123806-q69u3d48s1prrxds
merged the django1_8 branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from datetime import datetime
 
2
import logging
 
3
import traceback
 
4
 
 
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
 
14
 
 
15
DEFAULT_TRACKING_TEMPLATE = getattr(settings, 'DEFAULT_TRACKING_TEMPLATE',
 
16
                                    'tracking/visitor_map.html')
 
17
log = logging.getLogger('tracking.views')
 
18
 
 
19
def update_active_users(request):
 
20
    """
 
21
    Returns a list of all active users
 
22
    """
 
23
    if request.is_ajax():
 
24
        active = Visitor.objects.active()
 
25
        user = getattr(request, 'user', None)
 
26
 
 
27
        info = {
 
28
            'active': active,
 
29
            'registered': active.filter(user__isnull=False),
 
30
            'guests': active.filter(user__isnull=True),
 
31
            'user': user
 
32
        }
 
33
 
 
34
        # render the list of active users
 
35
        t = loader.get_template('tracking/_active_users.html')
 
36
        c = Context(info)
 
37
        users = {'users': t.render(c)}
 
38
 
 
39
        return HttpResponse(content=JSONEncoder().encode(users))
 
40
 
 
41
    # if the request was not made via AJAX, raise a 404
 
42
    raise Http404
 
43
 
 
44
@never_cache
 
45
def get_active_users(request):
 
46
    """
 
47
    Retrieves a list of active users which is returned as plain JSON for
 
48
    easier manipulation with JavaScript.
 
49
    """
 
50
    if request.is_ajax():
 
51
        active = Visitor.objects.active().reverse()
 
52
        now = datetime.now()
 
53
 
 
54
        # we don't put the session key or IP address here for security reasons
 
55
        try:
 
56
            data = {'users': [{
 
57
                    'id': v.id,
 
58
                    #'user': uc(v.user),
 
59
                    'user_agent': uc(v.user_agent),
 
60
                    'referrer': uc(v.referrer),
 
61
                    'url': uc(v.url),
 
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)),
 
66
                } for v in active]}
 
67
        except:
 
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')
 
70
 
 
71
        response = HttpResponse(content=JSONEncoder().encode(data),
 
72
                                mimetype='text/javascript')
 
73
        response['Content-Length'] = len(response.content)
 
74
 
 
75
        return response
 
76
 
 
77
    # if the request was not made via AJAX, raise a 404
 
78
    raise Http404
 
79
 
 
80
def friendly_time(last_update):
 
81
    minutes = last_update / 60
 
82
    seconds = last_update % 60
 
83
 
 
84
    friendly_time = []
 
85
    if minutes > 0:
 
86
        friendly_time.append(ungettext(
 
87
                '%(minutes)i minute',
 
88
                '%(minutes)i minutes',
 
89
                minutes
 
90
        ) % {'minutes': minutes })
 
91
    if seconds > 0:
 
92
        friendly_time.append(ungettext(
 
93
                '%(seconds)i second',
 
94
                '%(seconds)i seconds',
 
95
                seconds
 
96
        ) % {'seconds': seconds })
 
97
 
 
98
    return friendly_time or 0
 
99
 
 
100
def display_map(request, template_name=DEFAULT_TRACKING_TEMPLATE,
 
101
        extends_template='base.html'):
 
102
    """
 
103
    Displays a map of recently active users.  Requires a Google Maps API key
 
104
    and GeoIP in order to be most effective.
 
105
    """
 
106
 
 
107
    GOOGLE_MAPS_KEY = getattr(settings, 'GOOGLE_MAPS_KEY', None)
 
108
 
 
109
    return render_to_response(template_name,
 
110
                              {'GOOGLE_MAPS_KEY': GOOGLE_MAPS_KEY,
 
111
                               'template': extends_template},
 
112
                              context_instance=RequestContext(request))