mirror of
https://github.com/pretix/pretix.git
synced 2026-05-17 17:14:04 +00:00
Store information about objects transferred in last successful sync
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
from itertools import groupby
|
||||
|
||||
from django.contrib import messages
|
||||
from django.dispatch import receiver
|
||||
from django.http import HttpResponseNotAllowed
|
||||
@@ -14,24 +16,23 @@ from pretix.control.views.orders import OrderView
|
||||
@receiver(order_info, dispatch_uid="datasync_control_order_info")
|
||||
def on_control_order_info(sender: Event, request, order: Order, **kwargs):
|
||||
providers = [provider for provider, meta in sync_targets.filter(active_in=sender)]
|
||||
if not providers: return ""
|
||||
if not providers:
|
||||
return ""
|
||||
|
||||
queued = order.queued_sync_jobs.all()
|
||||
queued_provider_ids = {p.sync_provider for p in queued}
|
||||
non_pending = [(provider.identifier, provider.display_name) for provider in providers if provider.identifier not in queued_provider_ids]
|
||||
|
||||
#sync_logs = order.all_logentries().filter(action_type__in=(
|
||||
# "pretix.event.order.data_sync.success",
|
||||
# "pretix.event.order.data_sync.failed"
|
||||
#))
|
||||
queued = {p.sync_provider: p for p in order.queued_sync_jobs.all()}
|
||||
objects = {
|
||||
provider: list(objects)
|
||||
for (provider, objects)
|
||||
in groupby(order.synced_objects.order_by('sync_provider').all(), key=lambda o: o.sync_provider)
|
||||
}
|
||||
providers = [(provider.identifier, provider.display_name, queued.get(provider.identifier), objects.get(provider.identifier)) for provider in providers]
|
||||
|
||||
template = get_template("pretixcontrol/datasync/control_order_info.html")
|
||||
ctx = {
|
||||
"order": order,
|
||||
"request": request,
|
||||
"event": sender,
|
||||
"non_pending_providers": non_pending,
|
||||
"queued_sync_jobs": queued,
|
||||
"providers": providers,
|
||||
}
|
||||
return template.render(ctx, request=request)
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ from django.utils.html import escape, format_html
|
||||
from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
||||
from i18nfield.strings import LazyI18nString
|
||||
|
||||
from pretix.base.datasync.datasync import sync_targets
|
||||
from pretix.base.logentrytypes import (
|
||||
DiscountLogEntryType, EventLogEntryType, ItemCategoryLogEntryType,
|
||||
ItemLogEntryType, LogEntryType, OrderLogEntryType, QuestionLogEntryType,
|
||||
@@ -420,11 +421,24 @@ class OrderPrintLogEntryType(OrderLogEntryType):
|
||||
type=dict(PrintLog.PRINT_TYPES)[data["type"]],
|
||||
)
|
||||
|
||||
|
||||
@log_entry_types.new_from_dict({
|
||||
"pretix.event.order.data_sync.success": _("Ticket data successfully transferred to {provider}."),
|
||||
})
|
||||
class OrderDataSyncLogentrytype(OrderLogEntryType):
|
||||
pass
|
||||
def display(self, logentry, data):
|
||||
links = []
|
||||
if data.get('provider') and data.get('objects'):
|
||||
prov, meta = sync_targets.get(identifier=data['provider'])
|
||||
if prov:
|
||||
for objs in data['objects'].values():
|
||||
links.append(", ".join(
|
||||
prov.get_external_link_html(logentry.event, obj['external_link_href'], obj['external_link_display_name'])
|
||||
for obj in objs
|
||||
if obj and 'external_link_href' in obj and 'external_link_display_name' in obj
|
||||
))
|
||||
|
||||
return mark_safe(super().display(logentry, data) + "".join("<p>" + link + "</p>" for link in links))
|
||||
|
||||
|
||||
@log_entry_types.new_from_dict({
|
||||
|
||||
@@ -12,10 +12,11 @@
|
||||
{{ test.hello }}
|
||||
<table class="table table-condensed">
|
||||
<tbody>
|
||||
{% for pending in queued_sync_jobs %}
|
||||
{% for identifier, display_name, pending, objects in providers %}
|
||||
<tr>
|
||||
<td>{{ pending.sync_provider }}</td>
|
||||
<td>{{ display_name }}</td>
|
||||
<td>
|
||||
{% if pending %}
|
||||
{% if pending.failed_attempts %}
|
||||
<i class="fa fa-warning"></i>
|
||||
{% blocktrans trimmed with num=pending.failed_attempts max=pending.max_retry_attempts %}
|
||||
@@ -32,32 +33,40 @@
|
||||
{% else %}
|
||||
<i class="fa fa-hourglass"></i> {% trans "Pending" %}
|
||||
{% endif %}
|
||||
(triggered by {{ pending.triggered_by }} at {{ pending.triggered }})
|
||||
{% else %}
|
||||
-
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<form action="{% url "control:event.order.sync_job" organizer=event.organizer.slug event=event.slug code=order.code provider=pending.sync_provider %}" method="post" class="form-inline">
|
||||
{% csrf_token %}
|
||||
{% if pending.not_before %}
|
||||
<button type="submit" name="run_job_now" value="{{ pending.pk }}" class="btn btn-default"><i class="fa fa-refresh"></i> {% trans "Retry now" %}</button>
|
||||
{% endif %}
|
||||
<button type="submit" name="cancel_job" value="{{ pending.pk }}" class="btn btn-danger"><i class="fa fa-trash"></i> {% trans "Cancel" %}</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% for identifier, display_name in non_pending_providers %}
|
||||
<tr>
|
||||
<td>{{ display_name }}</td>
|
||||
<td>-</td>
|
||||
<td>
|
||||
<td align="right">
|
||||
<form action="{% url "control:event.order.sync_job" organizer=event.organizer.slug event=event.slug code=order.code provider=identifier %}" method="post" class="form-inline">
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="btn btn-default"><i class="fa fa-refresh"></i> {% trans "Sync now" %}</button>
|
||||
<input type="hidden" name="queue_sync" value="true">
|
||||
{% if pending %}
|
||||
{% if pending.not_before %}
|
||||
<button type="submit" name="run_job_now" value="{{ pending.pk }}" class="btn btn-default"><i class="fa fa-refresh"></i> {% trans "Retry now" %}</button>
|
||||
{% endif %}
|
||||
<button type="submit" name="cancel_job" value="{{ pending.pk }}" class="btn btn-danger"><i class="fa fa-trash"></i> {% trans "Cancel" %}</button>
|
||||
{% else %}
|
||||
<button type="submit" class="btn btn-default"><i class="fa fa-refresh"></i> {% trans "Sync now" %}</button>
|
||||
<input type="hidden" name="queue_sync" value="true">
|
||||
{% endif %}
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{% for obj in objects %}
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>
|
||||
{% if obj.external_link_html %}
|
||||
{{ obj.external_link_html }}
|
||||
{% else %}
|
||||
{{ obj.external_object_type }} with {{ obj.external_pk_name }} = {{ obj.external_pk_value }}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td align="right">{{ obj.timestamp }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -1677,6 +1677,3 @@ class EventQRCode(EventPermissionRequiredMixin, View):
|
||||
r = HttpResponse(byte_io.read(), content_type='image/' + filetype)
|
||||
r['Content-Disposition'] = f'inline; filename="qrcode-{request.event.slug}.{filetype}"'
|
||||
return r
|
||||
|
||||
|
||||
#class DataSyncSettings
|
||||
|
||||
Reference in New Issue
Block a user