aboutsummaryrefslogblamecommitdiffstats
path: root/alphabetlearning/payments/views.py
blob: dfbf8f13f11725aafc4541f88605f3d025a9dcda (plain) (tree)
1
2
3
4
5
6
7
8
9
             
                                    

                                                         


                                              

                                             
                                                    
 

                                                      
 



                                
 


                                                                        
                           








                                                                                                        
 















                                                          

                                                      



























                                                                                     
                             
                    
                                                                       
 
 




                                                                         
 



                                                                           

















                                                                                
























                                                                                                   
import stripe
from django.http import HttpResponse
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404
from django.shortcuts import redirect
from django.shortcuts import render
from django.views import View
from django.views.generic import TemplateView
from django.views.decorators.csrf import csrf_exempt

from alphabetlearning.resources.models import Resource
from alphabetlearning.users.models import User

from .models import CartItem
from .models import Price
from .models import Product
from .models import ShoppingCart

# TODO get the cart integrated with Stripe
# Steps to convert our Cart into something that can be used with Stripe:
#
#    - Sort out the webhook
#    - Associate each of our resources with a Product item
#        - this should be done in the create resource page
#        - or we can do it manually for the time being
#    - Check that we can add resources to the cart
#    - When the user hits the cart page, each associated product is pulled from the database
#    - prices are extracted from the products accordingly
#    - use the form from the landingpage.html as the checkout button to call the create-checkout-session
#    - Add delete buttons the checkout page, etc


stripe.api_key = settings.STRIPE_SECRET_KEY


class CreateCheckoutSessionView(View):
    def post(self, request, *args, **kwargs):
        price = Price.objects.get(id=self.kwargs["pk"])
        domain = "http://localhost:8000"
        checkout_session = stripe.checkout.Session.create(
            payment_method_types=["card"],
            line_items=[
                {
                    "price": price.stripe_price_id,
                    "quantity": 1,
                },
            ],
            mode="payment",
            success_url=domain + "/payments/success/",
            cancel_url=domain + "/payments/cancel/",
        )
        return redirect(checkout_session.url, code=303)


class SuccessView(TemplateView):
    template_name = "payments/success.html"


class CancelView(TemplateView):
    template_name = "payments/cancel.html"


class ProductLandingPageView(TemplateView):
    template_name = "payments/landingpage.html"

    def get_context_data(self, **kwargs):
        product = Product.objects.get(name="Worksheet 1")
        prices = Price.objects.filter(product=product)
        context = super(ProductLandingPageView, self).get_context_data(**kwargs)
        context.update({"product": product, "prices": prices})
        return context


@login_required
def add_to_cart(request, resource_id):
    resource = get_object_or_404(Resource, id=resource_id)
    cart, created = ShoppingCart.objects.get_or_create(user=request.user)
    cart_item, created = CartItem.objects.get_or_create(cart=cart, resource=resource)
    # cart_item.quantity += 1
    cart_item.save()
    return render(request, "payments/cart_detail.html", {"cart": cart})


@login_required
def cart_detail(request):
    cart, created = ShoppingCart.objects.get_or_create(user=request.user)
    return render(request, "payments/cart_detail.html", {"cart": cart})


# def cart_detail(request):
#     cart, created = ShoppingCart.objects.get_or_create(user=request.user)
#     return render(request, "payments/cart_detail.html", {"cart": cart})


@login_required
def checkout(request):
    cart = ShoppingCart.objects.get(user=request.user)
    total = sum(item.get_total_price() for item in cart.items.all())

    if request.method == "POST":
        # Create Stripe PaymentIntent
        intent = stripe.PaymentIntent.create(
            amount=int(total * 100),  # Stripe amount is in cents
            currency="usd",
            automatic_payment_methods={"enabled": True},
        )

        # Redirect to Stripe checkout or handle payment confirmation
        return render(request, "cart/checkout_success.html")

    return render(request, "cart/checkout.html", {"cart": cart, "total": total})


@csrf_exempt
def stripe_webhook(request):
    payload = request.body
    sig_header = request.META["HTTP_STRIPE_SIGNATURE"]
    event = None

    # verify that the request came from STRIPE
    try:
        event = stripe.Webhook.construct_event(payload, sig_header, settings.STRIPE_WEBHOOK_SECRET)
    except ValueError as e:
        return HttpResponse(status=400)
    except stripe.error.SignatureVerificationError as e:
        return HttpResponse(status=400)

    if event["type"] == "checkout.session.completed":
        session = event["data"]["object"]
        customer_email = session["customer_details"]["email"]
        payment_intent = session["payment_intent"]

        # TODO send an email to the customer
        print("Here we send an email to the customer")

    return HttpResponse(status=200)