feat: add client subscription startup policy
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
"""Configuration-only policy published to supported cmshopee clients."""
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.utils.dateparse import parse_datetime
|
||||
from django.utils.timezone import is_aware
|
||||
|
||||
|
||||
CLIENT_SUBSCRIPTION_POLICY_VERSION = 1
|
||||
CLIENT_SUBSCRIPTION_POLICY_MODES = frozenset({"off", "observe", "enforce"})
|
||||
DEFAULT_CLIENT_SUBSCRIPTION_POLICY_UPDATED_AT = "2026-07-28T00:00:00+08:00"
|
||||
|
||||
|
||||
def build_client_subscription_policy(*, mode, updated_at) -> dict:
|
||||
normalized_mode = str(mode or "").strip().lower()
|
||||
if normalized_mode not in CLIENT_SUBSCRIPTION_POLICY_MODES:
|
||||
raise ImproperlyConfigured(
|
||||
"CMSHOPEE_CLIENT_SUBSCRIPTION_POLICY must be one of: "
|
||||
"off, observe, enforce"
|
||||
)
|
||||
|
||||
if isinstance(updated_at, datetime):
|
||||
parsed_updated_at = updated_at
|
||||
else:
|
||||
raw_updated_at = str(updated_at or "").strip()
|
||||
if not raw_updated_at:
|
||||
if normalized_mode != "off":
|
||||
raise ImproperlyConfigured(
|
||||
"CMSHOPEE_CLIENT_SUBSCRIPTION_POLICY_UPDATED_AT is required "
|
||||
"when CMSHOPEE_CLIENT_SUBSCRIPTION_POLICY is observe or enforce"
|
||||
)
|
||||
raw_updated_at = DEFAULT_CLIENT_SUBSCRIPTION_POLICY_UPDATED_AT
|
||||
if "T" not in raw_updated_at:
|
||||
raise ImproperlyConfigured(
|
||||
"CMSHOPEE_CLIENT_SUBSCRIPTION_POLICY_UPDATED_AT must be an "
|
||||
"ISO 8601 datetime with timezone"
|
||||
)
|
||||
parsed_updated_at = parse_datetime(raw_updated_at)
|
||||
|
||||
if parsed_updated_at is None or not is_aware(parsed_updated_at):
|
||||
raise ImproperlyConfigured(
|
||||
"CMSHOPEE_CLIENT_SUBSCRIPTION_POLICY_UPDATED_AT must be an "
|
||||
"ISO 8601 datetime with timezone"
|
||||
)
|
||||
|
||||
return {
|
||||
"policy_version": CLIENT_SUBSCRIPTION_POLICY_VERSION,
|
||||
"subscription_check_enabled": normalized_mode != "off",
|
||||
"subscription_enforcement_enabled": normalized_mode == "enforce",
|
||||
"updated_at": parsed_updated_at.isoformat(),
|
||||
}
|
||||
|
||||
|
||||
def get_client_subscription_policy() -> dict:
|
||||
return build_client_subscription_policy(
|
||||
mode=getattr(settings, "CMSHOPEE_CLIENT_SUBSCRIPTION_POLICY", "off"),
|
||||
updated_at=getattr(
|
||||
settings,
|
||||
"CMSHOPEE_CLIENT_SUBSCRIPTION_POLICY_UPDATED_AT",
|
||||
"",
|
||||
),
|
||||
)
|
||||
Reference in New Issue
Block a user