mirror of
https://github.com/pretix/pretix.git
synced 2026-05-04 15:04:03 +00:00
Allow dependent questions to depend on multiple values (#1336)
This commit is contained in:
@@ -1651,6 +1651,7 @@ TEST_QUESTION_RES = {
|
||||
"position": 0,
|
||||
"dependency_question": None,
|
||||
"dependency_value": None,
|
||||
"dependency_values": [],
|
||||
"options": [
|
||||
{
|
||||
"id": 0,
|
||||
@@ -1883,6 +1884,49 @@ def test_question_delete(token_client, organizer, event, question):
|
||||
assert not event.questions.filter(pk=question.id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_question_update_dependency_values(token_client, organizer, event, question):
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/questions/{}/'.format(organizer.slug, event.slug, question.pk),
|
||||
{
|
||||
"dependency_values": ["a", "b"]
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
question.refresh_from_db()
|
||||
assert question.dependency_values == ["a", "b"]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_question_update_dependency_value_legacy(token_client, organizer, event, question):
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/questions/{}/'.format(organizer.slug, event.slug, question.pk),
|
||||
{
|
||||
"dependency_value": "a"
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
question.refresh_from_db()
|
||||
assert question.dependency_values == ["a"]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_question_update_dependency_value_legacy_conflict(token_client, organizer, event, question):
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/questions/{}/'.format(organizer.slug, event.slug, question.pk),
|
||||
{
|
||||
"dependency_values": ["a", "b"],
|
||||
"dependency_value": "a"
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
question.refresh_from_db()
|
||||
assert question.dependency_values == ["a"]
|
||||
|
||||
|
||||
TEST_OPTIONS_RES = {
|
||||
"identifier": "LVETRWVU",
|
||||
"answer": {"en": "XL"},
|
||||
|
||||
@@ -245,24 +245,24 @@ class QuestionsTest(ItemFormTest):
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['items'] = self.item1.id
|
||||
form_data['dependency_question'] = q1.pk
|
||||
form_data['dependency_value'] = o1.identifier
|
||||
form_data['dependency_values'] = o1.identifier
|
||||
doc = self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q2.id),
|
||||
form_data)
|
||||
assert doc.select(".alert-success")
|
||||
q2.refresh_from_db()
|
||||
assert q2.dependency_question == q1
|
||||
assert q2.dependency_value == o1.identifier
|
||||
assert q2.dependency_values == [o1.identifier]
|
||||
|
||||
def test_set_dependency_circular(self):
|
||||
with scopes_disabled():
|
||||
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
|
||||
o1 = q1.options.create(answer='Germany')
|
||||
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="C", required=True,
|
||||
dependency_question=q1, dependency_value=o1.identifier)
|
||||
dependency_question=q1, dependency_values=[o1.identifier])
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q1.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['dependency_question'] = q2.pk
|
||||
form_data['dependency_value'] = '1'
|
||||
form_data['dependency_values'] = '1'
|
||||
doc = self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q1.id),
|
||||
form_data)
|
||||
assert not doc.select(".alert-success")
|
||||
@@ -274,7 +274,7 @@ class QuestionsTest(ItemFormTest):
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q2.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['dependency_question'] = q1.pk
|
||||
form_data['dependency_value'] = '1'
|
||||
form_data['dependency_values'] = '1'
|
||||
doc = self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q2.id),
|
||||
form_data)
|
||||
assert not doc.select(".alert-success")
|
||||
|
||||
@@ -2123,32 +2123,33 @@ class QuestionsTestCase(BaseCheckoutTestCase, TestCase):
|
||||
)
|
||||
self.q1.options.create(answer='Tech', identifier='TECH')
|
||||
self.q1.options.create(answer='Health', identifier='HEALTH')
|
||||
self.q1.options.create(answer='IT', identifier='IT')
|
||||
|
||||
self.q2a = self.event.questions.create(
|
||||
event=self.event, question='What is your occupation?', type=Question.TYPE_CHOICE_MULTIPLE,
|
||||
required=False, dependency_question=self.q1, dependency_value='TECH'
|
||||
required=False, dependency_question=self.q1, dependency_values=['TECH', 'IT']
|
||||
)
|
||||
self.q2a.options.create(answer='Software developer', identifier='DEV')
|
||||
self.q2a.options.create(answer='System administrator', identifier='ADMIN')
|
||||
|
||||
self.q2b = self.event.questions.create(
|
||||
event=self.event, question='What is your occupation?', type=Question.TYPE_CHOICE_MULTIPLE,
|
||||
required=True, dependency_question=self.q1, dependency_value='HEALTH'
|
||||
required=True, dependency_question=self.q1, dependency_values=['HEALTH']
|
||||
)
|
||||
self.q2b.options.create(answer='Doctor', identifier='DOC')
|
||||
self.q2b.options.create(answer='Nurse', identifier='NURSE')
|
||||
|
||||
self.q3 = self.event.questions.create(
|
||||
event=self.event, question='Do you like Python?', type=Question.TYPE_BOOLEAN,
|
||||
required=False, dependency_question=self.q2a, dependency_value='DEV'
|
||||
required=False, dependency_question=self.q2a, dependency_values=['DEV']
|
||||
)
|
||||
self.q4a = self.event.questions.create(
|
||||
event=self.event, question='Why?', type=Question.TYPE_TEXT,
|
||||
required=True, dependency_question=self.q3, dependency_value='True'
|
||||
required=True, dependency_question=self.q3, dependency_values=['True']
|
||||
)
|
||||
self.q4b = self.event.questions.create(
|
||||
event=self.event, question='Why not?', type=Question.TYPE_TEXT,
|
||||
required=True, dependency_question=self.q3, dependency_value='False'
|
||||
required=True, dependency_question=self.q3, dependency_values=['False']
|
||||
)
|
||||
self.ticket.questions.add(self.q1)
|
||||
self.ticket.questions.add(self.q2a)
|
||||
@@ -2188,6 +2189,15 @@ class QuestionsTestCase(BaseCheckoutTestCase, TestCase):
|
||||
self.q4a: 'No curly braces!'
|
||||
}, should_fail=False)
|
||||
|
||||
def test_question_dependencies_second_path_alterative(self):
|
||||
self._setup_dependency_questions()
|
||||
self._test_question_input({
|
||||
self.q1: 'IT',
|
||||
self.q2a: 'DEV',
|
||||
self.q3: 'True',
|
||||
self.q4a: 'No curly braces!'
|
||||
}, should_fail=False)
|
||||
|
||||
def test_question_dependencies_subitem_required(self):
|
||||
self._setup_dependency_questions()
|
||||
self._test_question_input({
|
||||
@@ -2202,6 +2212,14 @@ class QuestionsTestCase(BaseCheckoutTestCase, TestCase):
|
||||
self.q3: 'True',
|
||||
}, should_fail=True)
|
||||
|
||||
def test_question_dependencies_subsubitem_required_alternative(self):
|
||||
self._setup_dependency_questions()
|
||||
self._test_question_input({
|
||||
self.q1: 'IT',
|
||||
self.q2a: 'DEV',
|
||||
self.q3: 'True',
|
||||
}, should_fail=True)
|
||||
|
||||
def test_question_dependencies_parent_not_required(self):
|
||||
self._setup_dependency_questions()
|
||||
self._test_question_input({
|
||||
|
||||
Reference in New Issue
Block a user