feat: add portal recharge page
This commit is contained in:
+52
-3
@@ -2,15 +2,21 @@ from django.contrib import messages
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
from django.db.models import Sum
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
from django.urls import reverse_lazy
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.views import View
|
||||
from django.views.generic import FormView, TemplateView
|
||||
|
||||
from apps.billing.payment_gateways import PaymentOrderCreateError
|
||||
from apps.billing.pricing import NoExchangeRateError
|
||||
from apps.billing.models import PointsLedger, RechargeOrder
|
||||
from apps.billing.services import get_balance_snapshot
|
||||
from apps.billing.services import (
|
||||
RechargeOrderCreateError,
|
||||
create_recharge_order,
|
||||
get_balance_snapshot,
|
||||
)
|
||||
from apps.users.models import ApiKey
|
||||
|
||||
from .forms import ApiKeyCreateForm
|
||||
from .forms import ApiKeyCreateForm, RechargeCreateForm
|
||||
|
||||
|
||||
NEW_API_KEY_SESSION_KEY = "portal_new_api_key"
|
||||
@@ -120,6 +126,49 @@ class ApiKeyDeleteView(LoginRequiredMixin, View):
|
||||
return redirect("portal-apikeys")
|
||||
|
||||
|
||||
class RechargePageView(LoginRequiredMixin, FormView):
|
||||
template_name = "portal/recharge.html"
|
||||
form_class = RechargeCreateForm
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
order_no = str(self.request.GET.get("order_no") or "").strip()
|
||||
current_order = None
|
||||
if order_no:
|
||||
current_order = RechargeOrder.objects.filter(
|
||||
user=self.request.user,
|
||||
order_no=order_no,
|
||||
).first()
|
||||
context["balance"] = get_balance_snapshot(self.request.user)
|
||||
context.update(get_portal_account_summary(self.request.user))
|
||||
context["current_order"] = current_order
|
||||
context["recent_recharge_orders"] = get_recharge_orders_for_user(
|
||||
self.request.user
|
||||
)[:5]
|
||||
return context
|
||||
|
||||
def form_valid(self, form):
|
||||
try:
|
||||
order = create_recharge_order(
|
||||
user=self.request.user,
|
||||
amount=form.cleaned_data["amount"],
|
||||
pay_method=form.cleaned_data["pay_method"],
|
||||
)
|
||||
except NoExchangeRateError:
|
||||
form.add_error(None, "未配置当前币种汇率,暂时无法充值。")
|
||||
return self.form_invalid(form)
|
||||
except RechargeOrderCreateError:
|
||||
form.add_error(None, "充值下单参数错误,请检查金额和支付方式。")
|
||||
return self.form_invalid(form)
|
||||
except PaymentOrderCreateError:
|
||||
form.add_error(None, "支付下单失败,请稍后重试。")
|
||||
return self.form_invalid(form)
|
||||
|
||||
messages.success(self.request, "充值订单已创建,请扫码支付。")
|
||||
recharge_url = reverse("portal-recharge")
|
||||
return redirect(f"{recharge_url}?order_no={order.order_no}")
|
||||
|
||||
|
||||
class RechargeRecordListView(LoginRequiredMixin, TemplateView):
|
||||
template_name = "portal/recharge_records.html"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user