Fix log display for checkins and order splits (Z#23181229) (#4818)

- Fix link in pretix.event.order.changed.split
- Add link to existing order in pretix.event.order.changed.split_from
- Fix display of checkin entries without datetime in data
- Add additional info for admins (action type, linked content object)
This commit is contained in:
Mira
2025-02-07 11:53:17 +01:00
committed by GitHub
parent c4436ca319
commit f7cba6a2bd
3 changed files with 25 additions and 12 deletions

View File

@@ -72,7 +72,7 @@ class OrderChangeLogEntryType(OrderLogEntryType):
prefix = _('The order has been changed:') prefix = _('The order has been changed:')
def display(self, logentry, data): def display(self, logentry, data):
return self.prefix + ' ' + self.display_prefixed(logentry.event, logentry, data) return format_html('{} {}', self.prefix, self.display_prefixed(logentry.event, logentry, data))
def display_prefixed(self, event: Event, logentry: LogEntry, data): def display_prefixed(self, event: Event, logentry: LogEntry, data):
return super().display(logentry, data) return super().display(logentry, data)
@@ -282,12 +282,13 @@ class OrderChangedSplit(OrderChangeLogEntryType):
'organizer': event.organizer.slug, 'organizer': event.organizer.slug,
'code': data['new_order'] 'code': data['new_order']
}) })
return mark_safe(self.prefix + ' ' + _('Position #{posid} ({old_item}, {old_price}) split into new order: {order}').format( return format_html(
_('Position #{posid} ({old_item}, {old_price}) split into new order: {order}'),
old_item=escape(old_item), old_item=escape(old_item),
posid=data.get('positionid', '?'), posid=data.get('positionid', '?'),
order='<a href="{}">{}</a>'.format(url, data['new_order']), order=format_html(mark_safe('<a href="{}">{}</a>'), url, data['new_order']),
old_price=money_filter(Decimal(data['old_price']), event.currency), old_price=money_filter(Decimal(data['old_price']), event.currency),
)) )
@log_entry_types.new() @log_entry_types.new()
@@ -295,8 +296,14 @@ class OrderChangedSplitFrom(OrderLogEntryType):
action_type = 'pretix.event.order.changed.split_from' action_type = 'pretix.event.order.changed.split_from'
def display(self, logentry: LogEntry, data): def display(self, logentry: LogEntry, data):
return _('This order has been created by splitting the order {order}').format( url = reverse('control:event.order', kwargs={
order=data['original_order'], 'event': logentry.event.slug,
'organizer': logentry.event.organizer.slug,
'code': data['original_order']
})
return format_html(
_('This order has been created by splitting the order {order}'),
order=format_html(mark_safe('<a href="{}">{}</a>'), url, data['original_order']),
) )
@@ -343,12 +350,12 @@ class CheckinErrorLogEntryType(OrderLogEntryType):
if 'datetime' in data: if 'datetime' in data:
dt = dateutil.parser.parse(data.get('datetime')) dt = dateutil.parser.parse(data.get('datetime'))
if abs((logentry.datetime - dt).total_seconds()) > 5 or 'forced' in data: if abs((logentry.datetime - dt).total_seconds()) > 5 or data.get('forced'):
tz = event.timezone tz = event.timezone
data['datetime'] = date_format(dt.astimezone(tz), "SHORT_DATETIME_FORMAT") data['datetime'] = date_format(dt.astimezone(tz), "SHORT_DATETIME_FORMAT")
return str(plain_with_dt).format_map(data) return str(plain_with_dt).format_map(data)
else:
return str(plain_without_dt).format_map(data) return str(plain_without_dt).format_map(data)
@log_entry_types.new('pretix.event.checkin') @log_entry_types.new('pretix.event.checkin')

View File

@@ -110,7 +110,7 @@ class MessageView(TemplateView):
class LogDetailView(AdministratorPermissionRequiredMixin, View): class LogDetailView(AdministratorPermissionRequiredMixin, View):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
le = get_object_or_404(LogEntry, pk=request.GET.get('pk')) le = get_object_or_404(LogEntry, pk=request.GET.get('pk'))
return JsonResponse({'data': le.parsed_data}) return JsonResponse({'action_type': le.action_type, 'content_type': str(le.content_type), 'object_id': le.object_id, 'data': le.parsed_data})
class PaymentDetailView(AdministratorPermissionRequiredMixin, View): class PaymentDetailView(AdministratorPermissionRequiredMixin, View):

View File

@@ -1065,11 +1065,17 @@ function add_log_expand_handlers(el) {
} else if ($a.is("[data-expandpayment]")) { } else if ($a.is("[data-expandpayment]")) {
url += 'payment/' url += 'payment/'
} }
function format_data(data) {
return Object.entries(data).map(([key, value]) =>
$("<div>").append(
$("<b>").text(key + ': '),
$("<span>").text(JSON.stringify(value, null, 2))));
}
$.getJSON(url + '?pk=' + id, function (data) { $.getJSON(url + '?pk=' + id, function (data) {
if ($a.parent().tagName === "p") { if ($a.parent().tagName === "p") {
$("<pre>").text(JSON.stringify(data.data, null, 2)).insertAfter($a.parent()); $("<pre>").append(format_data(data)).insertAfter($a.parent());
} else { } else {
$("<pre>").text(JSON.stringify(data.data, null, 2)).appendTo($a.parent()); $("<pre>").append(format_data(data)).appendTo($a.parent());
} }
$a.remove(); $a.remove();
}); });