feat: add staged subscription rollout mode

This commit is contained in:
QiuSW
2026-07-22 15:13:28 +08:00
parent e3b90ccea5
commit 2604a59d67
17 changed files with 551 additions and 87 deletions
+15 -11
View File
@@ -1,7 +1,6 @@
import logging
from django.http import HttpResponse
from django.conf import settings
from django.utils import timezone
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
@@ -79,7 +78,7 @@ from apps.licensing.services import (
create_migration_request,
expire_software_order,
query_and_apply_software_payment,
evaluate_account_authorization,
evaluate_subscription_access,
software_subscription_status,
record_device_heartbeat,
register_device,
@@ -391,7 +390,7 @@ class GenerateImageTaskDetailView(ExternalApiView):
return Response(task_detail_response(task), status=status.HTTP_200_OK)
class CmshopeeShadowAuthorizationMixin:
class CmshopeeSubscriptionAuthorizationMixin:
product_code = "cmshopee"
def optional_client_device(self, request):
@@ -403,7 +402,7 @@ class CmshopeeShadowAuthorizationMixin:
request.headers.get("X-Device-Session", "").strip()
)
device = None
decision = evaluate_account_authorization(
decision = evaluate_subscription_access(
user=request.user,
product_code=self.product_code,
)
@@ -412,9 +411,14 @@ class CmshopeeShadowAuthorizationMixin:
"product_code": self.product_code,
"user_id": request.user.id,
"client_device_id": getattr(device, "id", None),
"would_reject": decision.would_reject,
"would_reject_code": decision.code,
"enforcement": settings.CMSHOPEE_SUBSCRIPTION_ENFORCEMENT,
"would_reject": bool(decision.entitlement_code),
"would_reject_code": decision.entitlement_code,
"final_allowed": decision.allowed,
"final_code": decision.code,
"subscription_mode": decision.mode,
"access_source": decision.access_source,
"entitlement_status": decision.entitlement_status,
"enforcement": decision.mode == "enforce",
}
authorization_logger.info(
"%s %s",
@@ -422,7 +426,7 @@ class CmshopeeShadowAuthorizationMixin:
event,
extra={"cmshopee_authorization": event},
)
if settings.CMSHOPEE_SUBSCRIPTION_ENFORCEMENT and decision.would_reject:
if decision.would_reject:
message = (
"当前账号没有有效的软件订阅"
if decision.code == "subscription_required"
@@ -433,16 +437,16 @@ class CmshopeeShadowAuthorizationMixin:
return device
class CmshopeeGenerateTitleView(CmshopeeShadowAuthorizationMixin, GenerateTitleView):
class CmshopeeGenerateTitleView(CmshopeeSubscriptionAuthorizationMixin, GenerateTitleView):
pass
class CmshopeeAnalyzeImagesView(CmshopeeShadowAuthorizationMixin, AnalyzeImagesView):
class CmshopeeAnalyzeImagesView(CmshopeeSubscriptionAuthorizationMixin, AnalyzeImagesView):
pass
class CmshopeeGenerateImageTaskSubmitView(
CmshopeeShadowAuthorizationMixin,
CmshopeeSubscriptionAuthorizationMixin,
GenerateImageTaskSubmitView,
):
pass