feat: add client subscription startup policy

This commit is contained in:
QiuSW
2026-07-28 15:14:48 +08:00
parent f0f34156da
commit 1c100c5d7e
15 changed files with 290 additions and 21 deletions
+19 -7
View File
@@ -1,5 +1,6 @@
import logging
from config.client_subscription_policy import get_client_subscription_policy
from django.http import HttpResponse
from django.utils import timezone
from django.utils.decorators import method_decorator
@@ -651,11 +652,12 @@ class MigrationRequestDetailView(ExternalApiView):
)
def _release_unpublished_response(platform: str) -> dict:
def _release_unpublished_response(platform: str, client_policy: dict) -> dict:
return {
"platform": platform,
"release": None,
"message": "暂未发布",
"client_policy": client_policy,
}
@@ -673,15 +675,18 @@ class ClientLatestReleaseView(APIView):
permission_classes = (AllowAny,)
def get(self, request):
client_policy = get_client_subscription_policy()
platform = (
request.query_params.get("platform")
or DownloadRelease.Platform.WINDOWS
).strip().lower()
if platform not in DownloadRelease.Platform.values:
return Response(
response = Response(
api_error("bad_request", "参数错误"),
status=status.HTTP_400_BAD_REQUEST,
)
response["Cache-Control"] = "no-store"
return response
release = (
DownloadRelease.objects.filter(platform=platform, is_current=True)
@@ -689,19 +694,23 @@ class ClientLatestReleaseView(APIView):
.first()
)
if release is None:
return Response(
_release_unpublished_response(platform),
response = Response(
_release_unpublished_response(platform, client_policy),
status=status.HTTP_200_OK,
)
response["Cache-Control"] = "no-store"
return response
download_url = _absolute_download_url(request, release)
if not download_url:
return Response(
_release_unpublished_response(platform),
response = Response(
_release_unpublished_response(platform, client_policy),
status=status.HTTP_200_OK,
)
response["Cache-Control"] = "no-store"
return response
return Response(
response = Response(
{
"platform": platform,
"release": {
@@ -713,9 +722,12 @@ class ClientLatestReleaseView(APIView):
"size_bytes": release.size_bytes,
"published_at": timezone.localtime(release.updated_at).isoformat(),
},
"client_policy": client_policy,
},
status=status.HTTP_200_OK,
)
response["Cache-Control"] = "no-store"
return response
class PortalSessionApiView(APIView):