diff --git a/src/pretix/control/templates/pretixcontrol/item/index.html b/src/pretix/control/templates/pretixcontrol/item/index.html index a3595cfb7..4657830fa 100644 --- a/src/pretix/control/templates/pretixcontrol/item/index.html +++ b/src/pretix/control/templates/pretixcontrol/item/index.html @@ -2,11 +2,6 @@ {% load i18n %} {% load bootstrap3 %} {% block inside %} - {% if "success" in request.GET %} -
- {% trans "Your changes have been saved." %} -
- {% endif %}
{% csrf_token %}
diff --git a/src/pretix/control/templates/pretixcontrol/items/categories.html b/src/pretix/control/templates/pretixcontrol/items/categories.html index d0e19ed2b..a75105f06 100644 --- a/src/pretix/control/templates/pretixcontrol/items/categories.html +++ b/src/pretix/control/templates/pretixcontrol/items/categories.html @@ -3,19 +3,6 @@ {% block title %}{% trans "Product categories" %}{% endblock %} {% block inside %}

{% trans "Product categories" %}

- {% if "updated" in request.GET %} -
- {% trans "Your changes have been saved." %} -
- {% elif "created" in request.GET %} -
- {% trans "A new category has been created." %} -
- {% elif "deleted" in request.GET %} -
- {% trans "The category has been deleted." %} -
- {% endif %}

{% trans "Create new category" %}

diff --git a/src/pretix/control/templates/pretixcontrol/items/properties.html b/src/pretix/control/templates/pretixcontrol/items/properties.html index 3a2667b4e..c89d2ada2 100644 --- a/src/pretix/control/templates/pretixcontrol/items/properties.html +++ b/src/pretix/control/templates/pretixcontrol/items/properties.html @@ -3,19 +3,6 @@ {% block title %}{% trans "Product properties" %}{% endblock %} {% block inside %}

{% trans "Product properties" %}

- {% if "updated" in request.GET %} -
- {% trans "Your changes have been saved." %} -
- {% elif "created" in request.GET %} -
- {% trans "A new property has been created." %} -
- {% elif "deleted" in request.GET %} -
- {% trans "The property has been deleted." %} -
- {% endif %}

{% trans "Create new property" %}

diff --git a/src/pretix/control/templates/pretixcontrol/items/property.html b/src/pretix/control/templates/pretixcontrol/items/property.html index 1de6f1ae7..8802d52cb 100644 --- a/src/pretix/control/templates/pretixcontrol/items/property.html +++ b/src/pretix/control/templates/pretixcontrol/items/property.html @@ -7,11 +7,6 @@

{% trans "Product property" %}

{% csrf_token %} - {% if "success" in request.GET %} -
- {% trans "Your changes have been saved." %} -
- {% endif %}
{% trans "General information" %} {% bootstrap_field form.name layout="horizontal" %} diff --git a/src/pretix/control/templates/pretixcontrol/items/question.html b/src/pretix/control/templates/pretixcontrol/items/question.html index 202ae590a..0caee6d61 100644 --- a/src/pretix/control/templates/pretixcontrol/items/question.html +++ b/src/pretix/control/templates/pretixcontrol/items/question.html @@ -6,11 +6,6 @@

{% trans "Question" %}

{% csrf_token %} - {% if "success" in request.GET %} -
- {% trans "Your changes have been saved." %} -
- {% endif %}
{% trans "General information" %} {% bootstrap_field form.question layout="horizontal" %} diff --git a/src/pretix/control/templates/pretixcontrol/items/questions.html b/src/pretix/control/templates/pretixcontrol/items/questions.html index 239a66924..cbcd2cca4 100644 --- a/src/pretix/control/templates/pretixcontrol/items/questions.html +++ b/src/pretix/control/templates/pretixcontrol/items/questions.html @@ -3,19 +3,6 @@ {% block title %}{% trans "Questions" %}{% endblock %} {% block inside %}

