From fdbe71ff633527f850e202934e62cba38e8100d1 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 29 Nov 2016 15:52:16 +0100 Subject: [PATCH] Fix #141 -- Caching improvements for ticket outputs --- src/pretix/base/models/orders.py | 8 ++++++++ src/pretix/base/services/orders.py | 6 +++++- src/pretix/control/views/event.py | 5 ++++- src/pretix/control/views/item.py | 5 +++-- src/pretix/presale/views/order.py | 2 ++ 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 0e3a4cf41f..c2f73e7c1a 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -8,6 +8,8 @@ import pytz from django.conf import settings from django.db import models from django.db.models import F +from django.db.models.signals import post_delete +from django.dispatch import receiver from django.utils.crypto import get_random_string from django.utils.timezone import make_aware, now from django.utils.translation import ugettext_lazy as _ @@ -563,3 +565,9 @@ class CachedTicket(models.Model): order_position = models.ForeignKey(OrderPosition, on_delete=models.CASCADE) cachedfile = models.ForeignKey(CachedFile, on_delete=models.CASCADE, null=True) provider = models.CharField(max_length=255) + + +@receiver(post_delete, sender=CachedTicket) +def cached_file_delete(sender, instance, **kwargs): + if instance.cachedfile: + instance.cachedfile.delete() diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index b1b76124b0..288bb74155 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -21,7 +21,7 @@ from pretix.base.models import ( CartPosition, Event, Item, ItemVariation, Order, OrderPosition, Quota, User, Voucher, ) -from pretix.base.models.orders import InvoiceAddress +from pretix.base.models.orders import CachedTicket, InvoiceAddress from pretix.base.payment import BasePaymentProvider from pretix.base.services.async import ProfiledTask from pretix.base.services.invoices import ( @@ -579,9 +579,13 @@ class OrderChangeManager: self._perform_operations() self._recalculate_total_and_payment_fee() self._reissue_invoice() + self._clear_tickets_cache() self._check_paid_to_free() self._notify_user() + def _clear_tickets_cache(self): + CachedTicket.objects.filter(order_position__order=self.order).delete() + def _get_payment_provider(self): responses = register_payment_providers.send(self.order.event) pprov = None diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 5b51ce6b7d..f64492be6f 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -16,7 +16,7 @@ from django.views.generic.detail import SingleObjectMixin from pretix.base.forms import I18nModelForm from pretix.base.models import ( - Event, EventPermission, Item, ItemVariation, User, + CachedTicket, Event, EventPermission, Item, ItemVariation, User, ) from pretix.base.services import tickets from pretix.base.services.invoices import build_preview_invoice_pdf @@ -450,6 +450,9 @@ class TicketSettings(EventPermissionRequiredMixin, FormView): for k in provider.form.changed_data } ) + CachedTicket.objects.filter( + order_position__order__event=self.request.event, provider=provider.identifier + ).delete() else: success = False form = self.get_form(self.get_form_class()) diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 938030953c..39ae76bc83 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -18,8 +18,8 @@ from django.views.generic.edit import DeleteView from pretix.base.forms import I18nFormSet from pretix.base.models import ( - Item, ItemCategory, ItemVariation, Order, Question, QuestionAnswer, - QuestionOption, Quota, + CachedTicket, Item, ItemCategory, ItemVariation, Order, Question, + QuestionAnswer, QuestionOption, Quota, ) from pretix.control.forms.item import ( CategoryForm, ItemCreateForm, ItemUpdateForm, ItemVariationForm, @@ -787,6 +787,7 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, UpdateVie for k in form.changed_data } ) + CachedTicket.objects.filter(order_position__item=self.item).delete() return super().form_valid(form) diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index 5e057e9b74..9771112bec 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -401,6 +401,8 @@ class OrderModify(EventViewMixin, OrderDetailMixin, QuestionsViewMixin, Template success_message = ('Your invoice address has been updated. Please contact us if you need us ' 'to regenerate your invoice.') messages.success(self.request, _(success_message)) + + CachedTicket.objects.filter(order_position__order=self.order).delete() return redirect(self.get_order_url()) def get(self, request, *args, **kwargs):