Mercurial > public > sg101
diff shoutbox/views.py @ 581:ee87ea74d46b
For Django 1.4, rearranged project structure for new manage.py.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Sat, 05 May 2012 17:10:48 -0500 |
parents | gpp/shoutbox/views.py@7ddd60164245 |
children | 0ca691cccf8d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/shoutbox/views.py Sat May 05 17:10:48 2012 -0500 @@ -0,0 +1,156 @@ +""" +Views for the Shoutbox application. +""" + +import re +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.core.paginator import InvalidPage +from django.http import HttpResponse +from django.http import HttpResponseBadRequest +from django.http import HttpResponseForbidden +from django.http import HttpResponseRedirect +from django.http import Http404 +from django.contrib.auth.decorators import login_required +from django.views.decorators.http import require_POST + +from core.paginator import DiggPaginator +from core.functions import email_admins +from core.functions import get_page +from shoutbox.forms import ShoutBoxForm +from shoutbox.models import Shout +from shoutbox.models import ShoutFlag + +SHOUTS_PER_PAGE = 10 + +@login_required +@require_POST +def shout(request): + msg = request.POST.get('msg', '').strip() + if msg == '': + return HttpResponse('') + + shout = Shout(user=request.user, shout=msg) + shout.save() + return render_to_response('shoutbox/shout.html', { + 'shout': shout, + }, + context_instance = RequestContext(request)) + + +def view_shout(request, id): + """This view is for viewing an individual shout.""" + try: + shout = Shout.objects.get(pk=id) + except Shout.DoesNotExist: + return render_to_response('shoutbox/missing_shout.html', {}, + context_instance = RequestContext(request)) + + return render_to_response('shoutbox/view_shout.html', { + 'shout': shout, + }, + context_instance = RequestContext(request)) + + +def view_history(request): + """This view allows one to view the shoutbox history.""" + paginator = DiggPaginator(Shout.objects.all().select_related(), + SHOUTS_PER_PAGE, body=5, tail=3, margin=3, padding=2) + page = get_page(request.GET) + try: + the_page = paginator.page(page) + except InvalidPage: + raise Http404 + + return render_to_response('shoutbox/view.html', { + 'page': the_page, + }, + context_instance = RequestContext(request)) + + +shout_id_re = re.compile(r'shout-(\d+)') + +def text(request): + """This view function retrieves the text of a shout; it is used in the in-place + editing of shouts on the shoutbox history view.""" + if request.user.is_authenticated(): + m = shout_id_re.match(request.GET.get('id', '')) + if m is None: + return HttpResponseBadRequest() + try: + shout = Shout.objects.get(pk=m.group(1)) + except Shout.DoesNotExist: + return HttpResponseBadRequest() + return HttpResponse(shout.shout) + + return HttpResponseForbidden() + + +def edit(request): + """This view accepts a shoutbox edit from the shoutbox history view.""" + if request.user.is_authenticated(): + m = shout_id_re.match(request.POST.get('id', '')) + if m is None: + return HttpResponseBadRequest() + try: + shout = Shout.objects.get(pk=m.group(1)) + except Shout.DoesNotExist: + return HttpResponseBadRequest() + if request.user != shout.user: + return HttpResponseForbidden() + new_shout = request.POST.get('value', '').strip() + if new_shout == '': + return HttpResponseBadRequest() + shout.shout = new_shout + shout.save() + return HttpResponse(shout.html) + + return HttpResponseForbidden() + + +def delete(request): + """This view deletes a shout. It is called by AJAX from the shoutbox history view.""" + if request.user.is_authenticated(): + id = request.POST.get('id', None) + if id is None or not id.isdigit(): + return HttpResponseBadRequest() + try: + shout = Shout.objects.get(pk=id) + except Shout.DoesNotExist: + return HttpResponseBadRequest() + if request.user != shout.user: + return HttpResponseForbidden() + shout.delete() + return HttpResponse(id) + + return HttpResponseForbidden() + + +@require_POST +def flag(request): + """ + This function handles the flagging of shouts by users. This function should + be the target of an AJAX post. + """ + if not request.user.is_authenticated(): + return HttpResponse('Please login or register to flag a shout.') + + id = request.POST.get('id', None) + if id is None: + return HttpResponseBadRequest('No id') + + try: + shout = Shout.objects.get(pk=id) + except Shout.DoesNotExist: + return HttpResponseBadRequest('No shout with id %s' % id) + + flag = ShoutFlag(user=request.user, shout=shout) + flag.save() + email_admins('A Shout Has Been Flagged', """Hello, + +A user has flagged a shout for review. +""") + return HttpResponse('The shout was flagged. A moderator will review the shout shortly. ' \ + 'Thanks for helping to improve the quality of this site.') + +# vim: ts=4 sw=4