annotate gpp/downloads/views.py @ 6:b6263ac72052

Use DRY principle to manage third party javascript libraries. Created script_tags template tags to generate the correct link and script tags for 3rd party libraries. The settings.py file is the only place where the full path name is specified.
author Brian Neal <bgneal@gmail.com>
date Sat, 11 Apr 2009 22:50:56 +0000
parents dbd703f7d63a
children a5f27f25fa52
rev   line source
gremmie@1 1 """
gremmie@1 2 Views for the downloads application.
gremmie@1 3 """
gremmie@1 4 import random
gremmie@1 5
gremmie@1 6 from django.shortcuts import render_to_response
gremmie@1 7 from django.template import RequestContext
gremmie@1 8 from django.contrib.auth.decorators import login_required
gremmie@1 9 from django.http import Http404
gremmie@1 10 from django.http import HttpResponse
gremmie@1 11 from django.http import HttpResponseRedirect
gremmie@1 12 from django.http import HttpResponseForbidden
gremmie@1 13 from django.http import HttpResponseBadRequest
gremmie@1 14 from django.core.urlresolvers import reverse
gremmie@1 15 from django.db.models import Q
gremmie@1 16 from django.views.decorators.http import require_POST
gremmie@1 17
gremmie@1 18 from core.paginator import DiggPaginator
gremmie@1 19 from core.functions import email_admins
gremmie@1 20 from downloads.models import Category
gremmie@1 21 from downloads.models import Download
gremmie@1 22 from downloads.models import VoteRecord
gremmie@1 23 from downloads.forms import AddDownloadForm
gremmie@1 24 from downloads.forms import SearchForm
gremmie@1 25
gremmie@1 26 #######################################################################
gremmie@1 27
gremmie@1 28 DLS_PER_PAGE = 10
gremmie@1 29
gremmie@1 30 def create_paginator(dls):
gremmie@1 31 return DiggPaginator(dls, DLS_PER_PAGE, body=5, tail=3, margin=3, padding=2)
gremmie@1 32
gremmie@1 33 #######################################################################
gremmie@1 34
gremmie@1 35 @login_required
gremmie@1 36 def index(request):
gremmie@1 37 categories = Category.objects.all()
gremmie@1 38 total_dls = Download.public_objects.all().count()
gremmie@1 39 return render_to_response('downloads/index.html', {
gremmie@1 40 'categories': categories,
gremmie@1 41 'total_dls': total_dls,
gremmie@1 42 },
gremmie@1 43 context_instance = RequestContext(request))
gremmie@1 44
gremmie@1 45 #######################################################################
gremmie@1 46 # Maps URL component to database field name for the Download table:
gremmie@1 47
gremmie@1 48 DOWNLOAD_FIELD_MAP = {
gremmie@1 49 'title': 'title',
gremmie@1 50 'date': '-date_added',
gremmie@1 51 'rating': '-average_score',
gremmie@1 52 'hits': '-hits'
gremmie@1 53 }
gremmie@1 54
gremmie@1 55 @login_required
gremmie@1 56 def category(request, category, sort='title', page='1'):
gremmie@1 57 try:
gremmie@1 58 cat = Category.objects.get(pk=category)
gremmie@1 59 except Category.DoesNotExist:
gremmie@1 60 raise Http404
gremmie@1 61
gremmie@1 62 if sort not in DOWNLOAD_FIELD_MAP:
gremmie@1 63 sort = 'title'
gremmie@1 64 order_by = DOWNLOAD_FIELD_MAP[sort]
gremmie@1 65
gremmie@1 66 downloads = Download.public_objects.filter(category=cat.pk).order_by(order_by)
gremmie@1 67 paginator = create_paginator(downloads)
gremmie@1 68 try:
gremmie@1 69 the_page = paginator.page(int(page))
gremmie@1 70 except InvalidPage:
gremmie@1 71 raise Http404
gremmie@1 72
gremmie@1 73 return render_to_response('downloads/download_list.html', {
gremmie@1 74 's' : sort,
gremmie@1 75 'category' : cat,
gremmie@1 76 'page' : the_page,
gremmie@1 77 },
gremmie@1 78 context_instance = RequestContext(request))
gremmie@1 79
gremmie@1 80 #######################################################################
gremmie@1 81
gremmie@1 82 @login_required
gremmie@1 83 def new(request):
gremmie@1 84 downloads = Download.public_objects.order_by('-date_added')[:DLS_PER_PAGE]
gremmie@1 85 return render_to_response('downloads/download_summary.html', {
gremmie@1 86 'downloads' : downloads,
gremmie@1 87 'title' : 'Newest Downloads',
gremmie@1 88 },
gremmie@1 89 context_instance = RequestContext(request))
gremmie@1 90
gremmie@1 91 #######################################################################
gremmie@1 92
gremmie@1 93 @login_required
gremmie@1 94 def popular(request):
gremmie@1 95 downloads = Download.public_objects.order_by('-hits')[:DLS_PER_PAGE]
gremmie@1 96 return render_to_response('downloads/download_summary.html', {
gremmie@1 97 'downloads' : downloads,
gremmie@1 98 'title' : 'Popular Downloads',
gremmie@1 99 },
gremmie@1 100 context_instance = RequestContext(request))
gremmie@1 101
gremmie@1 102 #######################################################################
gremmie@1 103
gremmie@1 104 @login_required
gremmie@1 105 def rating(request):
gremmie@1 106 downloads = Download.public_objects.order_by('-average_score')[:DLS_PER_PAGE]
gremmie@1 107 return render_to_response('downloads/download_summary.html', {
gremmie@1 108 'downloads' : downloads,
gremmie@1 109 'title' : 'Highest Rated Downloads',
gremmie@1 110 },
gremmie@1 111 context_instance = RequestContext(request))
gremmie@1 112
gremmie@1 113 #######################################################################
gremmie@1 114
gremmie@1 115 @login_required
gremmie@1 116 def download(request, id):
gremmie@1 117 download = Download.public_objects.get(pk=id)
gremmie@1 118 if download is None:
gremmie@1 119 raise Http404
gremmie@1 120 return _redirect_download(download)
gremmie@1 121
gremmie@1 122 #######################################################################
gremmie@1 123
gremmie@1 124 def _redirect_download(download):
gremmie@1 125 download.hits += 1
gremmie@1 126 download.save()
gremmie@1 127 return HttpResponseRedirect(download.file.url)
gremmie@1 128
gremmie@1 129 #######################################################################
gremmie@1 130
gremmie@1 131 @login_required
gremmie@1 132 def comments(request, id):
gremmie@1 133 download = Download.public_objects.get(pk=id)
gremmie@1 134 if download is None:
gremmie@1 135 raise Http404
gremmie@1 136 return render_to_response('downloads/download_comments.html', {
gremmie@1 137 'download' : download,
gremmie@1 138 },
gremmie@1 139 context_instance = RequestContext(request))
gremmie@1 140
gremmie@1 141 #######################################################################
gremmie@1 142
gremmie@1 143 @login_required
gremmie@1 144 def random_download(request):
gremmie@1 145 ids = Download.public_objects.values_list('id', flat=True)
gremmie@1 146 if not ids:
gremmie@1 147 raise Http404
gremmie@1 148 id = random.choice(ids)
gremmie@1 149 download = Download.objects.get(pk=id)
gremmie@1 150 return _redirect_download(download)
gremmie@1 151
gremmie@1 152 #######################################################################
gremmie@1 153
gremmie@1 154 @login_required
gremmie@1 155 def add(request):
gremmie@1 156 if request.method == 'POST':
gremmie@1 157 form = AddDownloadForm(request.POST, request.FILES)
gremmie@1 158 if form.is_valid():
gremmie@1 159 dl = form.save(commit=False)
gremmie@1 160 dl.user = request.user
gremmie@1 161 dl.ip_address = request.META.get('REMOTE_ADDR', None)
gremmie@1 162 dl.is_public = False
gremmie@1 163 dl.save()
gremmie@1 164 email_admins('New download for approval', """Hello,
gremmie@1 165
gremmie@1 166 A user has uploaded a new download for your approval.
gremmie@1 167 """)
gremmie@1 168 return HttpResponseRedirect(reverse('downloads-add_thanks'))
gremmie@1 169 else:
gremmie@1 170 form = AddDownloadForm()
gremmie@1 171
gremmie@1 172 return render_to_response('downloads/add.html', {
gremmie@1 173 'add_form': form,
gremmie@1 174 },
gremmie@1 175 context_instance=RequestContext(request))
gremmie@1 176
gremmie@1 177 #######################################################################
gremmie@1 178
gremmie@1 179 @login_required
gremmie@1 180 def thanks(request):
gremmie@1 181 return render_to_response('downloads/thanks.html', {
gremmie@1 182 },
gremmie@1 183 context_instance=RequestContext(request))
gremmie@1 184
gremmie@1 185 #######################################################################
gremmie@1 186
gremmie@1 187 @login_required
gremmie@1 188 def search(request, page=1):
gremmie@1 189 if request.method == 'POST':
gremmie@1 190 form = SearchForm(request.POST)
gremmie@1 191 if form.is_valid():
gremmie@1 192 query_text = form.query()
gremmie@1 193 page = 1
gremmie@1 194 else:
gremmie@1 195 return HttpResponseRedirect(reverse('downloads-index'))
gremmie@1 196 else:
gremmie@1 197 if 'query' in request.GET:
gremmie@1 198 query_text = request.GET['query']
gremmie@1 199 else:
gremmie@1 200 return HttpResponseRedirect(reverse('downloads-index'))
gremmie@1 201
gremmie@1 202 dls = Download.objects.filter(
gremmie@1 203 Q(title__icontains = query_text) |
gremmie@1 204 Q(description__icontains = query_text)).order_by('title')
gremmie@1 205 paginator = create_paginator(dls)
gremmie@1 206 try:
gremmie@1 207 the_page = paginator.page(int(page))
gremmie@1 208 except EmptyPage:
gremmie@1 209 dls = Download.objects.none()
gremmie@1 210 except InvalidPage:
gremmie@1 211 raise Http404
gremmie@1 212
gremmie@1 213 return render_to_response('downloads/search_results.html', {
gremmie@1 214 'query': query_text,
gremmie@1 215 'page': the_page,
gremmie@1 216 },
gremmie@1 217 context_instance = RequestContext(request))
gremmie@1 218
gremmie@1 219 #######################################################################
gremmie@1 220
gremmie@1 221 @require_POST
gremmie@1 222 def rate_download(request):
gremmie@1 223 """This function is called by AJAX to rate a download."""
gremmie@1 224 if request.user.is_authenticated():
gremmie@1 225 id = request.POST.get('id', None)
gremmie@1 226 rating = request.POST.get('rating', None)
gremmie@1 227 if id is None or rating is None:
gremmie@1 228 return HttpResponseBadRequest('Missing id or rating.')
gremmie@1 229
gremmie@1 230 try:
gremmie@1 231 rating = int(rating)
gremmie@1 232 except ValueError:
gremmie@1 233 return HttpResponseBadRequest('Invalid rating.')
gremmie@1 234
gremmie@1 235 # rating will be from 0-4
gremmie@1 236 rating = min(5, max(1, rating))
gremmie@1 237
gremmie@1 238 try:
gremmie@1 239 download = Download.public_objects.get(pk=id)
gremmie@1 240 except Download.DoesNotExist:
gremmie@1 241 return HttpResponseBadRequest('Invalid download id.')
gremmie@1 242
gremmie@1 243 # prevent multiple votes from the same user
gremmie@1 244 vote_record, created = VoteRecord.objects.get_or_create(download=download, user=request.user)
gremmie@1 245 if created:
gremmie@1 246 new_score = download.vote(rating)
gremmie@1 247 download.save()
gremmie@1 248 return HttpResponse(str(new_score))
gremmie@1 249 else:
gremmie@1 250 return HttpResponse('-1')
gremmie@1 251
gremmie@1 252 return HttpResponseForbidden('You must be logged in to rate a download.')