annotate bandmap/views.py @ 827:5103edd3acc4

Bandmap: initial version complete. Javascript queries server for band data. View created to handle query. Test created for view. Link added to map in sidebar. Template tweaks.
author Brian Neal <bgneal@gmail.com>
date Sat, 27 Sep 2014 19:41:41 -0500
parents d91356818cef
children b9973588af28
rev   line source
bgneal@820 1 """Views for the bandmap application.
bgneal@820 2
bgneal@820 3 """
bgneal@827 4 import json
bgneal@827 5
bgneal@820 6 from django.contrib.auth.decorators import login_required
bgneal@820 7 from django.shortcuts import redirect, render
bgneal@821 8 from django.contrib import messages as django_messages
bgneal@827 9 from django.http import HttpResponse
bgneal@827 10 from django.template.loader import render_to_string
bgneal@827 11 from django.core.cache import cache
bgneal@820 12
bgneal@820 13 from bandmap.forms import BandForm
bgneal@827 14 from bandmap.models import BandEntry
bgneal@820 15
bgneal@820 16
bgneal@821 17 SUCCESS = "Successfully submitted {} for admin review. Thanks!"
bgneal@821 18
bgneal@821 19
bgneal@820 20 def map_view(request):
bgneal@820 21 return render(request, 'bandmap/map.html')
bgneal@820 22
bgneal@820 23
bgneal@820 24 @login_required
bgneal@820 25 def add_band(request):
bgneal@820 26 """
bgneal@820 27 Provides the ability for a user to submit a new band to the map.
bgneal@820 28
bgneal@820 29 """
bgneal@820 30 if request.method == 'POST':
bgneal@820 31 form = BandForm(request.POST)
bgneal@820 32 if form.is_valid():
bgneal@820 33 band = form.save(commit=False)
bgneal@820 34 band.user = request.user
bgneal@820 35 band.save()
bgneal@821 36 django_messages.success(request, SUCCESS.format(band.name))
bgneal@825 37 return redirect('bandmap-add')
bgneal@820 38 else:
bgneal@820 39 form = BandForm()
bgneal@820 40
bgneal@820 41 return render(request, 'bandmap/add.html', {
bgneal@820 42 'form': form,
bgneal@820 43 })
bgneal@827 44
bgneal@827 45
bgneal@827 46 def query(request):
bgneal@827 47 """Retrieves the band map entries and returns them as JSON.
bgneal@827 48
bgneal@827 49 """
bgneal@827 50 show_param = request.GET.get('show', 'all')
bgneal@827 51 if show_param not in ['all', 'active', 'inactive']:
bgneal@827 52 show_param = 'all'
bgneal@827 53
bgneal@827 54 # Do we have the results cached already?
bgneal@827 55 cache_key = 'bandmap-results-{}'.format(show_param)
bgneal@827 56 results = cache.get(cache_key)
bgneal@827 57 if results:
bgneal@827 58 return HttpResponse(results, content_type='application/json')
bgneal@827 59
bgneal@827 60 # Generate results
bgneal@827 61 qs = BandEntry.objects.filter(is_approved=True)
bgneal@827 62 if show_param == 'active':
bgneal@827 63 qs = qs.filter(is_active=True)
bgneal@827 64 elif show_param == 'inactive':
bgneal@827 65 qs = qs.filter(is_active=False)
bgneal@827 66
bgneal@827 67 bands = []
bgneal@827 68 for band in qs.iterator():
bgneal@827 69 bands.append({
bgneal@827 70 'name': band.name,
bgneal@827 71 'url': band.url,
bgneal@827 72 'lat': band.lat,
bgneal@827 73 'lon': band.lon,
bgneal@827 74 'note': render_to_string('bandmap/balloon.html', {'band': band}),
bgneal@827 75 })
bgneal@827 76 results = json.dumps(bands)
bgneal@827 77
bgneal@827 78 # Store in cache
bgneal@827 79 cache.set(cache_key, results, 300)
bgneal@827 80
bgneal@827 81 return HttpResponse(results, content_type='application/json')