Mercurial > public > sg101
diff membermap/views.py @ 581:ee87ea74d46b
For Django 1.4, rearranged project structure for new manage.py.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Sat, 05 May 2012 17:10:48 -0500 |
parents | gpp/membermap/views.py@4532ed27bed8 |
children | 89b240fe9297 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/membermap/views.py Sat May 05 17:10:48 2012 -0500 @@ -0,0 +1,165 @@ +""" +Views for the membermap application. +""" +from django.shortcuts import render_to_response +from django.template.loader import render_to_string +from django.template import RequestContext +from django.http import HttpResponse +from django.http import HttpResponseBadRequest +from django.http import HttpResponseForbidden +from django.views.decorators.http import require_POST +import django.utils.simplejson as json +from django.core.cache import cache + +from membermap.models import MapEntry +from membermap.forms import MapEntryForm +from bio.models import UserProfile + +CACHE_KEY = 'membermap_json' +CACHE_TIMEOUT = 5 * 60 + + +def index(request): + entry = None + if request.user.is_authenticated(): + try: + entry = MapEntry.objects.get(user=request.user) + except MapEntry.DoesNotExist: + pass + if entry is not None: + form = MapEntryForm(initial={ + 'location': entry.location, + 'message': entry.message}) + else: + form = MapEntryForm() + + return render_to_response('membermap/index.html', { + 'form': form, + }, + context_instance = RequestContext(request)) + + +def query(request): + """ + This view is called by AJAX. If the user is logged in, return + a JSON object that consists of: + "users" : array of user objects + "recent" : array of usernames recently modified + """ + if not request.user.is_authenticated(): + return HttpResponseForbidden('You must be logged in.') + + # Do we have all the JSON cached? + s = cache.get(CACHE_KEY) + if s: + return HttpResponse(s, content_type='application/json') + + # Compute JSON for the map + entries = MapEntry.objects.all().select_related().order_by('user__username') + users = [] + user_ids = [] + recent = [] + for entry in entries.iterator(): + users.append(dict(name=entry.user.username, + lat=entry.lat, + lon=entry.lon, + message=entry.html, + )) + user_ids.append(entry.user.id) + recent.append((entry.date_updated, entry.user.username)) + + # Get avatars for all users + profiles = UserProfile.objects.filter(user__in=user_ids).select_related() + avatars = {} + for profile in profiles.iterator(): + if profile.avatar and profile.avatar.url: + avatars[profile.user.username] = profile.avatar.url + + # Render the messages that go in the balloons + for user in users: + user['message'] = render_to_string('membermap/balloon.html', + dict(user=user, avatar_url=avatars.get(user['name']))) + + # Produce the list of recent updates + recent.sort(reverse=True) + del recent[10:] + recent = [entry[1] for entry in recent] + + # Create the JSON for the map + result = dict(users=users, recent=recent) + s = json.dumps(result, ensure_ascii=False) + + cache.set(CACHE_KEY, s, CACHE_TIMEOUT) + return HttpResponse(s, content_type='application/json') + + +@require_POST +def add(request): + """ + This view is called by AJAX to add/update the user to the map. + It returns the new JSON representation of the user. + """ + if not request.user.is_authenticated(): + return HttpResponseForbidden('You must be logged in.') + + loc = request.POST.get('loc', None) + lat = request.POST.get('lat', None) + lon = request.POST.get('lon', None) + msg = request.POST.get('msg', '') + + if loc is None or lat is None or lon is None: + return HttpResponseBadRequest('Missing parameters') + + try: + lat = float(lat) + lon = float(lon) + except ValueError: + return HttpResponseBadRequest('Invalid lat/lon') + + try: + entry = MapEntry.objects.get(user=request.user) + except MapEntry.DoesNotExist: + entry = MapEntry(user=request.user) + + entry.location = loc + entry.lat = lat + entry.lon = lon + entry.message = msg + entry.save() + + cache.delete(CACHE_KEY) + + avatar_url = None + profile = entry.user.get_profile() + if profile.avatar and profile.avatar.url: + avatar_url = profile.avatar.url + + u = dict(name=entry.user.username, + lat=entry.lat, + lon=entry.lon, + message=entry.html) + + u['message'] = render_to_string('membermap/balloon.html', + dict(user=u, avatar_url=avatar_url)) + + result = json.dumps(u, ensure_ascii=False) + return HttpResponse(result, content_type='application/json') + + +@require_POST +def delete(request): + """ + This view is called by AJAX to delete the user from the map. + """ + if not request.user.is_authenticated(): + return HttpResponseForbidden('You must be logged in.') + + try: + entry = MapEntry.objects.get(user=request.user) + except MapEntry.DoesNotExist: + pass + else: + entry.delete() + cache.delete(CACHE_KEY) + + return HttpResponse('')