diff --git a/.gitignore b/.gitignore index 810dc27d0..bc3718523 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,6 @@ pretixeu/ local/ .project .pydevproject +.DS_Store + diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index 4c70b3c8b..99073aac8 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -1,4 +1,5 @@ from django import forms +from django.conf import settings from django.core.exceptions import ValidationError from django.db import models from django.utils.formats import localize @@ -118,3 +119,15 @@ class OrderContactForm(forms.ModelForm): class Meta: model = Order fields = ['email'] + + +class OrderLocaleForm(forms.ModelForm): + locale = forms.ChoiceField() + + class Meta: + model = Order + fields = ['locale'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['locale'].choices = [(a, a) for a in self.instance.event.settings.locales] diff --git a/src/pretix/control/templates/pretixcontrol/order/change_locale.html b/src/pretix/control/templates/pretixcontrol/order/change_locale.html new file mode 100644 index 000000000..84f8b2c88 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/order/change_locale.html @@ -0,0 +1,30 @@ +{% extends "pretixcontrol/event/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %} + {% trans "Change locale information" %} +{% endblock %} +{% block content %} +
+ This language will be used whenever emails are sent to the users. +
+ + +{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html index 9d6f899dd..9eaa5f82a 100644 --- a/src/pretix/control/templates/pretixcontrol/order/index.html +++ b/src/pretix/control/templates/pretixcontrol/order/index.html @@ -71,6 +71,13 @@[0-9A-Z]+)/contact$', orders.OrderContactChange.as_view(),
name='event.order.contact'),
+ url(r'^orders/(?P[0-9A-Z]+)/locale', orders.OrderLocaleChange.as_view(),
+ name='event.order.locale'),
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 4e3bf58fd..ffa62cbbe 100644
--- a/src/pretix/control/views/orders.py
+++ b/src/pretix/control/views/orders.py
@@ -30,7 +30,7 @@
register_data_exporters, register_payment_providers,
)
from pretix.control.forms.orders import (
- CommentForm, ExporterForm, ExtendForm, OrderContactForm,
+ CommentForm, ExporterForm, ExtendForm, OrderContactForm, OrderLocaleForm,
OrderPositionChangeForm,
)
from pretix.control.permissions import EventPermissionRequiredMixin
@@ -552,6 +552,40 @@ def post(self, *args, **kwargs):
return self.get(*args, **kwargs)
+class OrderLocaleChange(OrderView):
+ permission = 'can_change_orders'
+ template_name = 'pretixcontrol/order/change_locale.html'
+
+ def get_context_data(self, **kwargs):
+ ctx = super().get_context_data()
+ ctx['form'] = self.form
+ return ctx
+
+ @cached_property
+ def form(self):
+ return OrderLocaleForm(
+ instance=self.order,
+ data=self.request.POST if self.request.method == "POST" else None
+ )
+
+ def post(self, *args, **kwargs):
+ old_locale = self.order.locale
+ if self.form.is_valid():
+ self.order.log_action(
+ 'pretix.event.order.locale.changed',
+ data={
+ 'old_locale': old_locale,
+ 'new_locale': self.form.cleaned_data['locale'],
+ },
+ user=self.request.user,
+ )
+
+ 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_orders.py b/src/tests/control/test_orders.py
index c50427ec7..a86da92df 100644
--- a/src/tests/control/test_orders.py
+++ b/src/tests/control/test_orders.py
@@ -40,6 +40,7 @@ def env():
category=None, default_price=23,
admission=True)
event.settings.set('attendee_names_asked', True)
+ event.settings.set('locales', ['en', 'de'])
OrderPosition.objects.create(
order=o,
item=ticket,
@@ -104,6 +105,30 @@ def test_order_set_contact(client, env):
assert o.email == 'admin@rami.io'
+@pytest.mark.django_db
+def test_order_set_locale(client, env):
+ q = Quota.objects.create(event=env[0], size=0)
+ q.items.add(env[3])
+ client.login(email='dummy@dummy.dummy', password='dummy')
+ client.post('/control/event/dummy/dummy/orders/FOO/locale', {
+ 'locale': 'de'
+ })
+ o = Order.objects.get(id=env[2].id)
+ assert o.locale == 'de'
+
+
+@pytest.mark.django_db
+def test_order_set_locale_with_invalid_locale_value(client, env):
+ q = Quota.objects.create(event=env[0], size=0)
+ q.items.add(env[3])
+ client.login(email='dummy@dummy.dummy', password='dummy')
+ client.post('/control/event/dummy/dummy/orders/FOO/locale', {
+ 'locale': 'fr'
+ })
+ o = Order.objects.get(id=env[2].id)
+ assert o.locale == 'en'
+
+
@pytest.mark.django_db
def test_order_set_comment(client, env):
q = Quota.objects.create(event=env[0], size=0)