diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index 1beb5ed81c..44e87be9a8 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -399,6 +399,7 @@ List of all orders "created": "2017-12-01T10:00:00Z", "payment_date": "2017-12-04T12:13:12Z", "payment_url": null, + "details": {}, "provider": "banktransfer" } ], @@ -545,6 +546,7 @@ Fetching individual orders "created": "2017-12-01T10:00:00Z", "payment_date": "2017-12-04T12:13:12Z", "payment_url": null, + "details": {}, "provider": "banktransfer" } ], @@ -1580,6 +1582,7 @@ Order payment endpoints "created": "2017-12-01T10:00:00Z", "payment_date": "2017-12-04T12:13:12Z", "payment_url": null, + "details": {}, "provider": "banktransfer" } ] @@ -1621,6 +1624,7 @@ Order payment endpoints "created": "2017-12-01T10:00:00Z", "payment_date": "2017-12-04T12:13:12Z", "payment_url": null, + "details": {}, "provider": "banktransfer" } diff --git a/doc/api/resources/questions.rst b/doc/api/resources/questions.rst index 061fb7e5a3..7fed162ef0 100644 --- a/doc/api/resources/questions.rst +++ b/doc/api/resources/questions.rst @@ -41,6 +41,8 @@ ask_during_checkin boolean If ``true``, th the ticket instead. hidden boolean If ``true``, the question will only be shown in the backend. +print_on_invoice boolean If ``true``, the question will only be shown on + invoices. options list of objects In case of question type ``C`` or ``M``, this lists the available objects. Only writable during creation, use separate endpoint to modify this later. @@ -80,6 +82,10 @@ dependency_value string An old version The attribute ``dependency_values`` has been added. +.. versionchanged:: 3.1 + + The attribute ``print_on_invoice`` has been added. + Endpoints --------- @@ -123,6 +129,7 @@ Endpoints "identifier": "WY3TP9SL", "ask_during_checkin": false, "hidden": false, + "print_on_invoice": false, "dependency_question": null, "dependency_value": null, "dependency_values": [], @@ -192,6 +199,7 @@ Endpoints "identifier": "WY3TP9SL", "ask_during_checkin": false, "hidden": false, + "print_on_invoice": false, "dependency_question": null, "dependency_value": null, "dependency_values": [], @@ -245,6 +253,7 @@ Endpoints "position": 1, "ask_during_checkin": false, "hidden": false, + "print_on_invoice": false, "dependency_question": null, "dependency_values": [], "options": [ @@ -279,6 +288,7 @@ Endpoints "identifier": "WY3TP9SL", "ask_during_checkin": false, "hidden": false, + "print_on_invoice": false, "dependency_question": null, "dependency_value": null, "dependency_values": [], @@ -352,6 +362,7 @@ Endpoints "identifier": "WY3TP9SL", "ask_during_checkin": false, "hidden": false, + "print_on_invoice": false, "dependency_question": null, "dependency_value": null, "dependency_values": [], diff --git a/src/pretix/api/serializers/item.py b/src/pretix/api/serializers/item.py index 44e6c4a4f4..aa5a0d6dab 100644 --- a/src/pretix/api/serializers/item.py +++ b/src/pretix/api/serializers/item.py @@ -219,7 +219,7 @@ class QuestionSerializer(I18nAwareModelSerializer): model = Question fields = ('id', 'question', 'type', 'required', 'items', 'options', 'position', 'ask_during_checkin', 'identifier', 'dependency_question', 'dependency_values', - 'hidden', 'dependency_value') + 'hidden', 'dependency_value', 'print_on_invoice') def validate_identifier(self, value): Question._clean_identifier(self.context['event'], value, self.instance) diff --git a/src/pretix/base/migrations/0133_auto_20190830_1513.py b/src/pretix/base/migrations/0133_auto_20190830_1513.py new file mode 100644 index 0000000000..d998139841 --- /dev/null +++ b/src/pretix/base/migrations/0133_auto_20190830_1513.py @@ -0,0 +1,21 @@ +# Generated by Django 2.2.4 on 2019-08-30 15:13 + +import django.db.models.deletion +from django.db import migrations, models + +import pretix.base.models.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0132_auto_20190808_1253'), + ] + + operations = [ + migrations.AddField( + model_name='question', + name='print_on_invoice', + field=models.BooleanField(default=False), + ), + ] diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index a6faa3d9ad..ad8d3cb4c5 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -1034,6 +1034,10 @@ class Question(LoggedModel): help_text=_('This question will only show up in the backend.'), default=False ) + print_on_invoice = models.BooleanField( + verbose_name=_('Print answer on invoices'), + default=False + ) dependency_question = models.ForeignKey( 'Question', null=True, blank=True, on_delete=models.SET_NULL, related_name='dependent_questions' ) diff --git a/src/pretix/base/services/invoices.py b/src/pretix/base/services/invoices.py index 44c4c193d3..18c642c231 100644 --- a/src/pretix/base/services/invoices.py +++ b/src/pretix/base/services/invoices.py @@ -129,7 +129,7 @@ def build_invoice(invoice: Invoice) -> Invoice: positions = list( invoice.order.positions.select_related('addon_to', 'item', 'tax_rule', 'subevent', 'variation').annotate( addon_c=Count('addons') - ).order_by('positionid', 'id') + ).prefetch_related('answers', 'answers__question').order_by('positionid', 'id') ) reverse_charge = False @@ -146,6 +146,16 @@ def build_invoice(invoice: Invoice) -> Invoice: desc = " + " + desc if invoice.event.settings.invoice_attendee_name and p.attendee_name: desc += "
" + pgettext("invoice", "Attendee: {name}").format(name=p.attendee_name) + + for answ in p.answers.all(): + if not answ.question.print_on_invoice: + continue + desc += "
{}{} {}".format( + answ.question.question, + "" if str(answ.question.question).endswith("?") else ":", + str(answ) + ) + if invoice.event.has_subevents: desc += "
" + pgettext("subevent", "Date: {}").format(p.subevent) InvoiceLine.objects.create( diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 18b3cae87f..7799b6306b 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -94,7 +94,8 @@ class QuestionForm(I18nModelForm): 'identifier', 'items', 'dependency_question', - 'dependency_values' + 'dependency_values', + 'print_on_invoice', ] widgets = { 'items': forms.CheckboxSelectMultiple( diff --git a/src/pretix/control/templates/pretixcontrol/items/question_edit.html b/src/pretix/control/templates/pretixcontrol/items/question_edit.html index 0fa1549f0b..d2b1ef5323 100644 --- a/src/pretix/control/templates/pretixcontrol/items/question_edit.html +++ b/src/pretix/control/templates/pretixcontrol/items/question_edit.html @@ -112,6 +112,7 @@ {% bootstrap_field form.identifier layout="control" %} {% bootstrap_field form.ask_during_checkin layout="control" %} {% bootstrap_field form.hidden layout="control" %} + {% bootstrap_field form.print_on_invoice layout="control" %}