65 lines
2.4 KiB
Python
65 lines
2.4 KiB
Python
"""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",
|
|
"",
|
|
),
|
|
)
|