annotate gpp/shoutbox/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 (2010-04-10)
parents e1d1a70d312d
children 7ddd60164245
rev   line source
gremmie@1 1 """
gremmie@1 2 Views for the Shoutbox application.
gremmie@1 3 """
gremmie@1 4
gremmie@1 5 import re
gremmie@1 6 from django.shortcuts import render_to_response
gremmie@1 7 from django.template import RequestContext
bgneal@92 8 from django.core.paginator import InvalidPage
gremmie@1 9 from django.http import HttpResponse
gremmie@1 10 from django.http import HttpResponseBadRequest
gremmie@1 11 from django.http import HttpResponseForbidden
gremmie@1 12 from django.http import HttpResponseRedirect
bgneal@151 13 from django.http import Http404
gremmie@1 14 from django.contrib.auth.decorators import login_required
bgneal@12 15 from django.views.decorators.http import require_POST
gremmie@1 16
gremmie@1 17 from core.paginator import DiggPaginator
bgneal@13 18 from core.functions import email_admins
gremmie@1 19 from shoutbox.forms import ShoutBoxForm
gremmie@1 20 from shoutbox.models import Shout
bgneal@13 21 from shoutbox.models import ShoutFlag
gremmie@1 22
gremmie@1 23 SHOUTS_PER_PAGE = 10
gremmie@1 24
gremmie@1 25 @login_required
bgneal@12 26 @require_POST
gremmie@1 27 def shout(request):
bgneal@12 28 msg = request.POST.get('msg', '').strip()
bgneal@12 29 if msg == '':
bgneal@12 30 return HttpResponse('')
bgneal@12 31
bgneal@12 32 shout = Shout(user=request.user, shout=msg)
bgneal@12 33 shout.save()
bgneal@12 34 return render_to_response('shoutbox/shout.html', {
bgneal@12 35 'shout': shout,
bgneal@12 36 },
bgneal@12 37 context_instance = RequestContext(request))
gremmie@1 38
gremmie@1 39
bgneal@13 40 def view_shout(request, id):
bgneal@13 41 """This view is for viewing an individual shout."""
bgneal@13 42 try:
bgneal@13 43 shout = Shout.objects.get(pk=id)
bgneal@13 44 except Shout.DoesNotExist:
bgneal@13 45 return render_to_response('shoutbox/missing_shout.html', {},
bgneal@13 46 context_instance = RequestContext(request))
bgneal@13 47
bgneal@13 48 return render_to_response('shoutbox/view_shout.html', {
bgneal@13 49 'shout': shout,
bgneal@13 50 },
bgneal@13 51 context_instance = RequestContext(request))
bgneal@13 52
bgneal@13 53
bgneal@13 54 def view_history(request, page=1):
gremmie@1 55 """This view allows one to view the shoutbox history."""
bgneal@118 56 paginator = DiggPaginator(Shout.objects.all().select_related(),
bgneal@118 57 SHOUTS_PER_PAGE, body=5, tail=3, margin=3, padding=2)
gremmie@1 58 try:
gremmie@1 59 the_page = paginator.page(int(page))
gremmie@1 60 except InvalidPage:
gremmie@1 61 raise Http404
gremmie@1 62
gremmie@1 63 return render_to_response('shoutbox/view.html', {
gremmie@1 64 'page': the_page,
gremmie@1 65 },
gremmie@1 66 context_instance = RequestContext(request))
gremmie@1 67
gremmie@1 68
gremmie@1 69 shout_id_re = re.compile(r'shout-(\d+)')
gremmie@1 70
gremmie@1 71 def text(request):
gremmie@1 72 """This view function retrieves the text of a shout; it is used in the in-place
gremmie@1 73 editing of shouts on the shoutbox history view."""
gremmie@1 74 if request.user.is_authenticated():
gremmie@1 75 m = shout_id_re.match(request.GET.get('id', ''))
gremmie@1 76 if m is None:
gremmie@1 77 return HttpResponseBadRequest()
gremmie@1 78 try:
gremmie@1 79 shout = Shout.objects.get(pk=m.group(1))
gremmie@1 80 except Shout.DoesNotExist:
gremmie@1 81 return HttpResponseBadRequest()
gremmie@1 82 return HttpResponse(shout.shout)
gremmie@1 83
gremmie@1 84 return HttpResponseForbidden()
gremmie@1 85
gremmie@1 86
gremmie@1 87 def edit(request):
gremmie@1 88 """This view accepts a shoutbox edit from the shoutbox history view."""
gremmie@1 89 if request.user.is_authenticated():
gremmie@1 90 m = shout_id_re.match(request.POST.get('id', ''))
gremmie@1 91 if m is None:
gremmie@1 92 return HttpResponseBadRequest()
gremmie@1 93 try:
gremmie@1 94 shout = Shout.objects.get(pk=m.group(1))
gremmie@1 95 except Shout.DoesNotExist:
gremmie@1 96 return HttpResponseBadRequest()
gremmie@1 97 if request.user != shout.user:
gremmie@1 98 return HttpResponseForbidden()
gremmie@1 99 new_shout = request.POST.get('value', '').strip()
gremmie@1 100 if new_shout == '':
gremmie@1 101 return HttpResponseBadRequest()
gremmie@1 102 shout.shout = new_shout
gremmie@1 103 shout.save()
bgneal@151 104 return HttpResponse(shout.html)
gremmie@1 105
gremmie@1 106 return HttpResponseForbidden()
gremmie@1 107
gremmie@1 108
gremmie@1 109 def delete(request):
gremmie@1 110 """This view deletes a shout. It is called by AJAX from the shoutbox history view."""
gremmie@1 111 if request.user.is_authenticated():
gremmie@1 112 id = request.POST.get('id', None)
gremmie@1 113 if id is None or not id.isdigit():
gremmie@1 114 return HttpResponseBadRequest()
gremmie@1 115 try:
gremmie@1 116 shout = Shout.objects.get(pk=id)
gremmie@1 117 except Shout.DoesNotExist:
gremmie@1 118 return HttpResponseBadRequest()
gremmie@1 119 if request.user != shout.user:
gremmie@1 120 return HttpResponseForbidden()
gremmie@1 121 shout.delete()
gremmie@1 122 return HttpResponse(id)
gremmie@1 123
gremmie@1 124 return HttpResponseForbidden()
bgneal@12 125
bgneal@13 126
bgneal@13 127 @require_POST
bgneal@13 128 def flag(request):
bgneal@13 129 """
bgneal@13 130 This function handles the flagging of shouts by users. This function should
bgneal@13 131 be the target of an AJAX post.
bgneal@13 132 """
bgneal@13 133 if not request.user.is_authenticated():
bgneal@13 134 return HttpResponse('Please login or register to flag a shout.')
bgneal@13 135
bgneal@13 136 id = request.POST.get('id', None)
bgneal@13 137 if id is None:
bgneal@13 138 return HttpResponseBadRequest('No id')
bgneal@13 139
bgneal@13 140 try:
bgneal@13 141 shout = Shout.objects.get(pk=id)
bgneal@13 142 except Shout.DoesNotExist:
bgneal@13 143 return HttpResponseBadRequest('No shout with id %s' % id)
bgneal@13 144
bgneal@13 145 flag = ShoutFlag(user=request.user, shout=shout)
bgneal@13 146 flag.save()
bgneal@13 147 email_admins('A Shout Has Been Flagged', """Hello,
bgneal@13 148
bgneal@13 149 A user has flagged a shout for review.
bgneal@13 150 """)
bgneal@13 151 return HttpResponse('The shout was flagged. A moderator will review the shout shortly. ' \
bgneal@13 152 'Thanks for helping to improve the quality of this site.')
bgneal@13 153
bgneal@12 154 # vim: ts=4 sw=4