{% trans "Questions" %}

- {% if "updated" in request.GET %} -
- {% trans "Your changes have been saved." %} -
- {% elif "created" in request.GET %} -
- {% trans "A new question has been created." %} -
- {% elif "deleted" in request.GET %} -
- {% trans "The question has been deleted." %} -
- {% endif %}

{% trans "Create new question" %}

diff --git a/src/pretix/control/templates/pretixcontrol/items/quota.html b/src/pretix/control/templates/pretixcontrol/items/quota.html index 4402cafc8..f8c06af2c 100644 --- a/src/pretix/control/templates/pretixcontrol/items/quota.html +++ b/src/pretix/control/templates/pretixcontrol/items/quota.html @@ -6,11 +6,6 @@

{% trans "Quota" %}

{% csrf_token %} - {% if "success" in request.GET %} -
- {% trans "Your changes have been saved." %} -
- {% endif %}
{% trans "General information" %} {% bootstrap_field form.name layout="horizontal" %} diff --git a/src/pretix/control/templates/pretixcontrol/items/quotas.html b/src/pretix/control/templates/pretixcontrol/items/quotas.html index 0fd0a83b0..9db6e262c 100644 --- a/src/pretix/control/templates/pretixcontrol/items/quotas.html +++ b/src/pretix/control/templates/pretixcontrol/items/quotas.html @@ -3,19 +3,6 @@ {% block title %}{% trans "Quotas" %}{% endblock %} {% block inside %}

{% trans "Quotas" %}

- {% if "updated" in request.GET %} -
- {% trans "Your changes have been saved." %} -
- {% elif "created" in request.GET %} -
- {% trans "A new quota has been created." %} -
- {% elif "deleted" in request.GET %} -
- {% trans "The quota has been deleted." %} -
- {% endif %}

{% trans "Create a new quota" %}

diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 76415975b..1bfe78229 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -1,4 +1,5 @@ from itertools import product +from django.contrib import messages from django.db import transaction from django.forms import BooleanField from django.utils.functional import cached_property @@ -64,13 +65,14 @@ class CategoryDelete(EventPermissionRequiredMixin, DeleteView): item.save() success_url = self.get_success_url() self.object.delete() + messages.success(request, _('The selected category has been deleted.')) return HttpResponseRedirect(success_url) def get_success_url(self) -> str: return reverse('control:event.items.categories', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + '?deleted=true' + }) class CategoryUpdate(EventPermissionRequiredMixin, UpdateView): @@ -86,11 +88,15 @@ class CategoryUpdate(EventPermissionRequiredMixin, UpdateView): identity=url.kwargs['category'] ) + def form_valid(self, form): + messages.success(self.request, _('Your changes have been saved.')) + return super().form_valid(form) + def get_success_url(self) -> str: return reverse('control:event.items.categories', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + '?updated=true' + }) class CategoryCreate(EventPermissionRequiredMixin, CreateView): @@ -104,10 +110,11 @@ class CategoryCreate(EventPermissionRequiredMixin, CreateView): return reverse('control:event.items.categories', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + '?created=true' + }) def form_valid(self, form): form.instance.event = self.request.event + messages.success(self.request, _('The new category has been created.')) return super().form_valid(form) @@ -146,19 +153,17 @@ def category_move(request, category, up=True): @event_permission_required("can_change_items") def category_move_up(request, organizer, event, category): category_move(request, category, up=True) - return redirect(reverse('control:event.items.categories', kwargs={ - 'organizer': request.event.organizer.slug, - 'event': request.event.slug, - }) + '?ordered=true') + return redirect('control:event.items.categories', + organizer=request.event.organizer.slug, + event=request.event.slug) @event_permission_required("can_change_items") def category_move_down(request, organizer, event, category): category_move(request, category, up=False) - return redirect(reverse('control:event.items.categories', kwargs={ - 'organizer': request.event.organizer.slug, - 'event': request.event.slug, - }) + '?ordered=true') + return redirect('control:event.items.categories', + organizer=request.event.organizer.slug, + event=request.event.slug) class PropertyList(ListView): @@ -207,7 +212,7 @@ class PropertyUpdate(EventPermissionRequiredMixin, UpdateView): 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, 'property': self.kwargs['property'] - }) + '?success=true' + }) def get_formset(self): formsetclass = inlineformset_factory( @@ -238,6 +243,8 @@ class PropertyUpdate(EventPermissionRequiredMixin, UpdateView): f.instance = f.instance.clone() f.instance.position = i f.instance.save() + + messages.success(self.request, _('Your changes have been saved.')) return super().form_valid(form) def post(self, request, *args, **kwargs): @@ -262,7 +269,7 @@ class PropertyCreate(EventPermissionRequiredMixin, CreateView): return reverse('control:event.items.properties', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + '?created=true' + }) def get_formset(self): formsetclass = inlineformset_factory( @@ -289,6 +296,7 @@ class PropertyCreate(EventPermissionRequiredMixin, CreateView): f.instance.position = i f.instance.prop = form.instance f.instance.save() + messages.success(self.request, _('The new property has been created.')) return resp def post(self, request, *args, **kwargs): @@ -328,6 +336,7 @@ class PropertyDelete(EventPermissionRequiredMixin, DeleteView): if self.is_allowed(): success_url = self.get_success_url() self.get_object().delete() + messages.success(request, _('The selected property has been deleted.')) return HttpResponseRedirect(success_url) else: return HttpResponseForbidden() @@ -336,7 +345,7 @@ class PropertyDelete(EventPermissionRequiredMixin, DeleteView): return reverse('control:event.items.properties', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + '?deleted=true' + }) class QuestionList(ListView): @@ -380,13 +389,14 @@ class QuestionDelete(EventPermissionRequiredMixin, DeleteView): self.object = self.get_object() success_url = self.get_success_url() self.object.delete() + messages.success(request, _('The selected question has been deleted.')) return HttpResponseRedirect(success_url) def get_success_url(self) -> str: return reverse('control:event.items.questions', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + '?deleted=true' + }) class QuestionUpdate(EventPermissionRequiredMixin, UpdateView): @@ -401,11 +411,15 @@ class QuestionUpdate(EventPermissionRequiredMixin, UpdateView): identity=self.kwargs['question'] ) + def form_valid(self, form): + messages.success(self.request, _('Your changes have been saved.')) + return super().form_valid(form) + def get_success_url(self) -> str: return reverse('control:event.items.questions', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + '?updated=true' + }) class QuestionCreate(EventPermissionRequiredMixin, CreateView): @@ -419,10 +433,11 @@ class QuestionCreate(EventPermissionRequiredMixin, CreateView): return reverse('control:event.items.questions', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + '?created=true' + }) def form_valid(self, form): form.instance.event = self.request.event + messages.success(self.request, _('The new question has been created.')) return super().form_valid(form) @@ -538,10 +553,11 @@ class QuotaCreate(EventPermissionRequiredMixin, QuotaEditorMixin, CreateView): return reverse('control:event.items.quotas', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + '?created=true' + }) def form_valid(self, form): form.instance.event = self.request.event + messages.success(self.request, _('The new quota has been created.')) return super().form_valid(form) @@ -557,11 +573,15 @@ class QuotaUpdate(EventPermissionRequiredMixin, QuotaEditorMixin, UpdateView): identity=self.kwargs['quota'] ) + def form_valid(self, form): + messages.success(self.request, _('Your changes have been saved.')) + return super().form_valid(form) + def get_success_url(self) -> str: return reverse('control:event.items.quotas', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + '?updated=true' + }) class QuotaDelete(EventPermissionRequiredMixin, DeleteView): @@ -584,13 +604,14 @@ class QuotaDelete(EventPermissionRequiredMixin, DeleteView): self.object = self.get_object() success_url = self.get_success_url() self.object.delete() + messages.success(self.request, _('The selected quota has been deleted.')) return HttpResponseRedirect(success_url) def get_success_url(self) -> str: return reverse('control:event.items.quotas', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + '?deleted=true' + }) class ItemDetailMixin(SingleObjectMixin): @@ -641,7 +662,11 @@ class ItemCreate(EventPermissionRequiredMixin, CreateView): 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, 'item': self.object.identity, - }) + '?success=true' + }) + + def form_valid(self, form): + messages.success(self.request, _('Your changes have been saved.')) + return super().form_valid(form) def get_form_kwargs(self): """ @@ -663,7 +688,11 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, UpdateVie 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, 'item': self.get_object().identity, - }) + '?success=true' + }) + + def form_valid(self, form): + messages.success(self.request, _('Your changes have been saved.')) + return super().form_valid(form) class ItemVariationForm(VersionedModelForm): @@ -802,6 +831,7 @@ class ItemVariations(ItemDetailMixin, EventPermissionRequiredMixin, TemplateView def post(self, request, *args, **kwargs): self.main(request, *args, **kwargs) context = self.get_context_data(object=self.object) + valid = True with transaction.atomic(): for form in self.forms_flat: if form.is_valid() and form.has_changed(): @@ -811,7 +841,11 @@ class ItemVariations(ItemDetailMixin, EventPermissionRequiredMixin, TemplateView # for newly created items as cleanerversion does already set the # primary key in its post_init hook form.instance.values.add(*form.values) - # TODO: Redirect to success message + elif not form.is_valid and form.has_changed(): + valid = False + if valid: + messages.success(self.request, _('Your changes have been saved.')) + return redirect(self.get_success_url()) return self.render_to_response(context) def get_template_names(self) -> "List[str]": @@ -822,6 +856,13 @@ class ItemVariations(ItemDetailMixin, EventPermissionRequiredMixin, TemplateView elif self.dimension >= 2: return ['pretixcontrol/item/variations_nd.html'] + def get_success_url(self) -> str: + return reverse('control:event.item.variations', kwargs={ + 'organizer': self.request.event.organizer.slug, + 'event': self.request.event.slug, + 'item': self.get_object().identity, + }) + def get_context_data(self, **kwargs) -> dict: context = super().get_context_data(**kwargs) context['forms'] = self.forms @@ -873,6 +914,7 @@ class ItemRestrictions(ItemDetailMixin, EventPermissionRequiredMixin, TemplateVi form.instance.event = request.event form.instance.item = self.object form.save() + messages.success(self.request, _('Your changes have been saved.')) return redirect(self.get_success_url()) else: context = self.get_context_data(object=self.object) @@ -888,4 +930,4 @@ class ItemRestrictions(ItemDetailMixin, EventPermissionRequiredMixin, TemplateVi 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, 'item': self.object.identity - }) + '?success=true' + }) diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 44c2feb4e..b74eb7fa0 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -134,14 +134,10 @@ class OrderTransition(OrderView): ret = self.payment_provider.order_control_refund_perform(self.request, self.order) if ret: return redirect(ret) - return redirect(reverse( - 'control:event.order', - kwargs={ - 'event': self.request.event.slug, - 'organizer': self.request.event.organizer.slug, - 'code': self.order.code, - } - )) + return redirect('control:event.order', + event=self.request.event.slug, + organizer=self.request.event.organizer.slug, + code=self.order.code) def get(self, *args, **kwargs): to = self.request.GET.get('status', '') @@ -182,14 +178,10 @@ class OrderExtend(OrderView): return self.get(*args, **kwargs) def _redirect_back(self): - return redirect(reverse( - 'control:event.order', - kwargs={ - 'event': self.request.event.slug, - 'organizer': self.request.event.organizer.slug, - 'code': self.order.code, - } - )) + return redirect('control:event.order', + event=self.request.event.slug, + organizer=self.request.event.organizer.slug, + code=self.order.code) def get(self, *args, **kwargs): if self.order.status != Order.STATUS_PENDING: diff --git a/src/pretix/plugins/banktransfer/views.py b/src/pretix/plugins/banktransfer/views.py index ca0cf6bb5..4c30d24de 100644 --- a/src/pretix/plugins/banktransfer/views.py +++ b/src/pretix/plugins/banktransfer/views.py @@ -125,10 +125,9 @@ class ImportView(EventPermissionRequiredMixin, TemplateView): }) def redirect_back(self): - return redirect(reverse('plugins:banktransfer:import', kwargs={ - 'event': self.request.event.slug, - 'organizer': self.request.event.organizer.slug, - })) + return redirect('plugins:banktransfer:import', + event=self.request.event.slug, + organizer=self.request.event.organizer.slug) def annotate_data(self, data): pattern = re.compile(self.request.event.slug.upper() + "([A-Z0-9]{5})") diff --git a/src/pretix/plugins/paypal/views.py b/src/pretix/plugins/paypal/views.py index 0711cb75b..e281edc08 100644 --- a/src/pretix/plugins/paypal/views.py +++ b/src/pretix/plugins/paypal/views.py @@ -23,10 +23,9 @@ def success(request): request.session['payment_paypal_payer'] = payer try: event = Event.objects.current.get(identity=request.session['payment_paypal_event']) - return redirect(reverse('presale:event.checkout.confirm', kwargs={ - 'event': event.slug, - 'organizer': event.organizer.slug, - })) + return redirect('presale:event.checkout.confirm', + event=event.slug, + organizer=event.organizer.slug) except Event.DoesNotExist: pass # TODO: Handle this else: @@ -38,10 +37,9 @@ def abort(request): messages.error(request, _('It looks like you cancelled the PayPal payment')) try: event = Event.objects.current.get(identity=request.session['payment_paypal_event']) - return redirect(reverse('presale:event.checkout.payment', kwargs={ - 'event': event.slug, - 'organizer': event.organizer.slug, - })) + return redirect('presale:event.checkout.payment', + event=event.slug, + organizer=event.organizer.slug) except Event.DoesNotExist: pass # TODO: Handle this @@ -103,8 +101,7 @@ def retry(request, order): if resp: return redirect(resp) - return redirect(reverse('presale:event.order', kwargs={ - 'event': order.event.slug, - 'organizer': order.event.organizer.slug, - 'order': order.code, - })) + return redirect('presale:event.order', + event=order.event.slug, + organizer=order.event.organizer.slug, + order=order.code) diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index d05b8e95a..3d9b94231 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -229,12 +229,9 @@ class EventLogin(EventViewMixin, TemplateView): if 'next' in self.request.GET: return redirect(self.request.GET.get('next')) else: - return redirect(reverse( - 'presale:event.orders', kwargs={ - 'organizer': self.request.event.organizer.slug, - 'event': self.request.event.slug, - } - )) + return redirect('presale:event.orders', + organizer=self.request.event.organizer.slug, + event=self.request.event.slug) def get(self, request, *args, **kwargs): if request.user.is_authenticated() and \ @@ -377,12 +374,9 @@ class EventForgot(EventViewMixin, TemplateView): def get(self, request, *args, **kwargs): if request.user.is_authenticated() and \ (request.user.event is None or request.user.event == request.event): - return redirect(reverse( - 'presale:event.orders', kwargs={ - 'organizer': self.request.event.organizer.slug, - 'event': self.request.event.slug, - } - )) + return redirect('presale:event.orders', + organizer=self.request.event.organizer.slug, + event=self.request.event.slug) return super().get(request, *args, **kwargs) def generate_token(self, user): @@ -412,12 +406,9 @@ class EventForgot(EventViewMixin, TemplateView): else: messages.success(request, _('We are unable to send you a new password, as you did not enter an e-mail ' 'address at your registration.')) - return redirect(reverse( - 'presale:event.forgot', kwargs={ - 'organizer': self.request.event.organizer.slug, - 'event': self.request.event.slug, - } - )) + return redirect('presale:event.forgot', + organizer=self.request.event.organizer.slug, + event=self.request.event.slug) else: return self.get(request, *args, **kwargs) @@ -448,12 +439,9 @@ class EventRecover(EventViewMixin, TemplateView): def get(self, request, *args, **kwargs): if request.user.is_authenticated() and \ (request.user.event is None or request.user.event == request.event): - return redirect(reverse( - 'presale:event.orders', kwargs={ - 'organizer': self.request.event.organizer.slug, - 'event': self.request.event.slug, - } - )) + return redirect('presale:event.orders', + organizer=self.request.event.organizer.slug, + event=self.request.event.slug) try: self.get_user() except User.DoesNotExist: @@ -473,12 +461,9 @@ class EventRecover(EventViewMixin, TemplateView): def invalid(self, msg): messages.error(self.request, self.error_messages[msg]) - return redirect(reverse( - 'presale:event.forgot', kwargs={ - 'organizer': self.request.event.organizer.slug, - 'event': self.request.event.slug - } - )) + return redirect('presale:event.forgot', + organizer=self.request.event.organizer.slug, + event=self.request.event.slug) def post(self, request, *args, **kwargs): if self.form.is_valid(): @@ -493,12 +478,9 @@ class EventRecover(EventViewMixin, TemplateView): else: user.set_password(self.form.cleaned_data['password']) messages.success(request, _('You can now login using your new password.')) - return redirect(reverse( - 'presale:event.checkout.login', kwargs={ - 'organizer': self.request.event.organizer.slug, - 'event': self.request.event.slug, - } - )) + return redirect('presale:event.checkout.login', + organizer=self.request.event.organizer.slug, + event=self.request.event.slug) else: return self.get(request, *args, **kwargs) @@ -517,12 +499,9 @@ class EventRecover(EventViewMixin, TemplateView): class EventLogout(EventViewMixin, View): def get(self, request, *args, **kwargs): logout(request) - return redirect(reverse( - 'presale:event.index', kwargs={ - 'organizer': self.request.event.organizer.slug, - 'event': self.request.event.slug, - } - )) + return redirect('presale:event.index', + organizer=self.request.event.organizer.slug, + event=self.request.event.slug) class EventOrders(EventLoginRequiredMixin, EventViewMixin, TemplateView): diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index 88cf9dddd..be434848a 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -108,11 +108,10 @@ class OrderModify(EventViewMixin, EventLoginRequiredMixin, OrderDetailMixin, messages.error(self.request, _("We had difficulties processing your input. Please review the errors below.")) return self.get(*args, **kwargs) - return redirect(reverse('presale:event.order', kwargs={ - 'event': self.request.event.slug, - 'organizer': self.request.event.organizer.slug, - 'order': self.order.code, - })) + return redirect('presale:event.order', + event=self.request.event.slug, + organizer=self.request.event.organizer.slug, + order=self.order.code) def get(self, request, *args, **kwargs): self.request = request @@ -143,11 +142,10 @@ class OrderCancel(EventViewMixin, EventLoginRequiredMixin, OrderDetailMixin, order = self.order.clone() order.status = Order.STATUS_CANCELLED order.save() - return redirect(reverse('presale:event.order', kwargs={ - 'event': self.request.event.slug, - 'organizer': self.request.event.organizer.slug, - 'order': order.code, - })) + return redirect('presale:event.order', + event=self.request.event.slug, + organizer=self.request.event.organizer.slug, + order=order.code) def get(self, request, *args, **kwargs): self.kwargs = kwargs