mirror of
https://github.com/pretix/pretix.git
synced 2025-12-31 18:22:26 +00:00
Compare commits
1 Commits
sync-singl
...
mapping-js
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
44ef67077a |
@@ -93,15 +93,6 @@ def split_name_on_last_space(name, part):
|
||||
return name_parts[part] if len(name_parts) > part else ""
|
||||
|
||||
|
||||
def normalize_email(email):
|
||||
if email:
|
||||
local, host = email.split("@")
|
||||
host = host.encode("idna").decode()
|
||||
return f"{local}@{host}"
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
ORDER_POSITION = 'position'
|
||||
ORDER = 'order'
|
||||
EVENT = 'event'
|
||||
@@ -182,10 +173,8 @@ def get_data_fields(event, for_model=None):
|
||||
_("Attendee email"),
|
||||
Question.TYPE_STRING,
|
||||
None,
|
||||
lambda position: normalize_email(
|
||||
position.attendee_email
|
||||
or (position.addon_to.attendee_email if position.addon_to else None)
|
||||
),
|
||||
lambda position: position.attendee_email
|
||||
or (position.addon_to.attendee_email if position.addon_to else None),
|
||||
),
|
||||
DataFieldInfo(
|
||||
ORDER_POSITION,
|
||||
@@ -193,11 +182,9 @@ def get_data_fields(event, for_model=None):
|
||||
_("Attendee or order email"),
|
||||
Question.TYPE_STRING,
|
||||
None,
|
||||
lambda position: normalize_email(
|
||||
position.attendee_email
|
||||
or (position.addon_to.attendee_email if position.addon_to else None)
|
||||
or position.order.email
|
||||
),
|
||||
lambda position: position.attendee_email
|
||||
or (position.addon_to.attendee_email if position.addon_to else None)
|
||||
or position.order.email,
|
||||
),
|
||||
DataFieldInfo(
|
||||
ORDER_POSITION,
|
||||
@@ -314,7 +301,7 @@ def get_data_fields(event, for_model=None):
|
||||
_("Order email"),
|
||||
Question.TYPE_STRING,
|
||||
None,
|
||||
lambda order: normalize_email(order.email),
|
||||
lambda order: order.email,
|
||||
),
|
||||
DataFieldInfo(
|
||||
ORDER,
|
||||
|
||||
@@ -52,22 +52,6 @@ def periodic_reset_in_flight(sender, **kwargs):
|
||||
sq.set_sync_error('timeout', [], 'Timeout')
|
||||
|
||||
|
||||
def run_sync(queue):
|
||||
grouped = groupby(sorted(queue, key=lambda q: (q.sync_provider, q.event.pk)), lambda q: (q.sync_provider, q.event))
|
||||
for (target, event), queued_orders in grouped:
|
||||
target_cls, meta = datasync_providers.get(identifier=target, active_in=event)
|
||||
|
||||
if not target_cls:
|
||||
# sync plugin not found (plugin deactivated or uninstalled) -> drop outstanding jobs
|
||||
num_deleted, _ = OrderSyncQueue.objects.filter(pk__in=[sq.pk for sq in queued_orders]).delete()
|
||||
logger.info("Deleted %d queue entries from %r because plugin %s inactive", num_deleted, event, target)
|
||||
continue
|
||||
|
||||
with scope(organizer=event.organizer):
|
||||
with target_cls(event=event) as p:
|
||||
p.sync_queued_orders(queued_orders)
|
||||
|
||||
|
||||
@app.task()
|
||||
def sync_all():
|
||||
with scopes_disabled():
|
||||
@@ -86,20 +70,14 @@ def sync_all():
|
||||
.prefetch_related("event")
|
||||
[:1000]
|
||||
)
|
||||
run_sync(queue)
|
||||
grouped = groupby(sorted(queue, key=lambda q: (q.sync_provider, q.event.pk)), lambda q: (q.sync_provider, q.event))
|
||||
for (target, event), queued_orders in grouped:
|
||||
target_cls, meta = datasync_providers.get(identifier=target, active_in=event)
|
||||
|
||||
if not target_cls:
|
||||
# sync plugin not found (plugin deactivated or uninstalled) -> drop outstanding jobs
|
||||
OrderSyncQueue.objects.filter(pk__in=[sq.pk for sq in queued_orders]).delete()
|
||||
|
||||
@app.task()
|
||||
def sync_single(queue_item_id: int):
|
||||
with scopes_disabled():
|
||||
queue = (
|
||||
OrderSyncQueue.objects
|
||||
.filter(
|
||||
pk=queue_item_id,
|
||||
in_flight=False,
|
||||
not_before__lt=now(),
|
||||
need_manual_retry__isnull=True,
|
||||
)
|
||||
.prefetch_related("event")
|
||||
)
|
||||
run_sync(queue)
|
||||
with scope(organizer=event.organizer):
|
||||
with target_cls(event=event) as p:
|
||||
p.sync_queued_orders(queued_orders)
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
from itertools import groupby
|
||||
|
||||
from django.contrib import messages
|
||||
from django.db import transaction
|
||||
from django.db.models import Q
|
||||
from django.dispatch import receiver
|
||||
from django.http import HttpResponseNotAllowed
|
||||
@@ -36,14 +35,12 @@ from django.views.generic import ListView
|
||||
from pretix.base.datasync.datasync import datasync_providers
|
||||
from pretix.base.models import Event, Order
|
||||
from pretix.base.models.datasync import OrderSyncQueue
|
||||
from pretix.base.services.datasync import sync_single
|
||||
from pretix.control.permissions import (
|
||||
AdministratorPermissionRequiredMixin, EventPermissionRequiredMixin,
|
||||
OrganizerPermissionRequiredMixin,
|
||||
)
|
||||
from pretix.control.signals import order_info
|
||||
from pretix.control.views.orders import OrderView
|
||||
from pretix.helpers import OF_SELF
|
||||
|
||||
|
||||
@receiver(order_info, dispatch_uid="datasync_control_order_info")
|
||||
@@ -81,28 +78,18 @@ class ControlSyncJob(OrderView):
|
||||
prov.enqueue_order(self.order, 'user')
|
||||
messages.success(self.request, _('The sync job has been enqueued and will run in the next minutes.'))
|
||||
elif self.request.POST.get("cancel_job"):
|
||||
with transaction.atomic():
|
||||
job = self.order.queued_sync_jobs.select_for_update(of=OF_SELF).get(
|
||||
pk=self.request.POST.get("cancel_job")
|
||||
)
|
||||
if job.in_flight:
|
||||
messages.warning(self.request, _('The sync job is already in progress.'))
|
||||
else:
|
||||
job.delete()
|
||||
messages.success(self.request, _('The sync job has been canceled.'))
|
||||
job = self.order.queued_sync_jobs.get(pk=self.request.POST.get("cancel_job"))
|
||||
if job.in_flight:
|
||||
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"):
|
||||
with transaction.atomic():
|
||||
job = self.order.queued_sync_jobs.select_for_update(of=OF_SELF).get(
|
||||
pk=self.request.POST.get("run_job_now")
|
||||
)
|
||||
if job.in_flight:
|
||||
messages.success(self.request, _('The sync job is already in progress.'))
|
||||
else:
|
||||
job.not_before = now()
|
||||
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.'))
|
||||
job = self.order.queued_sync_jobs.get(pk=self.request.POST.get("run_job_now"))
|
||||
job.not_before = now()
|
||||
job.need_manual_retry = None
|
||||
job.save()
|
||||
messages.success(self.request, _('The sync job has been set to run as soon as possible.'))
|
||||
|
||||
return redirect(self.get_order_url())
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-08-05 07:29+0000\n"
|
||||
"PO-Revision-Date: 2025-08-06 09:46+0000\n"
|
||||
"PO-Revision-Date: 2025-08-05 07:57+0000\n"
|
||||
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
|
||||
">\n"
|
||||
@@ -6163,7 +6163,7 @@ msgstr "Wert"
|
||||
|
||||
#: pretix/base/models/orders.py:2546
|
||||
msgid "Order position"
|
||||
msgstr "Bestellposition"
|
||||
msgstr "Bestelltes Produkt"
|
||||
|
||||
#: pretix/base/models/orders.py:3091
|
||||
msgid "Cart ID (e.g. session key)"
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-08-05 07:29+0000\n"
|
||||
"PO-Revision-Date: 2025-08-06 09:46+0000\n"
|
||||
"PO-Revision-Date: 2025-08-05 07:58+0000\n"
|
||||
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
|
||||
"pretix/pretix/de_Informal/>\n"
|
||||
@@ -6159,7 +6159,7 @@ msgstr "Wert"
|
||||
|
||||
#: pretix/base/models/orders.py:2546
|
||||
msgid "Order position"
|
||||
msgstr "Bestellposition"
|
||||
msgstr "Bestelltes Produkt"
|
||||
|
||||
#: pretix/base/models/orders.py:3091
|
||||
msgid "Cart ID (e.g. session key)"
|
||||
|
||||
@@ -61,7 +61,7 @@ def event():
|
||||
option2 = question2.options.create(identifier="F2", answer="vegan")
|
||||
|
||||
o1 = Order.objects.create(
|
||||
code='1AAA', event=event, email='anonymous@🌈.example.org',
|
||||
code='1AAA', event=event, email='anonymous@example.org',
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=46,
|
||||
@@ -100,7 +100,7 @@ def expected_order_sync_result():
|
||||
{
|
||||
'_id': 0,
|
||||
'ordernumber': 'DUMMY-1AAA',
|
||||
'orderemail': 'anonymous@xn--og8h.example.org',
|
||||
'orderemail': 'anonymous@example.org',
|
||||
'status': 'pending',
|
||||
'total': '46.00',
|
||||
'payment_date': None,
|
||||
@@ -158,7 +158,7 @@ def expected_sync_result_with_associations():
|
||||
{
|
||||
'_id': 0,
|
||||
'ordernumber': 'DUMMY-1AAA',
|
||||
'orderemail': 'anonymous@xn--og8h.example.org',
|
||||
'orderemail': 'anonymous@example.org',
|
||||
'firstname': '',
|
||||
'lastname': '',
|
||||
'status': 'pending',
|
||||
|
||||
Reference in New Issue
Block a user