gremmie@1: """
gremmie@1: Views for the Shoutbox application.
gremmie@1: """
gremmie@1: 
gremmie@1: import re
gremmie@1: from django.shortcuts import render_to_response
gremmie@1: from django.template import RequestContext
bgneal@92: from django.core.paginator import InvalidPage
gremmie@1: from django.http import HttpResponse
gremmie@1: from django.http import HttpResponseBadRequest
gremmie@1: from django.http import HttpResponseForbidden
gremmie@1: from django.http import HttpResponseRedirect
bgneal@151: from django.http import Http404
gremmie@1: from django.contrib.auth.decorators import login_required
bgneal@12: from django.views.decorators.http import require_POST
gremmie@1: 
gremmie@1: from core.paginator import DiggPaginator
bgneal@13: from core.functions import email_admins
bgneal@243: from core.functions import get_page
gremmie@1: from shoutbox.forms import ShoutBoxForm
gremmie@1: from shoutbox.models import Shout
bgneal@13: from shoutbox.models import ShoutFlag
gremmie@1: 
gremmie@1: SHOUTS_PER_PAGE = 10
gremmie@1: 
gremmie@1: @login_required
bgneal@12: @require_POST
gremmie@1: def shout(request):
bgneal@12:     msg = request.POST.get('msg', '').strip()
bgneal@12:     if msg == '':
bgneal@12:         return HttpResponse('')
bgneal@12: 
bgneal@12:     shout = Shout(user=request.user, shout=msg)
bgneal@12:     shout.save()
bgneal@12:     return render_to_response('shoutbox/shout.html', {
bgneal@12:        'shout': shout,
bgneal@12:        },
bgneal@12:        context_instance = RequestContext(request))
gremmie@1: 
gremmie@1: 
bgneal@13: def view_shout(request, id):
bgneal@13:     """This view is for viewing an individual shout."""
bgneal@13:     try:
bgneal@13:         shout = Shout.objects.get(pk=id)
bgneal@13:     except Shout.DoesNotExist:
bgneal@13:         return render_to_response('shoutbox/missing_shout.html', {},
bgneal@13:            context_instance = RequestContext(request))
bgneal@13: 
bgneal@13:     return render_to_response('shoutbox/view_shout.html', {
bgneal@13:        'shout': shout,
bgneal@13:        },
bgneal@13:        context_instance = RequestContext(request))
bgneal@13: 
bgneal@13: 
bgneal@243: def view_history(request):
gremmie@1:     """This view allows one to view the shoutbox history."""
bgneal@118:     paginator = DiggPaginator(Shout.objects.all().select_related(), 
bgneal@118:             SHOUTS_PER_PAGE, body=5, tail=3, margin=3, padding=2)
bgneal@243:     page = get_page(request.GET)
gremmie@1:     try:
bgneal@243:         the_page = paginator.page(page)
gremmie@1:     except InvalidPage:
gremmie@1:         raise Http404
gremmie@1: 
gremmie@1:     return render_to_response('shoutbox/view.html', {
gremmie@1:         'page': the_page,
gremmie@1:         },
gremmie@1:         context_instance = RequestContext(request))
gremmie@1:    
gremmie@1: 
gremmie@1: shout_id_re = re.compile(r'shout-(\d+)')
gremmie@1: 
gremmie@1: def text(request):
gremmie@1:     """This view function retrieves the text of a shout; it is used in the in-place
gremmie@1:     editing of shouts on the shoutbox history view."""
gremmie@1:     if request.user.is_authenticated():
gremmie@1:         m = shout_id_re.match(request.GET.get('id', ''))
gremmie@1:         if m is None:
gremmie@1:             return HttpResponseBadRequest()
gremmie@1:         try:
gremmie@1:             shout = Shout.objects.get(pk=m.group(1))
gremmie@1:         except Shout.DoesNotExist:
gremmie@1:             return HttpResponseBadRequest()
gremmie@1:         return HttpResponse(shout.shout)
gremmie@1: 
gremmie@1:     return HttpResponseForbidden()
gremmie@1: 
gremmie@1: 
gremmie@1: def edit(request):
gremmie@1:     """This view accepts a shoutbox edit from the shoutbox history view."""
gremmie@1:     if request.user.is_authenticated():
gremmie@1:         m = shout_id_re.match(request.POST.get('id', ''))
gremmie@1:         if m is None:
gremmie@1:             return HttpResponseBadRequest()
gremmie@1:         try:
gremmie@1:             shout = Shout.objects.get(pk=m.group(1))
gremmie@1:         except Shout.DoesNotExist:
gremmie@1:             return HttpResponseBadRequest()
gremmie@1:         if request.user != shout.user:
gremmie@1:             return HttpResponseForbidden()
gremmie@1:         new_shout = request.POST.get('value', '').strip()
gremmie@1:         if new_shout == '':
gremmie@1:             return HttpResponseBadRequest()
gremmie@1:         shout.shout = new_shout
gremmie@1:         shout.save()
bgneal@151:         return HttpResponse(shout.html)
gremmie@1: 
gremmie@1:     return HttpResponseForbidden()
gremmie@1: 
gremmie@1: 
gremmie@1: def delete(request):
gremmie@1:     """This view deletes a shout. It is called by AJAX from the shoutbox history view."""
gremmie@1:     if request.user.is_authenticated():
gremmie@1:         id = request.POST.get('id', None)
gremmie@1:         if id is None or not id.isdigit():
gremmie@1:             return HttpResponseBadRequest()
gremmie@1:         try:
gremmie@1:             shout = Shout.objects.get(pk=id)
gremmie@1:         except Shout.DoesNotExist:
gremmie@1:             return HttpResponseBadRequest()
gremmie@1:         if request.user != shout.user:
gremmie@1:             return HttpResponseForbidden()
gremmie@1:         shout.delete()
gremmie@1:         return HttpResponse(id)
gremmie@1: 
gremmie@1:     return HttpResponseForbidden()
bgneal@12: 
bgneal@13: 
bgneal@13: @require_POST
bgneal@13: def flag(request):
bgneal@13:     """
bgneal@13:     This function handles the flagging of shouts by users. This function should
bgneal@13:     be the target of an AJAX post.
bgneal@13:     """
bgneal@13:     if not request.user.is_authenticated():
bgneal@13:         return HttpResponse('Please login or register to flag a shout.')
bgneal@13: 
bgneal@13:     id = request.POST.get('id', None)
bgneal@13:     if id is None:
bgneal@13:         return HttpResponseBadRequest('No id')
bgneal@13: 
bgneal@13:     try:
bgneal@13:         shout = Shout.objects.get(pk=id)
bgneal@13:     except Shout.DoesNotExist:
bgneal@13:         return HttpResponseBadRequest('No shout with id %s' % id)
bgneal@13: 
bgneal@13:     flag = ShoutFlag(user=request.user, shout=shout)
bgneal@13:     flag.save()
bgneal@13:     email_admins('A Shout Has Been Flagged', """Hello,
bgneal@13: 
bgneal@13: A user has flagged a shout for review.
bgneal@13: """)
bgneal@13:     return HttpResponse('The shout was flagged. A moderator will review the shout shortly. ' \
bgneal@13:             'Thanks for helping to improve the quality of this site.')
bgneal@13: 
bgneal@12: # vim: ts=4 sw=4