annotate weblinks/views.py @ 661:15dbe0ccda95

Prevent exceptions when viewing downloads in the admin when the file doesn't exist on the filesystem. This is usually seen in development but can also happen in production if the file is missing.
author Brian Neal <bgneal@gmail.com>
date Tue, 14 May 2013 21:02:47 -0500
parents ee87ea74d46b
children 6e6492468bb8
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
bgneal@92 9 from django.core.paginator import InvalidPage
bgneal@165 10 from django.http import HttpResponse
bgneal@165 11 from django.http import HttpResponseBadRequest
gremmie@1 12 from django.http import HttpResponseRedirect
gremmie@1 13 from django.contrib.auth.decorators import login_required
gremmie@1 14 from django.shortcuts import get_object_or_404
gremmie@1 15 from django.core.urlresolvers import reverse
gremmie@1 16 from django.db.models import Q
gremmie@1 17 from django.http import Http404
bgneal@165 18 from django.views.decorators.http import require_POST
gremmie@1 19
gremmie@1 20 from core.paginator import DiggPaginator
gremmie@1 21 from core.functions import email_admins
bgneal@242 22 from core.functions import get_page
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 AddLinkForm
gremmie@1 27
gremmie@1 28 #######################################################################
gremmie@1 29
gremmie@1 30 LINKS_PER_PAGE = 10
gremmie@1 31
gremmie@1 32 def create_paginator(links):
gremmie@1 33 return DiggPaginator(links, LINKS_PER_PAGE, body=5, tail=3, margin=3, padding=2)
gremmie@1 34
gremmie@1 35 #######################################################################
gremmie@1 36
gremmie@1 37 def link_index(request):
gremmie@1 38 categories = Category.objects.all()
gremmie@1 39 total_links = Link.public_objects.all().count()
gremmie@1 40 return render_to_response('weblinks/index.html', {
gremmie@1 41 'categories': categories,
gremmie@1 42 'total_links': total_links,
gremmie@1 43 },
gremmie@1 44 context_instance = RequestContext(request))
gremmie@1 45
gremmie@1 46 #######################################################################
gremmie@1 47
gremmie@1 48 def new_links(request):
bgneal@242 49 links = Link.public_objects.order_by('-date_added')
bgneal@242 50 paginator = create_paginator(links)
bgneal@242 51 page = get_page(request.GET)
bgneal@242 52 try:
bgneal@242 53 the_page = paginator.page(page)
bgneal@242 54 except InvalidPage:
bgneal@242 55 raise Http404
bgneal@242 56
gremmie@1 57 return render_to_response('weblinks/link_summary.html', {
bgneal@242 58 'page': the_page,
gremmie@1 59 'title': 'Newest Links',
gremmie@1 60 },
gremmie@1 61 context_instance = RequestContext(request))
gremmie@1 62
gremmie@1 63 #######################################################################
gremmie@1 64
gremmie@1 65 def popular_links(request):
bgneal@242 66 links = Link.public_objects.order_by('-hits')
bgneal@242 67 paginator = create_paginator(links)
bgneal@242 68 page = get_page(request.GET)
bgneal@242 69 try:
bgneal@242 70 the_page = paginator.page(page)
bgneal@242 71 except InvalidPage:
bgneal@242 72 raise Http404
gremmie@1 73 return render_to_response('weblinks/link_summary.html', {
bgneal@242 74 'page': the_page,
gremmie@1 75 'title': 'Popular Links',
gremmie@1 76 },
gremmie@1 77 context_instance = RequestContext(request))
gremmie@1 78
gremmie@1 79 #######################################################################
gremmie@1 80
gremmie@1 81 @login_required
gremmie@1 82 def add_link(request):
gremmie@1 83 if request.method == 'POST':
gremmie@1 84 add_form = AddLinkForm(request.POST)
gremmie@1 85 if add_form.is_valid():
gremmie@1 86 new_link = add_form.save(commit=False)
gremmie@1 87 new_link.user = request.user
gremmie@1 88 new_link.save()
gremmie@1 89 email_admins('New link for approval', """Hello,
gremmie@1 90
gremmie@1 91 A user has added a new link for your approval.
gremmie@1 92 """)
bgneal@242 93 return HttpResponseRedirect(reverse('weblinks-add_thanks'))
gremmie@1 94 else:
gremmie@1 95 add_form = AddLinkForm()
gremmie@1 96
gremmie@1 97 return render_to_response('weblinks/add_link.html', {
gremmie@1 98 'add_form': add_form,
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 add_thanks(request):
gremmie@1 106 return render_to_response('weblinks/add_link.html', {
gremmie@1 107 },
gremmie@1 108 context_instance = RequestContext(request))
gremmie@1 109
gremmie@1 110 #######################################################################
gremmie@1 111
gremmie@1 112 # Maps URL component to database field name for the links table:
gremmie@1 113
gremmie@1 114 LINK_FIELD_MAP = {
gremmie@1 115 'title': 'title',
gremmie@1 116 'date': '-date_added',
gremmie@1 117 'hits': '-hits'
gremmie@1 118 }
gremmie@1 119
bgneal@242 120 def view_links(request, slug, sort='title'):
gremmie@1 121 try:
bgneal@242 122 cat = Category.objects.get(slug=slug)
gremmie@1 123 except Category.DoesNotExist:
gremmie@1 124 raise Http404
gremmie@1 125
gremmie@1 126 if sort in LINK_FIELD_MAP:
gremmie@1 127 order_by = LINK_FIELD_MAP[sort]
gremmie@1 128 else:
gremmie@1 129 sort = 'title'
gremmie@1 130 order_by = LINK_FIELD_MAP['title']
gremmie@1 131
bgneal@242 132 links = Link.public_objects.filter(category=cat).order_by(order_by)
gremmie@1 133 paginator = create_paginator(links)
bgneal@242 134 page = get_page(request.GET)
gremmie@1 135 try:
bgneal@242 136 the_page = paginator.page(page)
gremmie@1 137 except InvalidPage:
gremmie@1 138 raise Http404
gremmie@1 139
gremmie@1 140 return render_to_response('weblinks/view_links.html', {
gremmie@1 141 's' : sort,
gremmie@1 142 'category' : cat,
gremmie@1 143 'page' : the_page,
gremmie@1 144 },
gremmie@1 145 context_instance = RequestContext(request))
gremmie@1 146
gremmie@1 147 #######################################################################
gremmie@1 148
gremmie@1 149 def _visit_link(request, link):
gremmie@1 150 link.hits += 1
gremmie@1 151 link.save()
gremmie@1 152 return HttpResponseRedirect(link.url)
gremmie@1 153
gremmie@1 154 #######################################################################
gremmie@1 155
bgneal@208 156 @require_POST
gremmie@1 157 def visit(request, link_id):
gremmie@1 158 link = get_object_or_404(Link, pk = link_id)
gremmie@1 159 return _visit_link(request, link)
gremmie@1 160
gremmie@1 161 #######################################################################
gremmie@1 162
bgneal@208 163 @require_POST
gremmie@1 164 def random_link(request):
gremmie@1 165 ids = Link.public_objects.values_list('id', flat=True)
gremmie@1 166 if not ids:
gremmie@1 167 raise Http404
gremmie@1 168 id = random.choice(ids)
gremmie@1 169 random_link = Link.public_objects.get(pk=id)
gremmie@1 170 return _visit_link(request, random_link)
gremmie@1 171
gremmie@1 172 #######################################################################
gremmie@1 173
bgneal@165 174 @require_POST
gremmie@1 175 def report_link(request, link_id):
bgneal@165 176 """
bgneal@165 177 This function is the target of an AJAX POST to report a link as dead.
bgneal@165 178 """
bgneal@165 179 if not request.user.is_authenticated():
bgneal@165 180 return HttpResponse('Please login or register to report a broken link.')
gremmie@1 181
bgneal@165 182 try:
bgneal@165 183 link = Link.objects.get(pk=link_id)
bgneal@165 184 except Link.DoesNotExist:
bgneal@165 185 return HttpResponseBadRequest("That link doesn't exist.")
gremmie@1 186
bgneal@165 187 FlaggedLink.objects.create(link, request.user)
bgneal@165 188 return HttpResponse("The link was reported. A moderator will review the " \
bgneal@165 189 "link shortly. Thanks for helping to improve the content on " \
bgneal@165 190 "this site.")
gremmie@1 191
gremmie@1 192 #######################################################################
gremmie@1 193
bgneal@20 194 def link_detail(request, id):
bgneal@20 195 link = get_object_or_404(Link, pk=id)
bgneal@20 196 return render_to_response('weblinks/link_detail.html', {
bgneal@20 197 'link': link,
bgneal@20 198 },
bgneal@20 199 context_instance = RequestContext(request))