From 307ee36e52f8f4dab39b70229ae36376bdede536 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 13 Mar 2019 17:06:49 +0100 Subject: [PATCH] Do not show invisible questions in order overview --- src/pretix/base/models/orders.py | 30 ++++++++++++++++++++++++---- src/pretix/control/views/orders.py | 6 ++++-- src/pretix/presale/views/__init__.py | 8 +++++--- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 0f4f2c32c..e0c230a31 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -946,16 +946,38 @@ class AbstractPosition(models.Model): # selected via prefetch_related if not all: if hasattr(self.item, 'questions_to_ask'): - self.questions = list(copy.copy(q) for q in self.item.questions_to_ask) + questions = list(copy.copy(q) for q in self.item.questions_to_ask) else: - self.questions = list(copy.copy(q) for q in self.item.questions.filter(ask_during_checkin=False)) + questions = list(copy.copy(q) for q in self.item.questions.filter(ask_during_checkin=False)) else: - self.questions = list(copy.copy(q) for q in self.item.questions.all()) - for q in self.questions: + questions = list(copy.copy(q) for q in self.item.questions.all()) + + question_cache = { + q.pk: q for q in questions + } + + def question_is_visible(parentid, qval): + parentq = question_cache[parentid] + if parentq.dependency_question_id and not question_is_visible(parentq.dependency_question_id, parentq.dependency_value): + return False + if parentid not in self.answ: + return False + if qval == 'True': + return self.answ[parentid].answer == 'True' + elif qval == 'False': + return self.answ[parentid].answer == 'False' + else: + return qval in [o.identifier for o in self.answ[parentid].options.all()] + + self.questions = [] + for q in questions: if q.id in self.answ: q.answer = self.answ[q.id] + q.answer.question = q # cache object else: q.answer = "" + if not q.dependency_question_id or question_is_visible(q.dependency_question_id, q.dependency_value): + self.questions.append(q) @property def net_price(self): diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 352de83a8..d21e81299 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -12,7 +12,7 @@ from django.contrib import messages from django.core.files import File from django.db import transaction from django.db.models import ( - Count, IntegerField, OuterRef, ProtectedError, Q, Subquery, Sum, + Count, IntegerField, OuterRef, Prefetch, ProtectedError, Q, Subquery, Sum, ) from django.http import ( FileResponse, Http404, HttpResponseNotAllowed, JsonResponse, @@ -234,7 +234,9 @@ class OrderDetail(OrderView): ).select_related( 'item', 'variation', 'addon_to', 'tax_rule' ).prefetch_related( - 'item__questions', 'answers', 'answers__question', 'checkins', 'checkins__list' + 'item__questions', + Prefetch('answers', queryset=QuestionAnswer.objects.prefetch_related('options').select_related('question')), + 'checkins', 'checkins__list' ).order_by('positionid') positions = [] diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index f1ae264ca..ab7efeeb8 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -5,13 +5,15 @@ from functools import wraps from itertools import groupby from django.conf import settings -from django.db.models import Sum +from django.db.models import Prefetch, Sum from django.utils.decorators import available_attrs from django.utils.functional import cached_property from django.utils.timezone import now from pretix.base.i18n import language -from pretix.base.models import CartPosition, InvoiceAddress, OrderPosition +from pretix.base.models import ( + CartPosition, InvoiceAddress, OrderPosition, QuestionAnswer, +) from pretix.base.services.cart import get_fees from pretix.multidomain.urlreverse import eventreverse from pretix.presale.signals import question_form_fields @@ -48,7 +50,7 @@ class CartMixin: prefetch = [] if answers: prefetch.append('item__questions') - prefetch.append('answers') + prefetch.append(Prefetch('answers', queryset=QuestionAnswer.objects.prefetch_related('options'))) cartpos = queryset.order_by( 'item__category__position', 'item__category_id', 'item__position', 'item__name', 'variation__value'