This commit is contained in:
Mira Weller
2025-03-03 16:07:30 +01:00
parent 72bf4a2908
commit 87570df3f8

View File

@@ -83,9 +83,10 @@ def sync_all():
.prefetch_related("order__event") .prefetch_related("order__event")
.filter(Q(not_before__isnull=True) | Q(not_before__lt=datetime.now()))[:1000] .filter(Q(not_before__isnull=True) | Q(not_before__lt=datetime.now()))[:1000]
) )
grouped = groupby(sorted(queue, key=lambda q: (q.sync_target, q.order.event)), lambda q: (q.sync_target, q.order.event)) grouped = groupby(sorted(queue, key=lambda q: (q.sync_provider, q.order.event)), lambda q: (q.sync_provider, q.order.event))
for (target, event), queued_orders in grouped: for (target, event), queued_orders in grouped:
target_cls = sync_targets.get(identifier=target) target_cls, meta = sync_targets.get(identifier=target, active_in=event)
# TODO: what should i do if the sync plugin got deactivated in the meantime?
sync_event_to_target(event, target_cls, queued_orders) sync_event_to_target(event, target_cls, queued_orders)
@@ -110,9 +111,7 @@ class OutboundSyncProvider:
return self return self
def __exit__(self, exc_type, exc_val, exc_tb): def __exit__(self, exc_type, exc_val, exc_tb):
if not exc_type: self.close()
self.do_after_event()
self.do_finally()
@classmethod @classmethod
@property @property
@@ -127,19 +126,13 @@ class OutboundSyncProvider:
triggered_by=triggered_by, triggered_by=triggered_by,
not_before=not_before) not_before=not_before)
def do_after_event(self):
pass
def do_finally(self):
pass
def next_retry_date(self, sq): def next_retry_date(self, sq):
return datetime.now() + timedelta(days=1) return datetime.now() + timedelta(days=1)
def sync_queued_orders(self, queued_orders): def sync_queued_orders(self, queued_orders):
for sq in queued_orders: for sq in queued_orders:
try: try:
self.sync_order(sq.order) mapped_objects = self.sync_order(sq.order)
except SyncConfigError as e: except SyncConfigError as e:
logger.warning( logger.warning(
f"Could not sync order {sq.order.code} to {self.__name__} (config error)", f"Could not sync order {sq.order.code} to {self.__name__} (config error)",
@@ -159,7 +152,7 @@ class OutboundSyncProvider:
sq.failed_attempts += 1 sq.failed_attempts += 1
sq.not_before = self.next_retry_date(sq) sq.not_before = self.next_retry_date(sq)
logger.exception( logger.exception(
f"Could not sync order {sq.order.code} to {self.__name__} (transient error, attempt #{sq.failed_attempts})" f"Could not sync order {sq.order.code} to {type(self).__name__} (transient error, attempt #{sq.failed_attempts})"
) )
if sq.failed_attempts >= self.max_attempts: if sq.failed_attempts >= self.max_attempts:
sentry_sdk.capture_exception(e) sentry_sdk.capture_exception(e)
@@ -174,6 +167,9 @@ class OutboundSyncProvider:
else: else:
sq.save() sq.save()
else: else:
sq.order.log_action(
"pretix.event.order.data_sync.success", {"objects": mapped_objects}
)
sq.delete() sq.delete()
def order_valid_for_sync(self, order): def order_valid_for_sync(self, order):
@@ -234,7 +230,7 @@ class OutboundSyncProvider:
logger.debug("Skipping order (not valid for sync)", order) logger.debug("Skipping order (not valid for sync)", order)
return return
logger.debug("Syncing order", order) logger.debug("Syncing order %r", order)
positions = list( positions = list(
order.all_positions.filter(item__admission=True) order.all_positions.filter(item__admission=True)
.prefetch_related("answers", "answers__question") .prefetch_related("answers", "answers__question")
@@ -258,8 +254,18 @@ class OutboundSyncProvider:
] ]
else: else:
raise SyncConfigError("Invalid pretix model '{}'".format(mapping.pretix_model)) raise SyncConfigError("Invalid pretix model '{}'".format(mapping.pretix_model))
order.log_action( self.finalize_sync_order(order)
"pretix.event.order.data_sync.success", {"objects": mapped_objects} return mapped_objects
)
"""
Called after sync_object has been called successfully for all objects of a specific order. Can be used for saving
bulk information per order.
"""
def finalize_sync_order(self, order):
pass
"""
Called after all orders of an event have been synced. Can be used for clean-up tasks (closing a session etc).
"""
def close(self):
pass