From 16d5412ba03cae88b4727aa909e1cbbca64bfed2 Mon Sep 17 00:00:00 2001 From: Stefan Wehrmeyer Date: Tue, 11 Mar 2025 12:03:14 +0100 Subject: [PATCH] Add deferred donation admin view --- fragdenstaat_de/fds_donation/admin.py | 82 +++++++++++++++++++ .../migrations/0049_deferreddonation.py | 26 ++++++ fragdenstaat_de/fds_donation/models.py | 7 ++ 3 files changed, 115 insertions(+) create mode 100644 fragdenstaat_de/fds_donation/migrations/0049_deferreddonation.py diff --git a/fragdenstaat_de/fds_donation/admin.py b/fragdenstaat_de/fds_donation/admin.py index 13c1a60a6..c722c1d07 100644 --- a/fragdenstaat_de/fds_donation/admin.py +++ b/fragdenstaat_de/fds_donation/admin.py @@ -19,6 +19,7 @@ from django.utils.translation import gettext_lazy as _ from adminsortable2.admin import SortableAdminMixin +from froide_payment.models import PaymentStatus from froide.helper.admin_utils import ( ForeignKeyFilter, @@ -40,6 +41,7 @@ from .models import ( DONATION_PROJECTS, DefaultDonation, + DeferredDonation, Donation, DonationGift, DonationGiftOrder, @@ -955,3 +957,83 @@ class DefaultDonationAdmin(DonationAdmin): admin.site.register(DonationGiftOrder, DonationGiftOrderAdmin) admin.site.register(DonorTag, DonorTagAdmin) admin.site.register(DefaultDonation, DefaultDonationAdmin) + + +class DeferredDonationAdmin(admin.ModelAdmin): + list_display = ( + "timestamp", + "amount", + "donor_details", + "number", + "donor_email_confirmed", + "payment_fraud_message", + "payment_details", + "project", + "purpose", + "method", + "reference", + "keyword", + ) + + actions = ["confirm", "cancel"] + + def get_queryset(self, request): + return ( + super() + .get_queryset(request) + .filter(payment__status=PaymentStatus.DEFERRED) + .select_related("payment", "donor") + ) + + def donor_details(self, obj): + return str(obj.donor) + + donor_details.short_description = _("Donor") + donor_details.admin_order_field = Concat( + "donor__first_name", Value(" "), "donor__last_name" + ) + + def donor_email_confirmed(self, obj): + return obj.donor.email_confirmed + + donor_email_confirmed.short_description = _("Email confirmed") + + def payment_fraud_message(self, obj): + return obj.payment.fraud_message + + payment_fraud_message.short_description = _("Suspicious") + + def payment_fraud_message(self, obj): + return obj.payment.fraud_message + + payment_fraud_message.short_description = _("Suspicious") + + def payment_details(self, obj): + try: + iban = obj.payment.attrs.iban + except AttributeError: + iban = "n/a" + iban = iban[:4] + return "IBAN[4]: {iban}, IP: {ip}".format( + iban=iban, + ip=obj.payment.customer_ip_address, + ) + + payment_details.short_description = _("Payment details") + + @admin.action(description=_("✅ Confirm donations")) + def confirm(self, request, queryset): + for donation in queryset: + obj = donation.payment + provider = obj.get_provider() + provider.confirm_payment(obj) + + @admin.action(description=_("❌ Cancel donations")) + def cancel(self, request, queryset): + for donation in queryset: + obj = donation.payment + provider = obj.get_provider() + provider.cancel_payment(obj) + + +admin.site.register(DeferredDonation, DeferredDonationAdmin) diff --git a/fragdenstaat_de/fds_donation/migrations/0049_deferreddonation.py b/fragdenstaat_de/fds_donation/migrations/0049_deferreddonation.py new file mode 100644 index 000000000..a4d2ddd7f --- /dev/null +++ b/fragdenstaat_de/fds_donation/migrations/0049_deferreddonation.py @@ -0,0 +1,26 @@ +# Generated by Django 4.2.16 on 2025-03-11 10:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('fds_donation', '0048_alter_donationformcmsplugin_next_url'), + ] + + operations = [ + migrations.CreateModel( + name='DeferredDonation', + fields=[ + ], + options={ + 'verbose_name': 'Deferred Donation', + 'verbose_name_plural': 'Deferred Donation', + 'proxy': True, + 'indexes': [], + 'constraints': [], + }, + bases=('fds_donation.donation',), + ), + ] diff --git a/fragdenstaat_de/fds_donation/models.py b/fragdenstaat_de/fds_donation/models.py index afe81e4fb..fd62e47a2 100644 --- a/fragdenstaat_de/fds_donation/models.py +++ b/fragdenstaat_de/fds_donation/models.py @@ -426,6 +426,13 @@ class Meta: verbose_name_plural = "FragDenStaat Spenden" +class DeferredDonation(Donation): + class Meta: + proxy = True + verbose_name = _("Deferred Donation") + verbose_name_plural = _("Deferred Donation") + + class DonationGift(models.Model): name = models.CharField(max_length=255) description = models.TextField(blank=True)