def process_subscription(payment): if payment.state != Payment.ACCEPTED: raise ValueError("Can not process not accepted payment") if payment.repeat: # Update existing subscription = Subscription.objects.get(payment=payment.repeat.pk) payment.start = subscription.expires subscription.expires += get_period_delta(payment.repeat.recurring) payment.end = subscription.expires subscription.save() elif isinstance(payment.extra["subscription"], int): subscription = Subscription.objects.get( pk=payment.extra["subscription"]) if subscription.payment: subscription.pastpayments_set.create(payment=subscription.payment) payment.start = subscription.expires subscription.expires += get_period_delta(subscription.get_repeat()) payment.end = subscription.expires subscription.payment = payment.pk subscription.save() else: user = User.objects.get(pk=payment.customer.user_id) package = Package.objects.get(name=payment.extra["subscription"]) # Calculate expiry repeat = package.get_repeat() if repeat: expires = timezone.now() payment.start = expires expires += get_period_delta(repeat) payment.end = expires else: expires = timezone.now() # Create new service = get_service(payment, user) subscription = Subscription.objects.create( service=service, payment=payment.pk, package=package.name, expires=expires, ) with override("en"): send_notification( "new_subscription", settings.NOTIFY_SUBSCRIPTION, subscription=subscription, service=subscription.service, ) if service.was_created and service.needs_token: subscription.send_notification("subscription_intro") # Flag payment as processed payment.state = Payment.PROCESSED payment.save() return subscription
def process_donation(payment): if payment.state != Payment.ACCEPTED: raise ValueError("Can not process not accepted payment") if payment.repeat: # Update existing donation = Donation.objects.get(payment=payment.repeat.pk) payment.start = donation.expires donation.expires += get_period_delta(payment.repeat.recurring) payment.end = donation.expires donation.save() elif "donation" in payment.extra: donation = Donation.objects.get(pk=payment.extra["donation"]) if donation.payment: donation.pastpayments_set.create(payment=donation.payment) payment.start = donation.expires donation.expires += get_period_delta(payment.recurring) payment.end = donation.expires donation.payment = payment.pk donation.save() else: user = User.objects.get(pk=payment.customer.user_id) reward = payment.extra.get("reward", 0) # Calculate expiry expires = timezone.now() if payment.recurring: payment.start = expires expires += get_period_delta(payment.recurring) payment.end = expires elif reward: payment.start = expires expires += get_period_delta("y") payment.end = expires # Create new donation = Donation.objects.create( user=user, payment=payment.pk, reward=int(reward), expires=expires, active=True, ) # Flag payment as processed payment.state = Payment.PROCESSED payment.save() return donation