dynamicweb/nosystemd/management/commands/make_donation_charges.py

90 lines
4 KiB
Python

from django.core.management.base import BaseCommand
from datetime import datetime
from utils.stripe_utils import StripeUtils
from utils.mailer import BaseEmail
from nosystemd.models import DonatorStatus, Donation
from nosystemd.forms import DonationForm
class Command(BaseCommand):
help = 'Make the monthly stripe charge to all donators'
CURRENCY = 'usd'
def handle(self, *args, **options):
donators = DonatorStatus.objects.filter(status=DonatorStatus.ACTIVE)
current_month = datetime.now().month
current_year = datetime.now().year
print("--------- STARTING DONATIONS SCRIPT ---------")
print("Donations date: %s-%s" % (current_month, current_year))
for donator_status in donators:
donator = donator_status.user.stripecustomer
try:
Donation.objects.get(created_at__month=current_month,
created_at__year=current_year,
donator=donator)
except Donation.DoesNotExist:
try:
# Get donator last donation amount
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 = self.CURRENCY
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:
# There is an error trying to creating the stripe charge
context = {
'paymentError': charge_response.get('error'),
}
print("--------- STRIPE PAYMENT ERROR ---------")
print(context)
print("-------------------------")
continue
# 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()
context = {
'donation': donation,
'base_url': "{0}://{1}".format('https', 'dynamicweb.ungleich.ch')
}
email_data = {
'subject': 'Your donation have been charged',
'to': donation.donator.user.email,
'context': context,
'template_name': 'donation_charge',
'template_path': 'nosystemd/emails/'
}
email = BaseEmail(**email_data)
email.send()
print("--------- PAYMENT DONATION SUCCESSFULL ---------")
print("Donator: %s" % donation.donator.user.email)
print("Amount: %s %s" % (donation.donation, self.CURRENCY))
print("-----------------------------------------------")
except Exception as e:
print("--------- ERROR ---------")
print(e)
print("-------------------------")
continue