mirror of
https://github.com/pretix/pretix.git
synced 2026-05-06 15:24:02 +00:00
Refs #102 -- Added multiple-choice question types
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user