From 81775f5d2d3ffeac9edb717b6595af8ee6ac71a1 Mon Sep 17 00:00:00 2001 From: Mira Weller Date: Thu, 19 Mar 2026 13:33:24 +0100 Subject: [PATCH] setup questionnaires vue app, add code from question editor proof of concept --- .../pretixcontrol/items/questionnaires.html | 27 ++++++ src/pretix/control/urls.py | 1 + src/pretix/control/views/item.py | 7 +- .../js/ui/questionnaires/App.vue | 74 ++++++++++++++++ .../js/ui/questionnaires/I18nTextField.vue | 13 +++ .../js/ui/questionnaires/NativeDialog.vue | 49 +++++++++++ .../js/ui/questionnaires/Question.vue | 86 +++++++++++++++++++ .../pretixcontrol/js/ui/questionnaires/api.ts | 10 +++ .../js/ui/questionnaires/helper.js | 37 ++++++++ .../js/ui/questionnaires/index.ts | 4 + 10 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 src/pretix/control/templates/pretixcontrol/items/questionnaires.html create mode 100644 src/pretix/static/pretixcontrol/js/ui/questionnaires/App.vue create mode 100644 src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextField.vue create mode 100644 src/pretix/static/pretixcontrol/js/ui/questionnaires/NativeDialog.vue create mode 100644 src/pretix/static/pretixcontrol/js/ui/questionnaires/Question.vue create mode 100644 src/pretix/static/pretixcontrol/js/ui/questionnaires/api.ts create mode 100644 src/pretix/static/pretixcontrol/js/ui/questionnaires/helper.js create mode 100644 src/pretix/static/pretixcontrol/js/ui/questionnaires/index.ts diff --git a/src/pretix/control/templates/pretixcontrol/items/questionnaires.html b/src/pretix/control/templates/pretixcontrol/items/questionnaires.html new file mode 100644 index 000000000..6eb2fc8f6 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/items/questionnaires.html @@ -0,0 +1,27 @@ +{% extends "pretixcontrol/items/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% load static %} +{% load compress %} +{% load vite %} + + +{% block title %} + {% trans "Questionnaires" %} +{% endblock %} +{% block inside %} +

{% trans "Questionnaires" %}

+

+ {% blocktrans trimmed %} + Questions allow your attendees to fill in additional data about their ticket. If you provide food, one + example might be to ask your users about dietary requirements. + {% endblocktrans %} +

+ +
+ +
+ + {% vite_hmr %} + {% vite_asset "src/pretix/static/pretixcontrol/js/ui/questionnaires/index.ts" %} +{% endblock %} \ No newline at end of file diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 35c659fd3..55ff33618 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -348,6 +348,7 @@ urlpatterns = [ re_path(r'^questions/(?P\d+)/change$', item.QuestionUpdate.as_view(), name='event.items.questions.edit'), re_path(r'^questions/add$', item.QuestionCreate.as_view(), name='event.items.questions.add'), + re_path(r'^questionnaires/$', item.QuestionnairesEditor.as_view(), name='event.items.questionnaires'), re_path(r'^quotas/$', item.QuotaList.as_view(), name='event.items.quotas'), re_path(r'^quotas/(?P\d+)/$', item.QuotaView.as_view(), name='event.items.quotas.show'), re_path(r'^quotas/select$', typeahead.quotas_select2, name='event.items.quotas.select2'), diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 179b8cd09..6a22e5ebd 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -55,7 +55,7 @@ from django.utils.functional import cached_property from django.utils.timezone import now from django.utils.translation import gettext, gettext_lazy as _ from django.views.decorators.http import require_http_methods -from django.views.generic import ListView +from django.views.generic import ListView, TemplateView from django.views.generic.detail import DetailView, SingleObjectMixin from django_countries.fields import Country @@ -831,6 +831,11 @@ class QuestionCreate(EventPermissionRequiredMixin, QuestionMixin, CreateView): return ret +class QuestionnairesEditor(EventPermissionRequiredMixin, TemplateView): + permission = 'can_change_items' + template_name = 'pretixcontrol/items/questionnaires.html' + + class QuotaList(PaginationMixin, ListView): model = Quota context_object_name = 'quotas' diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/App.vue b/src/pretix/static/pretixcontrol/js/ui/questionnaires/App.vue new file mode 100644 index 000000000..52a1f69a3 --- /dev/null +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/App.vue @@ -0,0 +1,74 @@ + + + + diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextField.vue b/src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextField.vue new file mode 100644 index 000000000..4fc602f97 --- /dev/null +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/I18nTextField.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/NativeDialog.vue b/src/pretix/static/pretixcontrol/js/ui/questionnaires/NativeDialog.vue new file mode 100644 index 000000000..d589c41ad --- /dev/null +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/NativeDialog.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/Question.vue b/src/pretix/static/pretixcontrol/js/ui/questionnaires/Question.vue new file mode 100644 index 000000000..889b4c267 --- /dev/null +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/Question.vue @@ -0,0 +1,86 @@ + + + diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/api.ts b/src/pretix/static/pretixcontrol/js/ui/questionnaires/api.ts new file mode 100644 index 000000000..371c5676f --- /dev/null +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/api.ts @@ -0,0 +1,10 @@ +const organizer_slug = document.body.getAttribute('data-organizer'), + event_slug = document.body.getAttribute('data-event'); + +export async function get_questions() { + return await (await fetch(`/api/v1/organizers/${organizer_slug}/events/${event_slug}/questions`)).json(); +} + +export async function get_items() { + return await (await fetch(`/api/v1/organizers/${organizer_slug}/events/${event_slug}/items`)).json(); +} diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/helper.js b/src/pretix/static/pretixcontrol/js/ui/questionnaires/helper.js new file mode 100644 index 000000000..73a199bf9 --- /dev/null +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/helper.js @@ -0,0 +1,37 @@ + +export function i18n_any(data) { + return Object.values(data)[0]; +} + + +export const QUESTION_TYPE = { + NUMBER: "N", + STRING: "S", + TEXT: "T", + BOOLEAN: "B", + CHOICE: "C", + CHOICE_MULTIPLE: "M", + FILE: "F", + DATE: "D", + TIME: "H", + DATETIME: "W", + COUNTRYCODE: "CC", + PHONENUMBER: "TEL", +}; + +const _ = x => x; + +export const QUESTION_TYPE_LABEL = { + NUMBER: _("Number"), + STRING: _("Text (one line)"), + TEXT: _("Multiline text"), + BOOLEAN: _("Yes/No"), + CHOICE: _("Choose one from a list"), + CHOICE_MULTIPLE: _("Choose multiple from a list"), + FILE: _("File upload"), + DATE: _("Date"), + TIME: _("Time"), + DATETIME: _("Date and time"), + COUNTRYCODE: _("Country code (ISO 3166-1 alpha-2)"), + PHONENUMBER: _("Phone number"), +}; diff --git a/src/pretix/static/pretixcontrol/js/ui/questionnaires/index.ts b/src/pretix/static/pretixcontrol/js/ui/questionnaires/index.ts new file mode 100644 index 000000000..68a713a99 --- /dev/null +++ b/src/pretix/static/pretixcontrol/js/ui/questionnaires/index.ts @@ -0,0 +1,4 @@ +import { createApp } from 'vue' +import App from './App.vue' + +createApp(App).mount('#questionnaires-editor')