Do not show invisible questions in order overview

This commit is contained in:
Raphael Michel
2019-03-13 17:06:49 +01:00
parent f95e8f374d
commit 307ee36e52
3 changed files with 35 additions and 9 deletions

View File

@@ -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):

View File

@@ -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 = []

View File

@@ -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'