Refs #102 -- Added multiple-choice question types

This commit is contained in:
Raphael Michel
2016-02-23 10:09:33 +01:00
parent eed74545bc
commit 1cd0c1f53b
12 changed files with 306 additions and 25 deletions

View File

@@ -76,7 +76,7 @@ class QuestionsForm(forms.Form):
if a.question_id == q.id
]
if answers:
initial = answers[0].answer
initial = answers[0]
else:
initial = None
if q.type == Question.TYPE_BOOLEAN:
@@ -87,27 +87,45 @@ class QuestionsForm(forms.Form):
else:
widget = forms.CheckboxInput()
initial = (initial == "True")
if initial:
initialbool = (initial.answer == "True")
else:
initialbool = False
field = forms.BooleanField(
label=q.question, required=q.required,
initial=initial, widget=widget
initial=initialbool, widget=widget
)
elif q.type == Question.TYPE_NUMBER:
field = forms.DecimalField(
label=q.question, required=q.required,
initial=initial, min_value=Decimal('0.00')
initial=initial.answer if initial else None,
min_value=Decimal('0.00')
)
elif q.type == Question.TYPE_STRING:
field = forms.CharField(
label=q.question, required=q.required,
initial=initial
initial=initial.answer if initial else None,
)
elif q.type == Question.TYPE_TEXT:
field = forms.CharField(
label=q.question, required=q.required,
widget=forms.Textarea,
initial=initial
initial=initial.answer if initial else None,
)
elif q.type == Question.TYPE_CHOICE:
field = forms.ModelChoiceField(
queryset=q.options.all(),
label=q.question, required=q.required,
widget=forms.RadioSelect,
initial=initial.options.first() if initial else None,
)
elif q.type == Question.TYPE_CHOICE_MULTIPLE:
field = forms.ModelMultipleChoiceField(
queryset=q.options.all(),
label=q.question, required=q.required,
widget=forms.CheckboxSelectMultiple,
initial=initial.options.all() if initial else None,
)
field.question = q
if answers:

View File

@@ -1,3 +1,4 @@
from django import forms
from django.utils.functional import cached_property
from pretix.base.models import CartPosition, OrderPosition, QuestionAnswer
@@ -47,13 +48,33 @@ class QuestionsViewMixin:
if v == '':
field.answer.delete()
else:
field.answer.answer = v
self._save_to_answer(field, field.answer, v)
field.answer.save()
elif v != '':
QuestionAnswer.objects.create(
answer = QuestionAnswer(
cartposition=(form.pos if isinstance(form.pos, CartPosition) else None),
orderposition=(form.pos if isinstance(form.pos, OrderPosition) else None),
question=field.question,
answer=v
)
self._save_to_answer(field, answer, v)
answer.save()
return not failed
def _save_to_answer(self, field, answer, value):
if isinstance(field, forms.ModelMultipleChoiceField):
answstr = ", ".join([str(o) for o in value])
if not answer.pk:
answer.save()
else:
answer.options.clear()
answer.answer = answstr
answer.options.add(*value)
elif isinstance(field, forms.ModelChoiceField):
if not answer.pk:
answer.save()
else:
answer.options.clear()
answer.options.add(value)
answer.answer = value.answer
else:
answer.answer = value