feat: add software subscription orders

This commit is contained in:
QiuSW
2026-07-21 11:52:49 +08:00
parent 341864dc70
commit bc9d1aa0f7
25 changed files with 1179 additions and 47 deletions
+48 -2
View File
@@ -18,14 +18,16 @@ from apps.billing.services import (
get_balance_snapshot,
)
from apps.users.models import ApiKey
from apps.licensing.models import DeviceCredential, MigrationRequest
from apps.licensing.models import DeviceCredential, MigrationRequest, SoftwareEntitlement, SoftwareOrder
from apps.licensing.services import (
LicensingError,
SoftwareOrderError,
confirm_migration_request,
create_software_order,
revoke_device_credential,
)
from .forms import ApiKeyCreateForm, RechargeCreateForm
from .forms import ApiKeyCreateForm, RechargeCreateForm, SoftwareOrderCreateForm
from .models import DownloadRelease, ImportTemplate
@@ -250,6 +252,50 @@ class RechargePageView(LoginRequiredMixin, FormView):
return redirect(f"{recharge_url}?order_no={order.order_no}")
class SubscriptionPageView(LoginRequiredMixin, FormView):
template_name = "portal/subscription.html"
form_class = SoftwareOrderCreateForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
order_no = str(self.request.GET.get("order_no") or "").strip()
context["current_order"] = SoftwareOrder.objects.filter(
user=self.request.user,
order_no=order_no,
).first() if order_no else None
context["entitlement"] = (
SoftwareEntitlement.objects.filter(
user=self.request.user,
product_code="cmshopee",
)
.order_by("-expires_at", "-id")
.first()
)
context["recent_orders"] = SoftwareOrder.objects.filter(
user=self.request.user,
product_code="cmshopee",
).order_by("-created_at", "-id")[:10]
context["is_mock_payment_mode"] = payment_callback_mode() == "mock"
return context
def form_valid(self, form):
try:
order = create_software_order(
user=self.request.user,
plan=form.cleaned_data["plan"],
pay_method=form.cleaned_data["pay_method"],
)
except SoftwareOrderError as exc:
form.add_error(None, exc.message)
return self.form_invalid(form)
except PaymentOrderCreateError:
form.add_error(None, "支付下单失败,请稍后重试。")
return self.form_invalid(form)
messages.success(self.request, "软件订阅订单已创建,请扫码支付。")
subscription_url = reverse("portal-subscription")
return redirect(f"{subscription_url}?order_no={order.order_no}")
class MigrationConfirmView(LoginRequiredMixin, TemplateView):
template_name = "portal/migration_confirm.html"