diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 276c1667dd..9074037bc4 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -49,6 +49,10 @@ DEFAULTS = { 'default': 'True', 'type': bool, }, + 'invoice_address_not_asked_free': { + 'default': 'False', + 'type': bool, + }, 'invoice_name_required': { 'default': 'False', 'type': bool, diff --git a/src/pretix/base/views/mixins.py b/src/pretix/base/views/mixins.py index 0ace5d315f..645c24b306 100644 --- a/src/pretix/base/views/mixins.py +++ b/src/pretix/base/views/mixins.py @@ -1,5 +1,6 @@ import json from collections import OrderedDict +from decimal import Decimal from django import forms from django.core.files.uploadedfile import UploadedFile @@ -186,25 +187,35 @@ class OrderQuestionsViewMixin(BaseQuestionsViewMixin): except InvoiceAddress.DoesNotExist: return InvoiceAddress(order=self.order) + @cached_property + def address_asked(self): + return self.request.event.settings.invoice_address_asked and ( + self.order.total != Decimal('0.00') or not self.request.event.settings.invoice_address_not_asked_free + ) + @cached_property def invoice_form(self): - if not self.request.event.settings.invoice_address_asked and self.request.event.settings.invoice_name_required: + if not self.address_asked and self.request.event.settings.invoice_name_required: return self.invoice_name_form_class( data=self.request.POST if self.request.method == "POST" else None, event=self.request.event, instance=self.invoice_address, validate_vat_id=False, all_optional=self.all_optional ) - return self.invoice_form_class( - data=self.request.POST if self.request.method == "POST" else None, - event=self.request.event, - instance=self.invoice_address, validate_vat_id=False, - all_optional=self.all_optional, - ) + if self.address_asked: + return self.invoice_form_class( + data=self.request.POST if self.request.method == "POST" else None, + event=self.request.event, + instance=self.invoice_address, validate_vat_id=False, + all_optional=self.all_optional, + ) + else: + return forms.Form(data=self.request.POST if self.request.method == "POST" else None) def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) ctx['order'] = self.order ctx['formgroups'] = self.formdict.items() ctx['invoice_form'] = self.invoice_form + ctx['invoice_address_asked'] = self.address_asked return ctx diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 6169368dcf..f0e1ad5550 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -621,6 +621,10 @@ class InvoiceSettingsForm(SettingsForm): widget=forms.CheckboxInput(attrs={'data-checkbox-dependency': '#id_invoice_address_asked'}), required=False ) + invoice_address_not_asked_free = forms.BooleanField( + label=_('Do not ask for invoice address if an order is free'), + required=False + ) invoice_include_free = forms.BooleanField( label=_("Show free products on invoices"), help_text=_("Note that invoices will never be generated for orders that contain only free " diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 7cc2843fc9..4e22d3318c 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -43,6 +43,7 @@ class QuestionForm(I18nModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['items'].queryset = self.instance.event.items.all() + self.fields['items'].required = True self.fields['dependency_question'].queryset = self.instance.event.questions.filter( type__in=(Question.TYPE_BOOLEAN, Question.TYPE_CHOICE, Question.TYPE_CHOICE_MULTIPLE) ) diff --git a/src/pretix/control/templates/pretixcontrol/event/invoicing.html b/src/pretix/control/templates/pretixcontrol/event/invoicing.html index 63aa7e7da5..a1f0902f3a 100644 --- a/src/pretix/control/templates/pretixcontrol/event/invoicing.html +++ b/src/pretix/control/templates/pretixcontrol/event/invoicing.html @@ -24,6 +24,7 @@ {% bootstrap_field form.invoice_address_company_required layout="control" %} {% bootstrap_field form.invoice_address_vatid layout="control" %} {% bootstrap_field form.invoice_address_beneficiary layout="control" %} + {% bootstrap_field form.invoice_address_not_asked_free layout="control" %}