annotate gpp/weblinks/views.py @ 197:2baadae33f2e

Got autocomplete working for the member search. Updated django and ran into a bug where url tags with comma separated kwargs starting consuming tons of CPU throughput. The work-around is to cut over to using spaces between arguments. This is now allowed to be consistent with other tags. Did some query optimization for the news app.
author Brian Neal <bgneal@gmail.com>
date Sat, 10 Apr 2010 04:32:24 +0000
parents 046e6ef0ff45
children b4305e18d3af
rev   line source
gremmie@1 1 """
gremmie@1 2 Views for the weblinks application.
gremmie@1 3 """
gremmie@1 4
gremmie@1 5 import datetime
gremmie@1 6 import random
gremmie@1 7 from django.shortcuts import render_to_response
gremmie@1 8 from django.template import RequestContext
gremmie@1 9 from django.contrib import auth
bgneal@92 10 from django.core.paginator import InvalidPage
bgneal@165 11 from django.http import HttpResponse
bgneal@165 12 from django.http import HttpResponseBadRequest
gremmie@1 13 from django.http import HttpResponseRedirect
gremmie@1 14 from django.contrib.auth.decorators import login_required
gremmie@1 15 from django.shortcuts import get_object_or_404
gremmie@1 16 from django.core.urlresolvers import reverse
gremmie@1 17 from django.db.models import Q
gremmie@1 18 from django.http import Http404
bgneal@165 19 from django.views.decorators.http import require_POST
gremmie@1 20
gremmie@1 21 from core.paginator import DiggPaginator
gremmie@1 22 from core.functions import email_admins
gremmie@1 23 from weblinks.models import Category
gremmie@1 24 from weblinks.models import Link
gremmie@1 25 from weblinks.models import FlaggedLink
gremmie@1 26 from weblinks.forms import SearchForm
gremmie@1 27 from weblinks.forms import AddLinkForm
gremmie@1 28
gremmie@1 29 #######################################################################
gremmie@1 30
gremmie@1 31 LINKS_PER_PAGE = 10
gremmie@1 32
gremmie@1 33 def create_paginator(links):
gremmie@1 34 return DiggPaginator(links, LINKS_PER_PAGE, body=5, tail=3, margin=3, padding=2)
gremmie@1 35
gremmie@1 36 #######################################################################
gremmie@1 37
gremmie@1 38 def link_index(request):
gremmie@1 39 categories = Category.objects.all()
gremmie@1 40 total_links = Link.public_objects.all().count()
gremmie@1 41 return render_to_response('weblinks/index.html', {
gremmie@1 42 'categories': categories,
gremmie@1 43 'total_links': total_links,
gremmie@1 44 },
gremmie@1 45 context_instance = RequestContext(request))
gremmie@1 46
gremmie@1 47 #######################################################################
gremmie@1 48
gremmie@1 49 def new_links(request):
gremmie@1 50 links = Link.public_objects.order_by('-date_added')[:LINKS_PER_PAGE]
gremmie@1 51 return render_to_response('weblinks/link_summary.html', {
gremmie@1 52 'links': links,
gremmie@1 53 'title': 'Newest Links',
gremmie@1 54 },
gremmie@1 55 context_instance = RequestContext(request))
gremmie@1 56
gremmie@1 57 #######################################################################
gremmie@1 58
gremmie@1 59 def popular_links(request):
gremmie@1 60 links = Link.public_objects.order_by('-hits')[:LINKS_PER_PAGE]
gremmie@1 61 return render_to_response('weblinks/link_summary.html', {
gremmie@1 62 'links': links,
gremmie@1 63 'title': 'Popular Links',
gremmie@1 64 },
gremmie@1 65 context_instance = RequestContext(request))
gremmie@1 66
gremmie@1 67 #######################################################################
gremmie@1 68
gremmie@1 69 @login_required
gremmie@1 70 def add_link(request):
gremmie@1 71 if request.method == 'POST':
gremmie@1 72 add_form = AddLinkForm(request.POST)
gremmie@1 73 if add_form.is_valid():
gremmie@1 74 new_link = add_form.save(commit=False)
gremmie@1 75 new_link.user = request.user
gremmie@1 76 new_link.is_public = False
gremmie@1 77 new_link.save()
gremmie@1 78 email_admins('New link for approval', """Hello,
gremmie@1 79
gremmie@1 80 A user has added a new link for your approval.
gremmie@1 81 """)
gremmie@1 82 return HttpResponseRedirect(reverse('weblinks.views.add_thanks'))
gremmie@1 83 else:
gremmie@1 84 add_form = AddLinkForm()
gremmie@1 85
gremmie@1 86 return render_to_response('weblinks/add_link.html', {
gremmie@1 87 'add_form': add_form,
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 add_thanks(request):
gremmie@1 95 return render_to_response('weblinks/add_link.html', {
gremmie@1 96 },
gremmie@1 97 context_instance = RequestContext(request))
gremmie@1 98
gremmie@1 99 #######################################################################
gremmie@1 100
gremmie@1 101 # Maps URL component to database field name for the links table:
gremmie@1 102
gremmie@1 103 LINK_FIELD_MAP = {
gremmie@1 104 'title': 'title',
gremmie@1 105 'date': '-date_added',
gremmie@1 106 'hits': '-hits'
gremmie@1 107 }
gremmie@1 108
gremmie@1 109 def view_links(request, category, sort='title', page='1'):
gremmie@1 110 try:
gremmie@1 111 cat = Category.objects.get(pk=category)
gremmie@1 112 except Category.DoesNotExist:
gremmie@1 113 raise Http404
gremmie@1 114
gremmie@1 115 if sort in LINK_FIELD_MAP:
gremmie@1 116 order_by = LINK_FIELD_MAP[sort]
gremmie@1 117 else:
gremmie@1 118 sort = 'title'
gremmie@1 119 order_by = LINK_FIELD_MAP['title']
gremmie@1 120
gremmie@1 121 links = Link.public_objects.filter(category = category).order_by(order_by)
gremmie@1 122 paginator = create_paginator(links)
gremmie@1 123 try:
gremmie@1 124 the_page = paginator.page(int(page))
gremmie@1 125 except InvalidPage:
gremmie@1 126 raise Http404
gremmie@1 127
gremmie@1 128 return render_to_response('weblinks/view_links.html', {
gremmie@1 129 's' : sort,
gremmie@1 130 'category' : cat,
gremmie@1 131 'page' : the_page,
gremmie@1 132 },
gremmie@1 133 context_instance = RequestContext(request))
gremmie@1 134
gremmie@1 135 #######################################################################
gremmie@1 136
gremmie@1 137 def _visit_link(request, link):
gremmie@1 138 link.hits += 1
gremmie@1 139 link.save()
gremmie@1 140 return HttpResponseRedirect(link.url)
gremmie@1 141
gremmie@1 142 #######################################################################
gremmie@1 143
gremmie@1 144 def visit(request, link_id):
gremmie@1 145 link = get_object_or_404(Link, pk = link_id)
gremmie@1 146 return _visit_link(request, link)
gremmie@1 147
gremmie@1 148 #######################################################################
gremmie@1 149
gremmie@1 150 def random_link(request):
gremmie@1 151 ids = Link.public_objects.values_list('id', flat=True)
gremmie@1 152 if not ids:
gremmie@1 153 raise Http404
gremmie@1 154 id = random.choice(ids)
gremmie@1 155 random_link = Link.public_objects.get(pk=id)
gremmie@1 156 return _visit_link(request, random_link)
gremmie@1 157
gremmie@1 158 #######################################################################
gremmie@1 159
bgneal@165 160 @require_POST
gremmie@1 161 def report_link(request, link_id):
bgneal@165 162 """
bgneal@165 163 This function is the target of an AJAX POST to report a link as dead.
bgneal@165 164 """
bgneal@165 165 if not request.user.is_authenticated():
bgneal@165 166 return HttpResponse('Please login or register to report a broken link.')
gremmie@1 167
bgneal@165 168 try:
bgneal@165 169 link = Link.objects.get(pk=link_id)
bgneal@165 170 except Link.DoesNotExist:
bgneal@165 171 return HttpResponseBadRequest("That link doesn't exist.")
gremmie@1 172
bgneal@165 173 FlaggedLink.objects.create(link, request.user)
bgneal@165 174 return HttpResponse("The link was reported. A moderator will review the " \
bgneal@165 175 "link shortly. Thanks for helping to improve the content on " \
bgneal@165 176 "this site.")
gremmie@1 177
gremmie@1 178 #######################################################################
gremmie@1 179
gremmie@1 180 def search_links(request, page=1):
gremmie@1 181 if request.method == 'POST':
gremmie@1 182 form = SearchForm(request.POST)
gremmie@1 183 if form.is_valid():
gremmie@1 184 query_text = form.query()
gremmie@1 185 page = 1
gremmie@1 186 else:
gremmie@1 187 return HttpResponseRedirect(reverse('weblinks.views.link_index'))
gremmie@1 188 else:
gremmie@1 189 if 'query' in request.GET:
gremmie@1 190 query_text = request.GET['query']
gremmie@1 191 else:
gremmie@1 192 return HttpResponseRedirect(reverse('weblinks.views.link_index'))
gremmie@1 193
gremmie@1 194 links = Link.public_objects.filter(
gremmie@1 195 Q(title__icontains = query_text) |
bgneal@191 196 Q(description__icontains = query_text)).order_by('title').select_related()
gremmie@1 197 paginator = create_paginator(links)
gremmie@1 198 try:
gremmie@1 199 the_page = paginator.page(int(page))
gremmie@1 200 except EmptyPage:
gremmie@1 201 links = Link.public_objects.none()
gremmie@1 202 except InvalidPage:
gremmie@1 203 raise Http404
gremmie@1 204
gremmie@1 205 return render_to_response('weblinks/search_results.html', {
gremmie@1 206 'query': query_text,
gremmie@1 207 'page': the_page,
gremmie@1 208 },
gremmie@1 209 context_instance = RequestContext(request))
bgneal@20 210
bgneal@20 211 #######################################################################
bgneal@20 212
bgneal@20 213 def link_detail(request, id):
bgneal@20 214 link = get_object_or_404(Link, pk=id)
bgneal@20 215 return render_to_response('weblinks/link_detail.html', {
bgneal@20 216 'link': link,
bgneal@20 217 },
bgneal@20 218 context_instance = RequestContext(request))