Improve performance of voucher bulk creation

This commit is contained in:
Raphael Michel
2018-02-26 10:40:57 +01:00
parent 1c01e23867
commit 0d1f424425
3 changed files with 17 additions and 8 deletions

View File

@@ -36,7 +36,7 @@ def cached_file_delete(sender, instance, **kwargs):
class LoggingMixin: class LoggingMixin:
def log_action(self, action, data=None, user=None, api_token=None): def log_action(self, action, data=None, user=None, api_token=None, save=True):
""" """
Create a LogEntry object that is related to this object. Create a LogEntry object that is related to this object.
See the LogEntry documentation for details. See the LogEntry documentation for details.
@@ -60,10 +60,12 @@ class LoggingMixin:
logentry = LogEntry(content_object=self, user=user, action_type=action, event=event, api_token=api_token) logentry = LogEntry(content_object=self, user=user, action_type=action, event=event, api_token=api_token)
if data: if data:
logentry.data = json.dumps(data, cls=CustomJSONEncoder) logentry.data = json.dumps(data, cls=CustomJSONEncoder)
logentry.save() if save:
logentry.save()
if action in get_all_notification_types(): if action in get_all_notification_types():
notify.apply_async(args=(logentry.pk,)) notify.apply_async(args=(logentry.pk,))
return logentry
class LoggedModel(models.Model, LoggingMixin): class LoggedModel(models.Model, LoggingMixin):

View File

@@ -179,6 +179,6 @@ class VoucherBulkForm(VoucherForm):
data['code'] = code data['code'] = code
data['bulk'] = True data['bulk'] = True
del data['codes'] del data['codes']
obj.save()
objs.append(obj) objs.append(obj)
Voucher.objects.bulk_create(objs)
return objs return objs

View File

@@ -16,7 +16,7 @@ from django.views.generic import (
CreateView, DeleteView, ListView, TemplateView, UpdateView, View, CreateView, DeleteView, ListView, TemplateView, UpdateView, View,
) )
from pretix.base.models import Voucher from pretix.base.models import LogEntry, Voucher
from pretix.base.models.vouchers import _generate_random_code from pretix.base.models.vouchers import _generate_random_code
from pretix.control.forms.filter import VoucherFilterForm from pretix.control.forms.filter import VoucherFilterForm
from pretix.control.forms.vouchers import VoucherBulkForm, VoucherForm from pretix.control.forms.vouchers import VoucherBulkForm, VoucherForm
@@ -244,8 +244,15 @@ class VoucherBulkCreate(EventPermissionRequiredMixin, CreateView):
@transaction.atomic @transaction.atomic
def form_valid(self, form): def form_valid(self, form):
for o in form.save(self.request.event): log_entries = []
o.log_action('pretix.voucher.added', data=form.cleaned_data, user=self.request.user) form.save(self.request.event)
# We need to query them again as form.save() uses bulk_create which does not fill in .pk values on databases
# other than PostgreSQL
for v in self.request.event.vouchers.filter(code__in=form.cleaned_data['codes']):
log_entries.append(
v.log_action('pretix.voucher.added', data=form.cleaned_data, user=self.request.user, save=False)
)
LogEntry.objects.bulk_create(log_entries)
messages.success(self.request, _('The new vouchers have been created.')) messages.success(self.request, _('The new vouchers have been created.'))
return HttpResponseRedirect(self.get_success_url()) return HttpResponseRedirect(self.get_success_url())