52 lines
2.2 KiB
Python
52 lines
2.2 KiB
Python
|
from django.core.management.base import BaseCommand
|
||
|
|
||
|
from nosystem.models import DonatorStatus, Donation
|
||
|
from datetime import datetime
|
||
|
|
||
|
from utils.stripe_utils import StripeUtils
|
||
|
from .forms import DonationForm
|
||
|
|
||
|
|
||
|
class Command(BaseCommand):
|
||
|
help = 'Make the monthly stripe charge to all donators'
|
||
|
|
||
|
def handle(self, *args, **options):
|
||
|
donators = DonatorStatus.objects.filter(status=DonatorStatus.ACTIVE)
|
||
|
current_month = datetime.now().month
|
||
|
current_year = datetime.now().year
|
||
|
for donator in donators:
|
||
|
current_month_donation = Donation.objects.get(created_at__month=current_month,
|
||
|
created_at__year=current_year)
|
||
|
if not current_month_donation:
|
||
|
last_donation = Donation.objects.filter(donator=donator).last()
|
||
|
|
||
|
donation_amount = last_donation.donation
|
||
|
# Make stripe charge to a customer
|
||
|
stripe_utils = StripeUtils()
|
||
|
stripe_utils.CURRENCY = 'usd'
|
||
|
charge_response = stripe_utils.make_charge(amount=donation_amount,
|
||
|
customer=donator.stripe_id)
|
||
|
charge = charge_response.get('response_object')
|
||
|
|
||
|
# Check if the payment was approved
|
||
|
if not charge:
|
||
|
# TODO save error
|
||
|
context = {
|
||
|
'paymentError': charge_response.get('error'),
|
||
|
}
|
||
|
print(context)
|
||
|
# Create a donation
|
||
|
charge = charge_response.get('response_object')
|
||
|
donation_data = {
|
||
|
'cc_brand': charge.source.brand,
|
||
|
'stripe_charge_id': charge.id,
|
||
|
'last4': charge.source.last4,
|
||
|
'billing_address': last_donation.billing_address.id,
|
||
|
'donator': donator.id,
|
||
|
'donation': donation_amount
|
||
|
}
|
||
|
donation_form = DonationForm(donation_data)
|
||
|
if donation_form.is_valid():
|
||
|
donation = donation_form.save()
|
||
|
print(donation)
|