@@ -51,10 +51,14 @@ def get_urls(self):
51
51
52
52
admin .site .register (PaymentDiscount , PaymentDiscountAdmin )
53
53
54
+ class DiscountCodesImportForm (forms .Form ):
55
+ file = forms .FileField ()
56
+
54
57
class PaymentRequestAdmin (admin .ModelAdmin , ExportCSVMixin ):
55
58
list_display = ('participant' , 'timestamp' , 'paid' , 'discount_code' , 'order_id' , 'base_price' , 'paid_price' )
56
59
list_filter = ('paid' , 'discount__code' )
57
60
actions = ["export_as_csv" , "calculate_discount_usage" ]
61
+ change_list_template = "payment_request_changelist.html"
58
62
59
63
def base_price (self , obj ):
60
64
return obj .get_price ()[0 ]
@@ -102,4 +106,57 @@ def calculate_discount_usage(self, request, queryset):
102
106
103
107
calculate_discount_usage .short_description = "Calculate Discount Code Usage"
104
108
109
+ def import_discount_codes (self , request ):
110
+ if request .method == 'POST' :
111
+ file = request .FILES ["file" ]
112
+ content = file .read ().decode ('utf-8' )
113
+ discount_codes = [code .strip () for code in content .split ('\n ' ) if code .strip ()]
114
+
115
+ response = HttpResponse (content_type = 'text/csv' )
116
+ response ['Content-Disposition' ] = 'attachment; filename=discount_usage_report.csv'
117
+ writer = csv .writer (response )
118
+
119
+ headers = [
120
+ 'Discount Code' ,
121
+ 'Event' ,
122
+ 'Total Usage' ,
123
+ 'Successful Payments'
124
+ ]
125
+ writer .writerow (headers )
126
+
127
+ for code in discount_codes :
128
+ try :
129
+ discount = PaymentDiscount .objects .get (code = code )
130
+ total_usage = PaymentRequest .objects .filter (discount = discount ).count ()
131
+ successful_payments = PaymentRequest .objects .filter (
132
+ discount = discount ,
133
+ paid = True
134
+ ).count ()
135
+
136
+ row = [
137
+ discount .code ,
138
+ str (discount .event ) if discount .event else 'No Event' ,
139
+ total_usage ,
140
+ successful_payments
141
+ ]
142
+ writer .writerow (row )
143
+ except PaymentDiscount .DoesNotExist :
144
+ row = [code , 'Not Found' , 0 , 0 ]
145
+ writer .writerow (row )
146
+
147
+ return response
148
+
149
+ form = DiscountCodesImportForm ()
150
+ payload = {"form" : form }
151
+ return render (
152
+ request , "csv_form.html" , payload
153
+ )
154
+
155
+ def get_urls (self ):
156
+ urls = super ().get_urls ()
157
+ my_urls = [
158
+ path ('import-discount-codes/' , self .import_discount_codes ),
159
+ ]
160
+ return my_urls + urls
161
+
105
162
admin .site .register (PaymentRequest , PaymentRequestAdmin )
0 commit comments