Mercurial > public > sg101
diff gpp/downloads/views.py @ 1:dbd703f7d63a
Initial import of sg101 stuff from private repository.
author | gremmie |
---|---|
date | Mon, 06 Apr 2009 02:43:12 +0000 |
parents | |
children | a5f27f25fa52 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gpp/downloads/views.py Mon Apr 06 02:43:12 2009 +0000 @@ -0,0 +1,252 @@ +""" +Views for the downloads application. +""" +import random + +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.contrib.auth.decorators import login_required +from django.http import Http404 +from django.http import HttpResponse +from django.http import HttpResponseRedirect +from django.http import HttpResponseForbidden +from django.http import HttpResponseBadRequest +from django.core.urlresolvers import reverse +from django.db.models import Q +from django.views.decorators.http import require_POST + +from core.paginator import DiggPaginator +from core.functions import email_admins +from downloads.models import Category +from downloads.models import Download +from downloads.models import VoteRecord +from downloads.forms import AddDownloadForm +from downloads.forms import SearchForm + +####################################################################### + +DLS_PER_PAGE = 10 + +def create_paginator(dls): + return DiggPaginator(dls, DLS_PER_PAGE, body=5, tail=3, margin=3, padding=2) + +####################################################################### + +@login_required +def index(request): + categories = Category.objects.all() + total_dls = Download.public_objects.all().count() + return render_to_response('downloads/index.html', { + 'categories': categories, + 'total_dls': total_dls, + }, + context_instance = RequestContext(request)) + +####################################################################### +# Maps URL component to database field name for the Download table: + +DOWNLOAD_FIELD_MAP = { + 'title': 'title', + 'date': '-date_added', + 'rating': '-average_score', + 'hits': '-hits' +} + +@login_required +def category(request, category, sort='title', page='1'): + try: + cat = Category.objects.get(pk=category) + except Category.DoesNotExist: + raise Http404 + + if sort not in DOWNLOAD_FIELD_MAP: + sort = 'title' + order_by = DOWNLOAD_FIELD_MAP[sort] + + downloads = Download.public_objects.filter(category=cat.pk).order_by(order_by) + paginator = create_paginator(downloads) + try: + the_page = paginator.page(int(page)) + except InvalidPage: + raise Http404 + + return render_to_response('downloads/download_list.html', { + 's' : sort, + 'category' : cat, + 'page' : the_page, + }, + context_instance = RequestContext(request)) + +####################################################################### + +@login_required +def new(request): + downloads = Download.public_objects.order_by('-date_added')[:DLS_PER_PAGE] + return render_to_response('downloads/download_summary.html', { + 'downloads' : downloads, + 'title' : 'Newest Downloads', + }, + context_instance = RequestContext(request)) + +####################################################################### + +@login_required +def popular(request): + downloads = Download.public_objects.order_by('-hits')[:DLS_PER_PAGE] + return render_to_response('downloads/download_summary.html', { + 'downloads' : downloads, + 'title' : 'Popular Downloads', + }, + context_instance = RequestContext(request)) + +####################################################################### + +@login_required +def rating(request): + downloads = Download.public_objects.order_by('-average_score')[:DLS_PER_PAGE] + return render_to_response('downloads/download_summary.html', { + 'downloads' : downloads, + 'title' : 'Highest Rated Downloads', + }, + context_instance = RequestContext(request)) + +####################################################################### + +@login_required +def download(request, id): + download = Download.public_objects.get(pk=id) + if download is None: + raise Http404 + return _redirect_download(download) + +####################################################################### + +def _redirect_download(download): + download.hits += 1 + download.save() + return HttpResponseRedirect(download.file.url) + +####################################################################### + +@login_required +def comments(request, id): + download = Download.public_objects.get(pk=id) + if download is None: + raise Http404 + return render_to_response('downloads/download_comments.html', { + 'download' : download, + }, + context_instance = RequestContext(request)) + +####################################################################### + +@login_required +def random_download(request): + ids = Download.public_objects.values_list('id', flat=True) + if not ids: + raise Http404 + id = random.choice(ids) + download = Download.objects.get(pk=id) + return _redirect_download(download) + +####################################################################### + +@login_required +def add(request): + if request.method == 'POST': + form = AddDownloadForm(request.POST, request.FILES) + if form.is_valid(): + dl = form.save(commit=False) + dl.user = request.user + dl.ip_address = request.META.get('REMOTE_ADDR', None) + dl.is_public = False + dl.save() + email_admins('New download for approval', """Hello, + +A user has uploaded a new download for your approval. +""") + return HttpResponseRedirect(reverse('downloads-add_thanks')) + else: + form = AddDownloadForm() + + return render_to_response('downloads/add.html', { + 'add_form': form, + }, + context_instance=RequestContext(request)) + +####################################################################### + +@login_required +def thanks(request): + return render_to_response('downloads/thanks.html', { + }, + context_instance=RequestContext(request)) + +####################################################################### + +@login_required +def search(request, page=1): + if request.method == 'POST': + form = SearchForm(request.POST) + if form.is_valid(): + query_text = form.query() + page = 1 + else: + return HttpResponseRedirect(reverse('downloads-index')) + else: + if 'query' in request.GET: + query_text = request.GET['query'] + else: + return HttpResponseRedirect(reverse('downloads-index')) + + dls = Download.objects.filter( + Q(title__icontains = query_text) | + Q(description__icontains = query_text)).order_by('title') + paginator = create_paginator(dls) + try: + the_page = paginator.page(int(page)) + except EmptyPage: + dls = Download.objects.none() + except InvalidPage: + raise Http404 + + return render_to_response('downloads/search_results.html', { + 'query': query_text, + 'page': the_page, + }, + context_instance = RequestContext(request)) + +####################################################################### + +@require_POST +def rate_download(request): + """This function is called by AJAX to rate a download.""" + if request.user.is_authenticated(): + id = request.POST.get('id', None) + rating = request.POST.get('rating', None) + if id is None or rating is None: + return HttpResponseBadRequest('Missing id or rating.') + + try: + rating = int(rating) + except ValueError: + return HttpResponseBadRequest('Invalid rating.') + + # rating will be from 0-4 + rating = min(5, max(1, rating)) + + try: + download = Download.public_objects.get(pk=id) + except Download.DoesNotExist: + return HttpResponseBadRequest('Invalid download id.') + + # prevent multiple votes from the same user + vote_record, created = VoteRecord.objects.get_or_create(download=download, user=request.user) + if created: + new_score = download.vote(rating) + download.save() + return HttpResponse(str(new_score)) + else: + return HttpResponse('-1') + + return HttpResponseForbidden('You must be logged in to rate a download.')