Add order-level telephone field to core (#1872)

Co-authored-by: Martin Gross <gross@rami.io>
This commit is contained in:
Raphael Michel
2020-12-15 09:20:44 +01:00
committed by GitHub
parent c47e41ac8a
commit 4240ad43d0
27 changed files with 507 additions and 69 deletions

View File

@@ -481,6 +481,9 @@ class EventSettingsForm(SettingsForm):
'attendee_addresses_asked',
'attendee_addresses_required',
'attendee_data_explanation_text',
'order_phone_asked',
'order_phone_required',
'checkout_phone_helptext',
'banner_text',
'banner_text_bottom',
'order_email_asked_twice',

View File

@@ -16,6 +16,7 @@ from i18nfield.strings import LazyI18nString
from pretix.base.email import get_available_placeholders
from pretix.base.forms import I18nModelForm, PlaceholderValidator
from pretix.base.forms.questions import WrappedPhoneNumberPrefixWidget
from pretix.base.forms.widgets import (
DatePickerWidget, SplitDateTimePickerWidget,
)
@@ -460,7 +461,15 @@ class OrderContactForm(forms.ModelForm):
class Meta:
model = Order
fields = ['email', 'email_known_to_work']
fields = ['email', 'email_known_to_work', 'phone']
widgets = {
'phone': WrappedPhoneNumberPrefixWidget()
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if not self.instance.event.settings.order_phone_asked and not self.instance.phone:
del self.fields['phone']
class OrderLocaleForm(forms.ModelForm):

View File

@@ -292,6 +292,8 @@ def pretixcontrol_logentry_display(sender: Event, logentry: LogEntry, **kwargs):
'pretix.event.order.denied': _('The order has been denied.'),
'pretix.event.order.contact.changed': _('The email address has been changed from "{old_email}" '
'to "{new_email}".'),
'pretix.event.order.phone.changed': _('The phone number has been changed from "{old_phone}" '
'to "{new_phone}".'),
'pretix.event.order.locale.changed': _('The order locale has been changed.'),
'pretix.event.order.invoice.generated': _('The invoice has been generated.'),
'pretix.event.order.invoice.regenerated': _('The invoice has been regenerated.'),

View File

@@ -86,20 +86,113 @@
{% bootstrap_field sform.region layout="control" %}
</fieldset>
<fieldset>
<legend>{% trans "Attendee data" %}</legend>
{% bootstrap_field sform.attendee_names_asked layout="control" %}
{% bootstrap_field sform.attendee_names_required layout="control" %}
<legend>{% trans "Customer and attendee data" %}</legend>
{% trans "Asked" context "attendee_data" as asked %}
{% trans "Required" context "attendee_data" as required %}
<h4>{% trans "Customer data (once per order)" %}</h4>
<div class="form-group">
<label class="control-label col-md-3">
{% trans "E-mail" %}
</label>
<div class="col-md-3">
<div class="checkbox">
<label><input type="checkbox" checked="checked" disabled="disabled"> {{ asked }}</label>
</div>
</div>
<div class="col-md-3">
<div class="checkbox">
<label><input type="checkbox" checked="checked" disabled="disabled"> {{ required }}</label>
</div>
</div>
</div>
{% bootstrap_field sform.order_email_asked_twice layout="control" %}
<div class="form-group">
<label class="control-label col-md-3">
{% trans "Phone number" %}
</label>
<div class="col-md-3 form-field-boundary">
{% bootstrap_field sform.order_phone_asked layout="inline" form_group_class="" label=asked %}
</div>
<div class="col-md-3 form-field-boundary">
{% bootstrap_field sform.order_phone_required layout="inline" form_group_class="" label=required %}
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3">
{% trans "Name and address" %}
</label>
<div class="col-md-9 static-form-row">
<p>
<a href="{% url "control:event.settings.invoice" event=request.event.slug organizer=request.organizer.slug %}#tab-0-1-open" target="_blank">
{% trans "See invoice settings" %}
</a>
</p>
</div>
</div>
<h4>{% trans "Attendee data (once per admission ticket)" %}</h4>
<div class="form-group">
<label class="control-label col-md-3">
{% trans "Name" %}
</label>
<div class="col-md-3 form-field-boundary">
{% bootstrap_field sform.attendee_names_asked layout="inline" form_group_class="" label=asked %}
</div>
<div class="col-md-3 form-field-boundary">
{% bootstrap_field sform.attendee_names_required layout="inline" form_group_class="" label=required %}
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3">
{% trans "E-mail" %}
</label>
<div class="col-md-3 form-field-boundary">
{% bootstrap_field sform.attendee_emails_asked layout="inline" form_group_class="" label=asked %}
</div>
<div class="col-md-3 form-field-boundary">
{% bootstrap_field sform.attendee_emails_required layout="inline" form_group_class="" label=required %}
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3">
{% trans "Company" %}
</label>
<div class="col-md-3 form-field-boundary">
{% bootstrap_field sform.attendee_company_asked layout="inline" form_group_class="" label=asked %}
</div>
<div class="col-md-3 form-field-boundary">
{% bootstrap_field sform.attendee_company_required layout="inline" form_group_class="" label=required %}
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3">
{% trans "Address" %}
</label>
<div class="col-md-3 form-field-boundary">
{% bootstrap_field sform.attendee_addresses_asked layout="inline" form_group_class="" label=asked %}
</div>
<div class="col-md-3 form-field-boundary">
{% bootstrap_field sform.attendee_addresses_required layout="inline" form_group_class="" label=required %}
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3">
{% trans "Custom fields" %}
</label>
<div class="col-md-9 static-form-row">
<p>
<a href="{% url "control:event.items.questions" event=request.event.slug organizer=request.organizer.slug %}" target="_blank">
{% trans "Manage questions" %}
</a>
</p>
</div>
</div>
{% bootstrap_field sform.attendee_data_explanation_text layout="control" %}
<h4>{% trans "Other settings" %}</h4>
{% bootstrap_field sform.name_scheme layout="control" %}
{% bootstrap_field sform.name_scheme_titles layout="control" %}
{% bootstrap_field sform.order_email_asked_twice layout="control" %}
{% bootstrap_field sform.attendee_emails_asked layout="control" %}
{% bootstrap_field sform.attendee_emails_required layout="control" %}
{% bootstrap_field sform.attendee_company_asked layout="control" %}
{% bootstrap_field sform.attendee_company_required layout="control" %}
{% bootstrap_field sform.attendee_addresses_asked layout="control" %}
{% bootstrap_field sform.attendee_addresses_required layout="control" %}
{% bootstrap_field sform.checkout_show_copy_answers_button layout="control" %}
{% bootstrap_field sform.attendee_data_explanation_text layout="control" %}
</fieldset>
<fieldset>
<legend>{% trans "Texts" %}</legend>
@@ -178,6 +271,7 @@
</div>
{% bootstrap_field sform.checkout_email_helptext layout="control" %}
{% bootstrap_field sform.checkout_phone_helptext layout="control" %}
{% bootstrap_field sform.banner_text layout="control" %}
{% bootstrap_field sform.banner_text_bottom layout="control" %}
</fieldset>

View File

@@ -6,6 +6,7 @@
{% load rich_text %}
{% load safelink %}
{% load eventsignal %}
{% load phone_format %}
{% block title %}
{% blocktrans trimmed with code=order.code %}
Order details: {{ code }}
@@ -201,6 +202,15 @@
{% endif %}
{% endif %}
</dd>
{% if order.phone or request.event.settings.order_phone_asked %}
<dt>{% trans "Phone number" %}</dt>
<dd>
{{ order.phone|default_if_none:""|phone_format }}
<a href="{% url "control:event.order.contact" event=request.event.slug organizer=request.event.organizer.slug code=order.code %}" class="btn btn-default btn-xs">
<span class="fa fa-edit"></span>
</a>
</dd>
{% endif %}
{% if invoices %}
<dt>{% trans "Invoices" %}</dt>
<dd>

View File

@@ -1663,6 +1663,7 @@ class OrderContactChange(OrderView):
def post(self, *args, **kwargs):
old_email = self.order.email
old_phone = self.order.phone
changed = False
if self.form.is_valid():
new_email = self.form.cleaned_data['email']
@@ -1677,6 +1678,18 @@ class OrderContactChange(OrderView):
user=self.request.user,
)
new_phone = self.form.cleaned_data.get('phone')
if new_phone != old_phone:
changed = True
self.order.log_action(
'pretix.event.order.phone.changed',
data={
'old_phone': old_phone,
'new_phone': self.form.cleaned_data['phone'],
},
user=self.request.user,
)
if self.form.cleaned_data['regenerate_secrets']:
changed = True
self.order.secret = generate_secret()