fisk/core/views/base.py

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)