diff --git a/src/pretix/control/templates/pretixcontrol/items/index.html b/src/pretix/control/templates/pretixcontrol/items/index.html index 3dc1f1a7d2..591152d127 100644 --- a/src/pretix/control/templates/pretixcontrol/items/index.html +++ b/src/pretix/control/templates/pretixcontrol/items/index.html @@ -45,6 +45,7 @@ + {% trans "Default price" %} Edit @@ -113,6 +114,20 @@ {% endif %} + + {% if i.attendee_data_required %} + {{ i.questionnaire_names_html }}"> + + + + {% elif i.attendee_data_asked %} + {{ i.questionnaire_names_html }}"> + + + {% elif i.custom_questions_asked %} + {{ i.questionnaire_names_html }}"> + {% endif %} + {% if i.var_count %} diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index bf46b03273..98769c9de7 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -53,6 +53,8 @@ from django.http import ( from django.shortcuts import redirect, render from django.urls import resolve, reverse from django.utils.functional import cached_property +from django.utils.html import format_html_join +from django.utils.safestring import mark_safe from django.utils.timezone import now from django.utils.translation import gettext, gettext_lazy as _ from django.views.decorators.http import require_http_methods @@ -100,6 +102,7 @@ from . import ( ChartContainingView, CreateView, PaginationMixin, TellParentFormMixin, UpdateView, ) +from ...presale.views import prefetch_relevant_questionnaires def has_truthy_attr(cls, attr): @@ -125,7 +128,10 @@ class ItemList(ListView): ).select_related("tax_rule").annotate( var_count=Count('variations'), requires_seat=requires_seat, - ).prefetch_related("category", "limit_sales_channels").order_by( + ).prefetch_related( + "category", "limit_sales_channels", + prefetch_relevant_questionnaires(self.request.event, None, None, questionnaire_lookup='questionnaires'), + ).order_by( F('category__position').asc(nulls_first=True), 'category', 'position' ) @@ -133,6 +139,16 @@ class ItemList(ListView): def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) ctx['sales_channels'] = self.request.organizer.sales_channels.all() + for item in ctx['items']: + qrows = [qc for qq in item.relevant_questionnaires for qc in qq.questionnairerowlist] + item.attendee_data_asked = any(row.system_datafield for row in qrows) + item.attendee_data_required = item.attendee_data_asked and any(row.system_datafield and row.required for row in qrows) + item.custom_questions_asked = any(row.user_datafield_id for row in qrows) + item.questionnaire_names_html = format_html_join('
', '• {} {}{}', (( + q.internal_name, + mark_safe("") if q.ask_during_checkin else '', + mark_safe("") if q.hidden else '', + ) for q in item.relevant_questionnaires)) items_by_category = {cat: list(items) for cat, items in groupby(ctx['items'], lambda item: item.category)} ctx['cat_list'] = [(cat, items_by_category.get(cat, [])) for cat in [None, *self.request.event.categories.all()]] return ctx diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index bb7c9b36a0..994fec1e61 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -396,10 +396,12 @@ def cart_exists(request): return bool(request._cart_cache) -def prefetch_relevant_questionnaires(event, sales_channel, questionnaire_type): - qqs = event.questionnaires.filter( - Q(all_sales_channels=True) | Q(limit_sales_channels__identifier=sales_channel), - ) +def prefetch_relevant_questionnaires(event, sales_channel, questionnaire_type, questionnaire_lookup='item__questionnaires'): + qqs = event.questionnaires + if sales_channel: + qqs = qqs.filter( + Q(all_sales_channels=True) | Q(limit_sales_channels__identifier=sales_channel), + ) if questionnaire_type: qqs = qqs.filter(type=questionnaire_type) else: @@ -412,7 +414,7 @@ def prefetch_relevant_questionnaires(event, sales_channel, questionnaire_type): Question.objects.none(), to_attr='dummy' ) - return Prefetch('item__questionnaires', + return Prefetch(questionnaire_lookup, qqs.prefetch_related( Prefetch('rows', QuestionnaireRow.objects.prefetch_related( Prefetch('user_datafield', Question.objects.prefetch_related( diff --git a/src/pretix/static/pretixbase/scss/_theme.scss b/src/pretix/static/pretixbase/scss/_theme.scss index eb32d06ec4..09566697c9 100644 --- a/src/pretix/static/pretixbase/scss/_theme.scss +++ b/src/pretix/static/pretixbase/scss/_theme.scss @@ -251,6 +251,8 @@ svg.svg-icon { .fa-stack-shifted { left: 0.5em; } +.fa-stack-sm { font-size: 0.75em; } +.fa-stack-shift-up { top: -0.4em; } .badge-primary { background: $brand-primary; } .badge-success { background: $brand-success; }