view contests/views.py @ 821:71db8076dc3d

Bandmap WIP: geocoding integrated with add form. Add form works. Before submitting the form, client side JS makes a geocode request to Google and populates hidden lat/lon fields with the result. Successfully created a model instance on the server side. Still need to update admin dashboard, admin approval, and give out badges for adding bands to the map. Once that is done, then work on displaying the map with filtering.
author Brian Neal <bgneal@gmail.com>
date Tue, 23 Sep 2014 20:40:31 -0500
parents 89b240fe9297
children 16e190fa6ef8
line wrap: on
line source
"""
Views for the contests application.

"""
import json

from django.http import (HttpResponse, HttpResponseForbidden,
        HttpResponseBadRequest)
from django.shortcuts import get_object_or_404
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_result = json.dumps(result)
    return HttpResponse(json_result, content_type='application/json')