Skip to content

Commit 6e98673

Browse files
committed
Add export actions to payment_requests and participations
1 parent 45bcbad commit 6e98673

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

Diff for: backend/participant/admin.py

+37-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from django.contrib import admin
22
from core.admin import ExportCSVMixin
3+
import csv
4+
from django.http import HttpResponse
35

46
from participant.models import *
57

@@ -16,18 +18,51 @@ def get_national_code(self, obj):
1618

1719

1820
@admin.register(Participation)
19-
class ParticipationAdmin(admin.ModelAdmin, ExportCSVMixin):
21+
class ParticipationAdmin(admin.ModelAdmin):
2022
list_display = ('participant', 'participant_email', 'plan')
2123
list_filter = ('plan', 'plan__event__order',)
2224
autocomplete_fields = ('participant', 'info',)
2325
search_fields = ('participant__user__email', 'participant__info__national_code',)
24-
actions = ["export_as_csv"]
26+
actions = ["export_data"]
2527

2628
def participant_email(self, obj):
2729
return obj.participant.user.email if obj.participant and obj.participant.user else ""
2830

2931
participant_email.short_description = "Email"
3032

33+
def export_data(self, request, queryset):
34+
meta = self.model._meta
35+
response = HttpResponse(content_type='text/csv')
36+
response['Content-Disposition'] = 'attachment; filename=participation_data.csv'
37+
writer = csv.writer(response)
38+
39+
headers = [
40+
'Participation Id',
41+
'Email',
42+
'First Name',
43+
'Last Name',
44+
'National Code',
45+
'Phone Number',
46+
'Plan'
47+
]
48+
writer.writerow(headers)
49+
50+
for obj in queryset:
51+
row = [
52+
obj.id if obj.id else '',
53+
obj.participant.user.email if obj.participant and obj.participant.user else '',
54+
obj.participant.info.first_name if obj.participant and obj.participant.info else '',
55+
obj.participant.info.last_name if obj.participant and obj.participant.info else '',
56+
obj.participant.info.national_code if obj.participant and obj.participant.info else '',
57+
obj.participant.info.phone_number if obj.participant and obj.participant.info else '',
58+
str(obj.plan) if obj.plan else ''
59+
]
60+
writer.writerow(row)
61+
62+
return response
63+
64+
export_data.short_description = "Export Registration Data As CSV"
65+
3166

3267
@admin.register(ParticipantInfo)
3368
class ParticipantInfoAdmin(admin.ModelAdmin):

Diff for: backend/payment/admin.py

+39-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from django.shortcuts import redirect, render
66
from django.urls import path
77
from core.admin import ExportCSVMixin
8+
from django.http import HttpResponse
89

910
from payment.models import PaymentDiscount, PaymentRequest
1011
from core.models import Event
@@ -53,7 +54,7 @@ def get_urls(self):
5354
class PaymentRequestAdmin(admin.ModelAdmin, ExportCSVMixin):
5455
list_display = ('participant', 'timestamp', 'paid', 'discount_code', 'order_id', 'base_price', 'paid_price')
5556
list_filter = ('paid', 'discount__code')
56-
actions = ["export_as_csv"]
57+
actions = ["export_as_csv", "calculate_discount_usage"]
5758

5859
def base_price(self, obj):
5960
return obj.get_price()[0]
@@ -64,4 +65,41 @@ def paid_price(self, obj):
6465
def discount_code(self, obj):
6566
return obj.discount.code if obj.discount is not None else None
6667

68+
def calculate_discount_usage(self, request, queryset):
69+
response = HttpResponse(content_type='text/csv')
70+
response['Content-Disposition'] = 'attachment; filename=discount_usage.csv'
71+
writer = csv.writer(response)
72+
73+
headers = [
74+
'Discount Code',
75+
'Event',
76+
'Total Usage',
77+
'Successful Payments'
78+
]
79+
writer.writerow(headers)
80+
81+
discount_codes = PaymentDiscount.objects.filter(
82+
paymentrequest__in=queryset
83+
).distinct()
84+
85+
for discount in discount_codes:
86+
total_usage = queryset.filter(discount=discount).count()
87+
88+
successful_payments = queryset.filter(
89+
discount=discount,
90+
paid=True
91+
).count()
92+
93+
row = [
94+
discount.code,
95+
str(discount.event) if discount.event else 'No Event',
96+
total_usage,
97+
successful_payments
98+
]
99+
writer.writerow(row)
100+
101+
return response
102+
103+
calculate_discount_usage.short_description = "Calculate Discount Code Usage"
104+
67105
admin.site.register(PaymentRequest, PaymentRequestAdmin)

0 commit comments

Comments
 (0)