diff --git a/src/pretix/api/serializers/item.py b/src/pretix/api/serializers/item.py index dea711d79..d4b2c3103 100644 --- a/src/pretix/api/serializers/item.py +++ b/src/pretix/api/serializers/item.py @@ -555,7 +555,8 @@ class QuestionSerializer(I18nAwareModelSerializer): def validate_dependency_question(self, value): if value: - if value.type not in (Question.TYPE_CHOICE, Question.TYPE_BOOLEAN, Question.TYPE_CHOICE_MULTIPLE): + if value.type not in (Question.TYPE_CHOICE, Question.TYPE_BOOLEAN, Question.TYPE_CHOICE_MULTIPLE, + Question.TYPE_COUNTRYCODE): raise ValidationError('Question dependencies can only be set to boolean or choice questions.') if value == self.instance: raise ValidationError('A question cannot depend on itself.') diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index bb56ceb9c..5b91ba8ce 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -1061,6 +1061,7 @@ class BaseQuestionsForm(forms.Form): return ( ('True' in qvals and dval) or ('False' in qvals and not dval) + or (parentq.type == Question.TYPE_COUNTRYCODE and str(dval) in qvals) or (isinstance(dval, QuestionOption) and dval.identifier in qvals) or (isinstance(dval, (list, QuerySet)) and any(qval in [o.identifier for o in dval] for qval in qvals)) ) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index f8201f071..2ee78f059 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -1623,6 +1623,7 @@ class AbstractPosition(RoundingCorrectionMixin, models.Model): return ( ('True' in qvals and self.answ[parentid].answer == 'True') or ('False' in qvals and self.answ[parentid].answer == 'False') + or (parentq.type == Question.TYPE_COUNTRYCODE and self.answ[parentid].answer in qvals) or (any(qval in [o.identifier for o in self.answ[parentid].options.all()] for qval in qvals)) ) diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 6d5b8f179..5fbb8f251 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -155,7 +155,7 @@ class QuestionForm(I18nModelForm): self.fields['items'].queryset = self.instance.event.items.all() self.fields['items'].required = True self.fields['dependency_question'].queryset = self.instance.event.questions.filter( - type__in=(Question.TYPE_BOOLEAN, Question.TYPE_CHOICE, Question.TYPE_CHOICE_MULTIPLE), + type__in=(Question.TYPE_BOOLEAN, Question.TYPE_CHOICE, Question.TYPE_CHOICE_MULTIPLE, Question.TYPE_COUNTRYCODE), ask_during_checkin=False ) if self.instance.pk: diff --git a/src/pretix/control/templates/pretixcontrol/items/question_edit.html b/src/pretix/control/templates/pretixcontrol/items/question_edit.html index e42b084cf..953841082 100644 --- a/src/pretix/control/templates/pretixcontrol/items/question_edit.html +++ b/src/pretix/control/templates/pretixcontrol/items/question_edit.html @@ -143,6 +143,7 @@
+ {% bootstrap_field form.dependency_values layout="inline" form_group_class="inner" %}
diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index b0af1dda1..9f3094091 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -87,6 +87,7 @@ from pretix.control.signals import item_forms, item_formsets from pretix.helpers.models import modelcopy from ...helpers.compat import CompatDeleteView +from ...helpers.countries import CachedCountries from . import ChartContainingView, CreateView, PaginationMixin, UpdateView @@ -657,6 +658,7 @@ class QuestionMixin: def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) ctx['formset'] = self.formset + ctx['countries'] = [{"id": k, "name": str(c)} for k, c in dict(CachedCountries().countries).items()] return ctx diff --git a/src/pretix/presale/checkoutflow.py b/src/pretix/presale/checkoutflow.py index 0629af00f..915278f0e 100644 --- a/src/pretix/presale/checkoutflow.py +++ b/src/pretix/presale/checkoutflow.py @@ -1058,6 +1058,7 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep): return ( ('True' in qvals and answ[parentid].answer == 'True') or ('False' in qvals and answ[parentid].answer == 'False') + or (parentq.type == Question.TYPE_COUNTRYCODE and answ[parentid].answer in qvals) or (any(qval in [o.identifier for o in answ[parentid].options.all()] for qval in qvals)) ) diff --git a/src/pretix/static/pretixcontrol/js/ui/question.js b/src/pretix/static/pretixcontrol/js/ui/question.js index 99dff95d5..c48eff86b 100644 --- a/src/pretix/static/pretixcontrol/js/ui/question.js +++ b/src/pretix/static/pretixcontrol/js/ui/question.js @@ -114,6 +114,7 @@ $(function () { var $val = $("#id_dependency_values"); var $dq = $("#id_dependency_question"); var oldval = JSON.parse($("#dependency_value_val").text()); + var countries = JSON.parse($("#countries").text()); function update_dependency_options() { $val.parent().find(".loading-indicator").remove(); $("#id_dependency_values option").remove(); @@ -135,6 +136,10 @@ $(function () { if (data.type === "B") { $val.append($("