view contests/views.py @ 629:f4c043cf55ac

Wiki integration. Requests don't always have sessions. In particular this occurs when a request is made without a trailing slash. The Common middleware redirects when this happens, and the middleware process_request() processing stops before a session can get added. So just set an attribute on the request object for each operation. This seemed weird to me at first, but there are plenty of examples of this in the Django code base already.
author Brian Neal <bgneal@gmail.com>
date Tue, 13 Nov 2012 13:50:06 -0600
parents ee87ea74d46b
children 89b240fe9297
line wrap: on
line source
"""
Views for the contests application.

"""
from django.http import (HttpResponse, HttpResponseForbidden,
        HttpResponseBadRequest)
from django.shortcuts import get_object_or_404
from django.utils import simplejson
from django.views.decorators.http import require_POST

from contests.models import Contest


@require_POST
def enter(request):
    """
    This view is an AJAX view that is used to enter or withdraw a user from a
    given contest. This function toggles the user's entered state in the
    contest.

    """
    if not request.user.is_authenticated():
        return HttpResponseForbidden("Please login first")

    contest_id = request.POST.get('contest_id')
    if not contest_id:
        return HttpResponseBadRequest("Missing contest_id")

    contest = get_object_or_404(Contest, pk=contest_id)
    if not contest.can_enter():
        return HttpResponseForbidden("Contest is over")

    # Toggle the user's state in the contest

    result = {}
    if request.user in contest.contestants.all():
        contest.contestants.remove(request.user)
        result['entered'] = False
        result['msg'] = 'You have been withdrawn from this contest.'
    else:
        contest.contestants.add(request.user)
        result['entered'] = True
        result['msg'] = 'You have been entered into this contest!'

    json = simplejson.dumps(result)
    return HttpResponse(json, content_type='application/json')