envelope/core/views/base.py

106 lines
3.8 KiB
Python
Raw Normal View History

2022-10-12 06:22:22 +00:00
import logging
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
logger = logging.getLogger(__name__)
# Create your views here
class Home(View):
template_name = "index.html"
2022-11-29 07:20:39 +00:00
def get(self, request):
2022-10-12 06:22:22 +00:00
return render(request, self.template_name)
class Billing(LoginRequiredMixin, View):
template_name = "billing.html"
2022-11-29 07:20:39 +00:00
def get(self, request):
2022-10-13 17:20:30 +00:00
if not settings.STRIPE_ENABLED:
return redirect(reverse("home"))
2022-11-29 07:20:39 +00:00
plans = Plan.objects.all()
user_plans = request.user.plans.all()
context = {"plans": plans, "user_plans": user_plans}
2022-10-12 06:22:22 +00:00
return render(request, self.template_name, context)
class Order(LoginRequiredMixin, View):
2022-11-29 07:20:39 +00:00
def get(self, request, plan_name):
2022-10-13 17:20:30 +00:00
if not settings.STRIPE_ENABLED:
return redirect(reverse("home"))
2022-10-12 06:22:22 +00:00
plan = Plan.objects.get(name=plan_name)
try:
cast = {
"payment_method_types": settings.ALLOWED_PAYMENT_METHODS,
"mode": "subscription",
"customer": request.user.stripe_id,
2022-11-29 07:20:39 +00:00
"line_items": assemble_plan_map(product_id_filter=plan.product_id),
2022-10-12 06:22:22 +00:00
"success_url": request.build_absolute_uri(reverse("success")),
"cancel_url": request.build_absolute_uri(reverse("cancel")),
}
if request.user.is_superuser:
cast["discounts"] = [{"coupon": settings.STRIPE_ADMIN_COUPON}]
session = stripe.checkout.Session.create(**cast)
2022-11-29 07:20:39 +00:00
Session.objects.create(user=request.user, session=session.id)
2022-10-12 06:22:22 +00:00
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 Cancel(LoginRequiredMixin, View):
2022-11-29 07:20:39 +00:00
def get(self, request, plan_name):
2022-10-13 17:20:30 +00:00
if not settings.STRIPE_ENABLED:
return redirect(reverse("home"))
2022-10-12 06:22:22 +00:00
plan = Plan.objects.get(name=plan_name)
try:
subscriptions = stripe.Subscription.list(
customer=request.user.stripe_id, price=plan.product_id
)
for subscription in subscriptions["data"]:
items = subscription["items"]["data"]
for item in items:
stripe.Subscription.delete(item["subscription"])
return render(request, "subscriptioncancel.html", {"plan": plan})
# return JsonResponse({'id': session.id})
except Exception as e:
# Raise a server error
logging.error(f"Error cancelling subscription for user: {e}")
return JsonResponse({"error": "True"}, status=500)
class Signup(CreateView):
form_class = NewUserForm
success_url = reverse_lazy("login")
template_name = "registration/signup.html"
def get(self, request, *args, **kwargs):
if not settings.REGISTRATION_OPEN:
return render(request, "registration/registration_closed.html")
super().get(request, *args, **kwargs)
2022-10-12 06:22:22 +00:00
2022-11-03 07:20:30 +00:00
2022-10-12 06:22:22 +00:00
class Portal(LoginRequiredMixin, View):
2022-11-29 07:20:39 +00:00
def get(self, request):
2022-10-13 17:20:30 +00:00
if not settings.STRIPE_ENABLED:
return redirect(reverse("home"))
2022-10-12 06:22:22 +00:00
session = stripe.billing_portal.Session.create(
customer=request.user.stripe_id,
return_url=request.build_absolute_uri(reverse("billing")),
)
return redirect(session.url)