annotate shoutbox/views.py @ 887:9a15f7c27526

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