You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
4.2 KiB
Python

import logging
import stripe
from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin
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
# from core.lib import billing
from core.lib.notify import raw_sendmsg
logger = logging.getLogger(__name__)
# Create your views here
class Home(LoginRequiredMixin, 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):
if not settings.BILLING_ENABLED:
return redirect(reverse("home"))
return render(request, self.template_name)
# class Order(LoginRequiredMixin, View):
# async def get(self, request, plan_name):
# if not settings.STRIPE_ENABLED:
# return redirect(reverse("home"))
# plan = Plan.objects.get(name=plan_name)
# try:
# cast = {
# "payment_method_types": settings.ALLOWED_PAYMENT_METHODS,
# "mode": "subscription",
# "customer": request.user.stripe_id,
# "line_items": await 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")),
# }
# if request.user.is_superuser:
# cast["discounts"] = [{"coupon": settings.STRIPE_ADMIN_COUPON}]
# session = stripe.checkout.Session.create(**cast)
# await Session.objects.acreate(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 Cancel(LoginRequiredMixin, View):
# async def get(self, request, plan_name):
# if not settings.STRIPE_ENABLED:
# return redirect(reverse("home"))
# 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("two_factor:login")
template_name = "registration/signup.html"
def form_valid(self, form):
"""If the form is valid, save the associated model."""
self.object = form.save()
raw_sendmsg(
f"New user signup: {self.object.username} - {self.object.email}",
title="New user",
topic=settings.NOTIFY_TOPIC,
)
return super().form_valid(form)
def get(self, request, *args, **kwargs):
if not settings.REGISTRATION_OPEN:
return render(request, "registration/registration_closed.html")
return super().get(request, *args, **kwargs)
class Portal(LoginRequiredMixin, View):
def get(self, request):
if not settings.BILLING_ENABLED:
return redirect(reverse("home"))
session = stripe.billing_portal.Session.create(
customer=request.user.stripe_id,
return_url=request.build_absolute_uri(reverse("billing")),
)
return redirect(session.url)