from django.shortcuts import redirect, get_object_or_404 from django.template import RequestContext, loader from django.http import HttpResponse, HttpResponseRedirect, Http404 from django.core.urlresolvers import reverse from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from django import forms from django.forms.widgets import RadioSelect, CheckboxSelectMultiple from gestioncof.models import Survey, SurveyQuestion, SurveyQuestionAnswer, SurveyAnswer from gestioncof.models import Event, EventOption, EventOptionChoice, EventRegistration def render_page (request, data, template): template = loader.get_template (template) context = RequestContext (request, data) return HttpResponse (template.render (context)) @login_required def home(request): data = {"surveys": Survey.objects.filter(survey_open = True).all(), "events": Event.objects.filter(registration_open = True).all()} return render_page(request, data, "home.html") def login(request): if request.user.is_authenticated(): return redirect("gestioncof.views.home") return render_page(request, {}, "login_switch.html") @login_required def logout(request): if request.user.get_profile().login_clipper: return redirect("django_cas.views.logout") else: return redirect("django.contrib.auth.views.logout") class SurveyForm(forms.Form): def __init__(self, *args, **kwargs): survey = kwargs.pop("survey") current_answers = kwargs.pop("current_answers", None) super(SurveyForm, self).__init__(*args, **kwargs) answers = {} if current_answers: for answer in current_answers.all(): if answer.survey_question.id not in answers: answers[answer.survey_question.id] = [answer.id] else: answers[answer.survey_question.id].append(answer.id) for question in survey.questions.all(): choices = [(answer.id, answer.answer) for answer in question.answers.all()] if question.multi_answers: initial = [] if question.id not in answers else answers[question.id] field = forms.MultipleChoiceField(label = question.question, choices = choices, widget = CheckboxSelectMultiple, required = False, initial = initial) else: initial = None if question.id not in answers else answers[question.id][0] field = forms.ChoiceField(label = question.question, choices = choices, widget = RadioSelect, required = False, initial = initial) field.question_id = question.id self.fields["question_%d" % question.id] = field def answers(self): for name, value in self.cleaned_data.items(): if name.startswith('question_'): yield (self.fields[name].question_id, value) @login_required def survey(request, survey_id): survey = get_object_or_404(Survey, id = survey_id) if not survey.survey_open: raise Http404 success = False if request.method == "POST": form = SurveyForm(request.POST, survey = survey) if form.is_valid(): all_answers = [] for question_id, answers_ids in form.answers(): question = get_object_or_404(SurveyQuestion, id = question_id, survey = survey) if type(answers_ids) != list: answers_ids = [answers_ids] if not question.multi_answers and len(answers_ids) > 1: raise Http404 for answer_id in answers_ids: answer_id = int(answer_id) answer = SurveyQuestionAnswer.objects.get( id = answer_id, survey_question = question) all_answers.append(answer) try: current_answer = SurveyAnswer.objects.get(user = request.user, survey = survey) except SurveyAnswer.DoesNotExist: current_answer = SurveyAnswer(user = request.user, survey = survey) current_answer.save() current_answer.answers = all_answers current_answer.save() success = True else: try: current_answer = SurveyAnswer.objects.get(user = request.user, survey = survey) form = SurveyForm(survey = survey, current_answers = current_answer.answers) except SurveyAnswer.DoesNotExist: form = SurveyForm(survey = survey) return render_page(request, {"survey": survey, "form": form, "success": success}, "survey.html")