import pprint import stripe from django.conf import settings from django.contrib.auth.mixins import LoginRequiredMixin from django.http import JsonResponse from django.shortcuts import redirect, render from django.urls import reverse, reverse_lazy from django.views import View from django.views.generic.edit import CreateView from core.forms import NewUserForm from core.lib.products import assemble_plan_map from core.models import Plan, Session pp = pprint.PrettyPrinter(indent=4) # Create your views here class Home(View): template_name = "index.html" def get(self, request): return render(request, self.template_name) class Billing(LoginRequiredMixin, View): template_name = "billing.html" def get(self, request): context = {"plans": Plan.objects.all(), "user_plans": request.user.plans.all()} return render(request, self.template_name, context) class Order(LoginRequiredMixin, View): def get(self, request, plan_name): plan = Plan.objects.get(name=plan_name) try: session = stripe.checkout.Session.create( payment_method_types=settings.ALLOWED_PAYMENT_METHODS, mode="subscription", customer=request.user.stripe_id, line_items=assemble_plan_map(product_id_filter=plan.product_id), success_url=request.build_absolute_uri(reverse("success")), cancel_url=request.build_absolute_uri(reverse("cancel")), ) Session.objects.create(user=request.user, session=session.id) return redirect(session.url) # return JsonResponse({'id': session.id}) except Exception as e: # Raise a server error return JsonResponse({"error": str(e)}, status=500) class Signup(CreateView): form_class = NewUserForm success_url = reverse_lazy("login") template_name = "registration/signup.html" class Portal(LoginRequiredMixin, View): def get(self, request): session = stripe.billing_portal.Session.create( customer=request.user.stripe_id, return_url=request.build_absolute_uri(reverse("billing")), ) return redirect(session.url)