Mercurial > public > sg101
diff gpp/weblinks/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 | c0d0779b266f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gpp/weblinks/views.py Mon Apr 06 02:43:12 2009 +0000 @@ -0,0 +1,226 @@ +""" +Views for the weblinks application. +""" + +import datetime +import random +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.contrib import auth +from django.http import HttpResponseRedirect +from django.contrib.auth.decorators import login_required +from django.shortcuts import get_object_or_404 +from django.core.urlresolvers import reverse +from django.db.models import Q +from django.http import Http404 + +from core.paginator import DiggPaginator +from core.functions import email_admins +from weblinks.models import Category +from weblinks.models import Link +from weblinks.models import FlaggedLink +from weblinks.forms import SearchForm +from weblinks.forms import AddLinkForm + +####################################################################### + +LINKS_PER_PAGE = 10 + +def create_paginator(links): + return DiggPaginator(links, LINKS_PER_PAGE, body=5, tail=3, margin=3, padding=2) + +####################################################################### + +def link_index(request): + categories = Category.objects.all() + total_links = Link.public_objects.all().count() + form = SearchForm() + return render_to_response('weblinks/index.html', { + 'categories': categories, + 'total_links': total_links, + 'search_form': form, + }, + context_instance = RequestContext(request)) + +####################################################################### + +def new_links(request): + links = Link.public_objects.order_by('-date_added')[:LINKS_PER_PAGE] + return render_to_response('weblinks/link_summary.html', { + 'links': links, + 'title': 'Newest Links', + 'search_form': SearchForm(), + }, + context_instance = RequestContext(request)) + +####################################################################### + +def popular_links(request): + links = Link.public_objects.order_by('-hits')[:LINKS_PER_PAGE] + return render_to_response('weblinks/link_summary.html', { + 'links': links, + 'title': 'Popular Links', + 'search_form': SearchForm(), + }, + context_instance = RequestContext(request)) + +####################################################################### + +@login_required +def add_link(request): + if request.method == 'POST': + add_form = AddLinkForm(request.POST) + if add_form.is_valid(): + new_link = add_form.save(commit=False) + new_link.user = request.user + new_link.is_public = False + new_link.save() + email_admins('New link for approval', """Hello, + +A user has added a new link for your approval. +""") + return HttpResponseRedirect(reverse('weblinks.views.add_thanks')) + else: + add_form = AddLinkForm() + + return render_to_response('weblinks/add_link.html', { + 'search_form': SearchForm(), + 'add_form': add_form, + }, + context_instance = RequestContext(request)) + +####################################################################### + +@login_required +def add_thanks(request): + return render_to_response('weblinks/add_link.html', { + 'search_form': SearchForm(), + }, + context_instance = RequestContext(request)) + +####################################################################### + +# Maps URL component to database field name for the links table: + +LINK_FIELD_MAP = { + 'title': 'title', + 'date': '-date_added', + 'hits': '-hits' +} + +def view_links(request, category, sort='title', page='1'): + try: + cat = Category.objects.get(pk=category) + except Category.DoesNotExist: + raise Http404 + + if sort in LINK_FIELD_MAP: + order_by = LINK_FIELD_MAP[sort] + else: + sort = 'title' + order_by = LINK_FIELD_MAP['title'] + + links = Link.public_objects.filter(category = category).order_by(order_by) + paginator = create_paginator(links) + try: + the_page = paginator.page(int(page)) + except InvalidPage: + raise Http404 + + return render_to_response('weblinks/view_links.html', { + 's' : sort, + 'category' : cat, + 'page' : the_page, + 'search_form': SearchForm(), + }, + context_instance = RequestContext(request)) + +####################################################################### + +def _visit_link(request, link): + link.hits += 1 + link.save() + return HttpResponseRedirect(link.url) + +####################################################################### + +def visit(request, link_id): + link = get_object_or_404(Link, pk = link_id) + return _visit_link(request, link) + +####################################################################### + +def random_link(request): + ids = Link.public_objects.values_list('id', flat=True) + if not ids: + raise Http404 + id = random.choice(ids) + random_link = Link.public_objects.get(pk=id) + return _visit_link(request, random_link) + +####################################################################### + +@login_required +def report_link(request, link_id): + link = get_object_or_404(Link, pk = link_id) + if request.method == "POST": + FlaggedLink.objects.create(link, request.user) + email_admins('A Link Has Been Flagged as Broken', """Hello, + +A user has flagged a link as broken. +""") + return HttpResponseRedirect(reverse('weblinks.views.report_thanks', args = (link_id, ))) + + return render_to_response('weblinks/report_link.html', { + 'link': link, + 'search_form': SearchForm(), + 'report_thanks': False, + }, + context_instance = RequestContext(request)) + + +####################################################################### + +@login_required +def report_thanks(request, link_id): + link = get_object_or_404(Link, pk = link_id) + return render_to_response('weblinks/report_link.html', { + 'link': link, + 'search_form': SearchForm(), + 'report_thanks': True, + }, + context_instance = RequestContext(request)) + +####################################################################### + +def search_links(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('weblinks.views.link_index')) + else: + if 'query' in request.GET: + query_text = request.GET['query'] + else: + return HttpResponseRedirect(reverse('weblinks.views.link_index')) + + links = Link.public_objects.filter( + Q(title__icontains = query_text) | + Q(description__icontains = query_text)).order_by('title') + paginator = create_paginator(links) + try: + the_page = paginator.page(int(page)) + except EmptyPage: + links = Link.public_objects.none() + except InvalidPage: + raise Http404 + + return render_to_response('weblinks/search_results.html', { + 'query': query_text, + 'page': the_page, + 'search_form': SearchForm(), + }, + context_instance = RequestContext(request))