diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index 5c468497e..4b27e427e 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -88,3 +88,9 @@ class OrderPositionChangeForm(forms.Form): def clean(self): if self.cleaned_data.get('operation') == 'price' and not self.cleaned_data.get('price', '') != '': raise ValidationError(_('You need to enter a price if you want to change the product price.')) + + +class OrderContactForm(forms.ModelForm): + class Meta: + model = Order + fields = ['email'] diff --git a/src/pretix/control/logdisplay.py b/src/pretix/control/logdisplay.py index 8f2672bd1..ad54d03ce 100644 --- a/src/pretix/control/logdisplay.py +++ b/src/pretix/control/logdisplay.py @@ -59,6 +59,8 @@ def pretixcontrol_logentry_display(sender: Event, logentry: LogEntry, **kwargs): 'pretix.event.order.invoice.regenerated': _('The invoice has been regenerated.'), 'pretix.event.order.invoice.reissued': _('The invoice has been reissued.'), 'pretix.event.order.comment': _('The order\'s internal comment has been updated.'), + 'pretix.event.order.contact.changed': _('The email address has been changed.'), + 'pretix.event.order.payment.changed': _('The payment method has been changed.'), } if logentry.action_type in plains: return plains[logentry.action_type] diff --git a/src/pretix/control/templates/pretixcontrol/order/change_contact.html b/src/pretix/control/templates/pretixcontrol/order/change_contact.html new file mode 100644 index 000000000..3036862a1 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/order/change_contact.html @@ -0,0 +1,27 @@ +{% extends "pretixcontrol/event/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %} + {% trans "Change contact information" %} +{% endblock %} +{% block content %} +

+ {% trans "Change contact information" %} +

+ +
+ {% csrf_token %} + + {% bootstrap_form form layout='horizontal' %} +
+ + {% trans "Cancel" %} + + +
+
+
+{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html index 38f13132e..f96174770 100644 --- a/src/pretix/control/templates/pretixcontrol/order/index.html +++ b/src/pretix/control/templates/pretixcontrol/order/index.html @@ -91,6 +91,9 @@
{% trans "User" %}
{{ order.email }}   + + + {% if order.status != "c" %}
diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index f2faa60b0..abac22783 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -81,6 +81,8 @@ urlpatterns = [ name='event.order.reissueinvoice'), url(r'^orders/(?P[0-9A-Z]+)/extend$', orders.OrderExtend.as_view(), name='event.order.extend'), + url(r'^orders/(?P[0-9A-Z]+)/contact$', orders.OrderContactChange.as_view(), + name='event.order.contact'), url(r'^orders/(?P[0-9A-Z]+)/comment$', orders.OrderComment.as_view(), name='event.order.comment'), url(r'^orders/(?P[0-9A-Z]+)/change$', orders.OrderChange.as_view(), diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index fc8aa0c0d..8fb0be92f 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -32,7 +32,8 @@ from pretix.base.signals import ( register_ticket_outputs, ) from pretix.control.forms.orders import ( - CommentForm, ExporterForm, ExtendForm, OrderPositionChangeForm, + CommentForm, ExporterForm, ExtendForm, OrderContactForm, + OrderPositionChangeForm, ) from pretix.control.permissions import EventPermissionRequiredMixin from pretix.multidomain.urlreverse import build_absolute_uri @@ -536,6 +537,34 @@ class OrderChange(OrderView): return self.get(*args, **kwargs) +class OrderContactChange(OrderView): + permission = 'can_change_orders' + template_name = 'pretixcontrol/order/change_contact.html' + + def get_context_data(self, **kwargs): + ctx = super().get_context_data() + ctx['form'] = self.form + return ctx + + @cached_property + def form(self): + return OrderContactForm( + instance=self.order, + data=self.request.POST if self.request.method == "POST" else None + ) + + def post(self, *args, **kwargs): + if self.form.is_valid(): + self.order.log_action('pretix.event.order.contact.changed', { + 'old_email': self.order.email, + 'new_email': self.form.cleaned_data['email'] + }) + self.form.save() + messages.success(self.request, _('The order has been changed.')) + return redirect(self.get_order_url()) + return self.get(*args, **kwargs) + + class OverView(EventPermissionRequiredMixin, TemplateView): template_name = 'pretixcontrol/orders/overview.html' permission = 'can_view_orders' diff --git a/src/tests/control/test_permissions.py b/src/tests/control/test_permissions.py index 6a4294d3f..523a8a53a 100644 --- a/src/tests/control/test_permissions.py +++ b/src/tests/control/test_permissions.py @@ -65,6 +65,7 @@ event_urls = [ "orders/ABC/invoice", "orders/ABC/extend", "orders/ABC/change", + "orders/ABC/contact", "orders/ABC/download/pdf", "orders/ABC/", "orders/", @@ -145,6 +146,7 @@ event_permission_urls = [ ("can_view_orders", "attendees/", 200), ("can_view_orders", "orders/FOO/", 200), ("can_change_orders", "orders/FOO/extend", 200), + ("can_change_orders", "orders/FOO/contact", 200), ("can_change_orders", "orders/FOO/transition", 405), ("can_change_orders", "orders/FOO/resend", 405), ("can_change_orders", "orders/FOO/invoice", 405),