vbv/server/vbv_lernwelt/shop/admin.py

105 lines
3.1 KiB
Python

from django.contrib import admin
from vbv_lernwelt.shop.invoice.abacus import abacus_ssh_upload
from vbv_lernwelt.shop.models import CheckoutInformation, CheckoutState, Product
from vbv_lernwelt.shop.services import get_transaction_state
from vbv_lernwelt.shop.views import send_vv_welcome_email
@admin.action(description="DATATRANS: Sync transaction states")
def sync_transaction_state(modeladmin, request, queryset):
for checkout in queryset:
state = get_transaction_state(transaction_id=checkout.transaction_id)
checkout.state = state.value
checkout.save(
update_fields=[
"state",
]
)
@admin.register(CheckoutInformation)
class CheckoutInformationAdmin(admin.ModelAdmin):
@admin.action(description="ABACUS: Upload invoice to SFTP server")
def abacus_upload_order(self, request, queryset):
success = True
for ci in queryset:
if not abacus_ssh_upload(ci):
success = False
if not success:
self.message_user(
request, "Beim SFTP upload ist ein Fehler aufgetreten", level="error"
)
@admin.action(description="Buchungsbestätigung: Bestätigung erneut senden")
def resend_payment_confirmation(self, request, queryset):
for ci in queryset:
if ci.state != CheckoutState.PAID.value:
self.message_user(
request,
f"Die Buchung mit der ID {ci.transaction_id} ist nicht bezahlt",
level="error",
)
continue
else:
send_vv_welcome_email(ci)
self.message_user(
request,
f"Die Buchungsbestätigung für {ci.transaction_id} wurde erneut versendet",
level="success",
)
@staticmethod
def customer(obj):
return f"{obj.user.first_name} {obj.user.last_name} ({obj.user.email})"
@staticmethod
def debitor_number(obj):
return obj.user.abacus_debitor_number
def has_delete_permission(self, request, obj=None):
# Disable delete
return False
list_display = (
"product_sku",
customer,
"product_name",
"product_price",
"created_at",
"state",
"invoice_transmitted_at",
"abacus_order_id",
debitor_number,
"abacus_ssh_upload_done",
)
search_fields = [
"user__email",
"user__first_name",
"user__last_name",
"user__username",
"transaction_id",
"abacus_order_id",
"user__abacus_debitor_number",
]
list_filter = ("state", "product_name", "product_sku", "abacus_ssh_upload_done")
date_hierarchy = "created_at"
actions = [abacus_upload_order, sync_transaction_state, resend_payment_confirmation]
readonly_fields = [
"user",
"transaction_id",
"state",
"product_price",
"webhook_history",
]
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = (
"sku",
"name",
"price",
"description",
)