Files
cmhub/config/client_subscription_policy.py

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",
"",
),
)