Allow to require invoice name only

This commit is contained in:
Raphael Michel
2018-05-11 12:52:11 +02:00
parent 1b9bfb5b62
commit 008b4a134b
12 changed files with 181 additions and 38 deletions

View File

@@ -242,3 +242,12 @@ class BaseInvoiceAddressForm(forms.ModelForm):
'resolve this manually.'))
else:
self.instance.vat_id_validated = False
class BaseInvoiceNameForm(BaseInvoiceAddressForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for f in list(self.fields.keys()):
if f != 'name':
del self.fields[f]

View File

@@ -7,7 +7,7 @@ from django.db.models import Prefetch
from django.utils.functional import cached_property
from pretix.base.forms.questions import (
BaseInvoiceAddressForm, BaseQuestionsForm,
BaseInvoiceAddressForm, BaseInvoiceNameForm, BaseQuestionsForm,
)
from pretix.base.models import (
CartPosition, InvoiceAddress, OrderPosition, Question, QuestionAnswer,
@@ -144,6 +144,7 @@ class BaseQuestionsViewMixin:
class OrderQuestionsViewMixin(BaseQuestionsViewMixin):
invoice_form_class = BaseInvoiceAddressForm
invoice_name_form_class = BaseInvoiceNameForm
only_user_visible = True
@cached_property
@@ -184,6 +185,12 @@ class OrderQuestionsViewMixin(BaseQuestionsViewMixin):
@cached_property
def invoice_form(self):
if not self.request.event.settings.invoice_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
)
return self.invoice_form_class(
data=self.request.POST if self.request.method == "POST" else None,
event=self.request.event,

View File

@@ -520,8 +520,7 @@ class InvoiceSettingsForm(SettingsForm):
label=_("Require customer name"),
required=False,
widget=forms.CheckboxInput(
attrs={'data-checkbox-dependency': '#id_invoice_address_asked',
'data-inverse-dependency': '#id_invoice_address_required'}
attrs={'data-inverse-dependency': '#id_invoice_address_required'}
),
)
invoice_address_vatid = forms.BooleanField(

View File

@@ -18,7 +18,7 @@
<form method="post" class="form-horizontal" href="" enctype="multipart/form-data">
{% csrf_token %}
<div class="panel-group" id="questions_accordion">
{% if request.event.settings.invoice_address_asked %}
{% if request.event.settings.invoice_address_asked or order.invoice_address or request.event.settings.invoice_name_required %}
<details class="panel panel-default" open>
<summary class="panel-heading">
<h4 class="panel-title">

View File

@@ -349,7 +349,7 @@
</div>
{% eventsignal event "pretix.control.signals.order_info" order=order request=request %}
<div class="row">
<div class="{% if request.event.settings.invoice_address_asked %}col-md-6{% else %}col-md-12{% endif %}">
<div class="{% if request.event.settings.invoice_address_asked or order.invoice_address %}col-md-6{% else %}col-md-12{% endif %}">
<div class="panel panel-default items">
<div class="panel-heading">
<h3 class="panel-title">
@@ -371,7 +371,7 @@
</div>
</div>
</div>
{% if request.event.settings.invoice_address_asked %}
{% if request.event.settings.invoice_address_asked or order.invoice_address %}
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">

View File

@@ -17,7 +17,7 @@ from pretix.base.services.cart import (
from pretix.base.services.orders import perform_order
from pretix.multidomain.urlreverse import eventreverse
from pretix.presale.forms.checkout import (
AddOnsForm, ContactForm, InvoiceAddressForm,
AddOnsForm, ContactForm, InvoiceAddressForm, InvoiceNameForm,
)
from pretix.presale.signals import (
checkout_confirm_messages, checkout_flow_steps, contact_form_fields,
@@ -322,6 +322,12 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
@cached_property
def invoice_form(self):
if not self.request.event.settings.invoice_address_asked and self.request.event.settings.invoice_name_required:
return InvoiceNameForm(data=self.request.POST if self.request.method == "POST" else None,
event=self.request.event,
request=self.request,
instance=self.invoice_address,
validate_vat_id=False)
return InvoiceAddressForm(data=self.request.POST if self.request.method == "POST" else None,
event=self.request.event,
request=self.request,
@@ -331,7 +337,7 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
def post(self, request):
self.request = request
failed = not self.save() or not self.contact_form.is_valid()
if request.event.settings.invoice_address_asked:
if request.event.settings.invoice_address_asked or self.request.event.settings.invoice_name_required:
failed = failed or not self.invoice_form.is_valid()
if failed:
messages.error(request,
@@ -339,7 +345,7 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
return self.render()
self.cart_session['email'] = self.contact_form.cleaned_data['email']
self.cart_session['contact_form_data'] = self.contact_form.cleaned_data
if request.event.settings.invoice_address_asked:
if request.event.settings.invoice_address_asked or self.request.event.settings.invoice_name_required:
addr = self.invoice_form.save()
self.cart_session['invoice_address'] = addr.pk
@@ -369,8 +375,7 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
messages.warning(request, _('Please enter your invoicing address.'))
return False
if request.event.settings.invoice_address_asked and request.event.settings.invoice_name_required and (
not self.invoice_address or not self.invoice_address.name):
if request.event.settings.invoice_name_required and (not self.invoice_address or not self.invoice_address.name):
messages.warning(request, _('Please enter your name.'))
return False

View File

@@ -61,6 +61,15 @@ class InvoiceAddressForm(BaseInvoiceAddressForm):
vat_warning = True
class InvoiceNameForm(InvoiceAddressForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for f in list(self.fields.keys()):
if f != 'name':
del self.fields[f]
class QuestionsForm(BaseQuestionsForm):
"""
This form class is responsible for asking order-related questions. This includes

View File

@@ -120,6 +120,12 @@
</h3>
</div>
<div class="panel-body">
{% if not event.settings.invoice_address_asked and event.settings.invoice_name_required %}
<dl class="dl-horizontal">
<dt>{% trans "Name" %}</dt>
<dd>{{ addr.name }}</dd>
</dl>
{% endif %}
{% for l, v in contact_info %}
<dl class="dl-horizontal">
<dt>{{ l }}</dt>

View File

@@ -21,6 +21,9 @@
<div id="contact">
<div class="panel-body">
{% bootstrap_form contact_form layout="horizontal" %}
{% if not event.settings.invoice_address_asked and event.settings.invoice_name_required %}
{% bootstrap_form invoice_form layout="horizontal" %}
{% endif %}
</div>
</div>
</details>

View File

@@ -120,7 +120,7 @@
{% eventsignal event "pretix.presale.signals.order_info" order=order %}
<div class="row">
{% if invoices %}
<div class="col-xs-12 {% if request.event.settings.invoice_address_asked %}col-md-6{% endif %}">
<div class="col-xs-12 {% if request.event.settings.invoice_address_asked or request.event.settings.invoice_name_required %}col-md-6{% endif %}">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">
@@ -141,7 +141,7 @@
</div>
</div>
{% elif can_generate_invoice %}
<div class="col-xs-12 {% if request.event.settings.invoice_address_asked %}col-md-6{% endif %}">
<div class="col-xs-12 {% if request.event.settings.invoice_address_asked or request.event.settings.invoice_name_required %}col-md-6{% endif %}">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">
@@ -160,7 +160,7 @@
</div>
</div>
{% endif %}
{% if request.event.settings.invoice_address_asked %}
{% if request.event.settings.invoice_address_asked or request.event.settings.invoice_name_required %}
<div class="col-xs-12 {% if invoices or can_generate_invoice %}col-md-6{% endif %}">
<div class="panel panel-primary">
<div class="panel-heading">
@@ -173,27 +173,35 @@
</div>
{% endif %}
<h3 class="panel-title">
{% trans "Invoice information" %}
{% if request.event.settings.invoice_address_asked %}
{% trans "Invoice information" %}
{% else %}
{% trans "Contact information" %}
{% endif %}
</h3>
</div>
<div class="panel-body">
<dl class="dl-horizontal">
<dt>{% trans "Company" %}</dt>
<dd>{{ order.invoice_address.company }}</dd>
{% if request.event.settings.invoice_address_asked %}
<dt>{% trans "Company" %}</dt>
<dd>{{ order.invoice_address.company }}</dd>
{% endif %}
<dt>{% trans "Name" %}</dt>
<dd>{{ order.invoice_address.name }}</dd>
<dt>{% trans "Address" %}</dt>
<dd>{{ order.invoice_address.street|linebreaksbr }}</dd>
<dt>{% trans "ZIP code and city" %}</dt>
<dd>{{ order.invoice_address.zipcode }} {{ order.invoice_address.city }}</dd>
<dt>{% trans "Country" %}</dt>
<dd>{{ order.invoice_address.country.name|default:order.invoice_address.country_old }}</dd>
{% if request.event.settings.invoice_address_vatid %}
<dt>{% trans "VAT ID" %}</dt>
<dd>{{ order.invoice_address.vat_id }}</dd>
{% if request.event.settings.invoice_address_asked %}
<dt>{% trans "Address" %}</dt>
<dd>{{ order.invoice_address.street|linebreaksbr }}</dd>
<dt>{% trans "ZIP code and city" %}</dt>
<dd>{{ order.invoice_address.zipcode }} {{ order.invoice_address.city }}</dd>
<dt>{% trans "Country" %}</dt>
<dd>{{ order.invoice_address.country.name|default:order.invoice_address.country_old }}</dd>
{% if request.event.settings.invoice_address_vatid %}
<dt>{% trans "VAT ID" %}</dt>
<dd>{{ order.invoice_address.vat_id }}</dd>
{% endif %}
<dt>{% trans "Internal Reference" %}</dt>
<dd>{{ order.invoice_address.internal_reference }}</dd>
{% endif %}
<dt>{% trans "Internal Reference" %}</dt>
<dd>{{ order.invoice_address.internal_reference }}</dd>
</dl>
</div>
</div>

View File

@@ -11,19 +11,27 @@
<form class="form-horizontal" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="panel-group" id="questions_accordion">
{% if event.settings.invoice_address_asked %}
<div class="alert alert-info">
{% blocktrans trimmed %}
Modifying your invoice address will not automatically generate a new invoice.
Please contact us if you need a new invoice.
{% endblocktrans %}
</div>
{% if event.settings.invoice_address_asked or event.settings.invoice_name_required %}
{% if event.settings.invoice_address_asked %}
<div class="alert alert-info">
{% blocktrans trimmed %}
Modifying your invoice address will not automatically generate a new invoice.
Please contact us if you need a new invoice.
{% endblocktrans %}
</div>
{% endif %}
<details class="panel panel-default" open>
<summary class="panel-heading">
<h4 class="panel-title">
<strong>{% trans "Invoice information" %}{% if not event.settings.invoice_address_required %}
{% trans "(optional)" %}
{% endif %}</strong>
<strong>
{% if request.event.settings.invoice_address_asked %}
{% trans "Invoice information" %}{% if not event.settings.invoice_address_required %}
{% trans "(optional)" %}
{% endif %}
{% else %}
{% trans "Contact information" %}
{% endif %}
</strong>
<i class="fa fa-angle-down collapse-indicator"></i>
</h4>
</summary>