from django.contrib import admin
from django.utils.safestring import mark_safe
from django.urls import reverse
from .models import RawNotification, Notification
from .models import Report, TransactionStatus, AdyenLog, Refund
class RawNotificationAdmin(admin.ModelAdmin):
list_display = ('dat', 'confirmed',)
readonly_fields = ('notification_link', )
def notification_link(self, obj):
if obj.notification_set.exists():
n = obj.notification_set.all()[0]
url = reverse("admin:adyen_notification_change", args=(n.id,))
return mark_safe('%s' % (url, n))
notification_link.short_description = 'Notification'
class NotificationAdmin(admin.ModelAdmin):
list_display = ('receivedat', 'eventDate', 'merchantAccountCode', 'eventCode', 'live', 'success', 'confirmed', 'pspReference', )
list_filter = ('merchantAccountCode', )
readonly_fields = ('rawnotification_link',)
exclude = ('rawnotification', )
search_fields = ('pspReference', 'merchantReference', 'reason', )
def rawnotification_link(self, obj):
url = reverse('admin:adyen_rawnotification_change', args=(obj.rawnotification.id,))
return mark_safe('%s' % (url, obj))
rawnotification_link.short_description = 'Rawnotification'
class MerchantAccountFilter(admin.SimpleListFilter):
title = 'Merchant account'
parameter_name = 'merchantaccount'
def lookups(self, request, model_admin):
# This is painfully inefficient, but it's called infrequently, so meh.
return [(c['merchantAccountCode'], c['merchantAccountCode']) for c in Notification.objects.values('merchantAccountCode').distinct()]
def queryset(self, request, queryset):
if self.value():
return queryset.filter(url__regex='/download/MerchantAccount/{}/'.format(self.value()))
return queryset
class ReportTypeFilter(admin.SimpleListFilter):
title = 'Report type'
parameter_name = 'reporttype'
_types = {
'payments_accounting': ('Payments Accounting', r'/payments_accounting_report_\d+_\d+_\d+\.csv'),
'received_payments': ('Received payments', r'received_payments_report_\d+_\d+_\d+\.csv'),
'settlement_detail': ('Settlement detail', r'settlement_detail_report_batch_\d+\.csv'),
}
def lookups(self, request, model_admin):
return ((k, v[0]) for k, v in self._types.items())
def queryset(self, request, queryset):
if self.value():
return queryset.filter(url__regex=self._types[self.value()][1])
return queryset
class ReportAdmin(admin.ModelAdmin):
list_display = ('receivedat', 'downloadedat', 'processedat', 'url',)
list_filter = [MerchantAccountFilter, ReportTypeFilter, ]
readonly_fields = ('notification_link', )
exclude = ('notification', )
def notification_link(self, obj):
if obj.notification:
url = reverse("admin:adyen_notification_change", args=(obj.notification.id,))
return mark_safe('%s' % (url, obj.notification))
notification_link.short_description = 'Notification'
class TransactionStatusAdmin(admin.ModelAdmin):
list_display = ('pspReference', 'amount', 'settledamount', 'authorizedat', 'capturedat', 'settledat', 'method')
readonly_fields = ('notification_link', 'refund_link', )
exclude = ('notification', )
search_fields = ('pspReference', 'notes', )
def notification_link(self, obj):
if obj.notification:
url = reverse("admin:adyen_notification_change", args=(obj.notification.id,))
return mark_safe('%s' % (url, obj.notification))
notification_link.short_description = 'Notification'
def refund_link(self, obj):
refunds = list(obj.refund_set.all())
if refunds:
return mark_safe(
"
".join(
'%s at %s' % (r.refund_amount, reverse("admin:adyen_refund_change", args=(r.id,)), r.receivedat)
for r in refunds
)
)
else:
return "Not refunded"
refund_link.short_description = 'Refund'
class RefundAdmin(admin.ModelAdmin):
list_display = ('notification', 'receivedat', 'transaction', 'refund_amount')
readonly_fields = ('notification_link', 'transaction_link', )
exclude = ('notification', 'transaction', )
def notification_link(self, obj):
if obj.notification:
url = reverse("admin:adyen_notification_change", args=(obj.notification.id,))
return mark_safe('%s' % (url, obj.notification))
notification_link.short_description = 'Notification'
def transaction_link(self, obj):
if obj.transaction:
url = reverse("admin:adyen_transactionstatus_change", args=(obj.transaction.id,))
return mark_safe('%s' % (url, obj.transaction.pspReference))
transaction_link.short_description = 'Transaction'
class AdyenLogAdmin(admin.ModelAdmin):
list_display = ('timestamp', 'success', 'sentstr', 'pspReference', 'message', )
def success(self, obj):
return not obj.error
success.boolean = True
def sentstr(self, obj):
return obj.sent and 'Yes' or 'No'
sentstr.short_description = 'Log sent'
admin.site.register(RawNotification, RawNotificationAdmin)
admin.site.register(Notification, NotificationAdmin)
admin.site.register(Report, ReportAdmin)
admin.site.register(TransactionStatus, TransactionStatusAdmin)
admin.site.register(Refund, RefundAdmin)
admin.site.register(AdyenLog, AdyenLogAdmin)