mirror of
https://github.com/pretix/pretix.git
synced 2026-05-08 15:44:02 +00:00
Transactional safety for manual handling of sync jobs
This commit is contained in:
@@ -23,6 +23,7 @@
|
|||||||
from itertools import groupby
|
from itertools import groupby
|
||||||
|
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
|
from django.db import transaction
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.http import HttpResponseNotAllowed
|
from django.http import HttpResponseNotAllowed
|
||||||
@@ -42,6 +43,7 @@ from pretix.control.permissions import (
|
|||||||
)
|
)
|
||||||
from pretix.control.signals import order_info
|
from pretix.control.signals import order_info
|
||||||
from pretix.control.views.orders import OrderView
|
from pretix.control.views.orders import OrderView
|
||||||
|
from pretix.helpers import OF_SELF
|
||||||
|
|
||||||
|
|
||||||
@receiver(order_info, dispatch_uid="datasync_control_order_info")
|
@receiver(order_info, dispatch_uid="datasync_control_order_info")
|
||||||
@@ -79,22 +81,28 @@ class ControlSyncJob(OrderView):
|
|||||||
prov.enqueue_order(self.order, 'user')
|
prov.enqueue_order(self.order, 'user')
|
||||||
messages.success(self.request, _('The sync job has been enqueued and will run in the next minutes.'))
|
messages.success(self.request, _('The sync job has been enqueued and will run in the next minutes.'))
|
||||||
elif self.request.POST.get("cancel_job"):
|
elif self.request.POST.get("cancel_job"):
|
||||||
job = self.order.queued_sync_jobs.get(pk=self.request.POST.get("cancel_job"))
|
with transaction.atomic():
|
||||||
if job.in_flight:
|
job = self.order.queued_sync_jobs.select_for_update(of=OF_SELF).get(
|
||||||
messages.warning(self.request, _('The sync job is already in progress.'))
|
pk=self.request.POST.get("cancel_job")
|
||||||
else:
|
)
|
||||||
job.delete()
|
if job.in_flight:
|
||||||
messages.success(self.request, _('The sync job has been canceled.'))
|
messages.warning(self.request, _('The sync job is already in progress.'))
|
||||||
|
else:
|
||||||
|
job.delete()
|
||||||
|
messages.success(self.request, _('The sync job has been canceled.'))
|
||||||
elif self.request.POST.get("run_job_now"):
|
elif self.request.POST.get("run_job_now"):
|
||||||
job = self.order.queued_sync_jobs.get(pk=self.request.POST.get("run_job_now"))
|
with transaction.atomic():
|
||||||
if job.in_flight:
|
job = self.order.queued_sync_jobs.select_for_update(of=OF_SELF).get(
|
||||||
messages.success(self.request, _('The sync job is already in progress.'))
|
pk=self.request.POST.get("run_job_now")
|
||||||
else:
|
)
|
||||||
job.not_before = now()
|
if job.in_flight:
|
||||||
job.need_manual_retry = None
|
messages.success(self.request, _('The sync job is already in progress.'))
|
||||||
job.save()
|
else:
|
||||||
sync_single.apply_async(args=(job.pk,))
|
job.not_before = now()
|
||||||
messages.success(self.request, _('The sync job has been set to run as soon as possible.'))
|
job.need_manual_retry = None
|
||||||
|
job.save()
|
||||||
|
sync_single.apply_async(args=(job.pk,))
|
||||||
|
messages.success(self.request, _('The sync job has been set to run as soon as possible.'))
|
||||||
|
|
||||||
return redirect(self.get_order_url())
|
return redirect(self.get_order_url())
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user