snapshot: preserve trial lifecycle and product-grade expiry UX
This commit is contained in:
@@ -5,9 +5,10 @@ from email.utils import formataddr
|
||||
|
||||
from django.conf import settings
|
||||
from django.templatetags.static import static
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import get_language
|
||||
|
||||
from .models import PortalBranding, PortalCompanyConfig
|
||||
from .models import PortalBranding, PortalCompanyConfig, PortalTrialConfig
|
||||
|
||||
|
||||
def get_portal_branding() -> PortalBranding:
|
||||
@@ -52,6 +53,58 @@ def get_portal_company_config() -> PortalCompanyConfig:
|
||||
return company_config
|
||||
|
||||
|
||||
def get_portal_trial_config() -> PortalTrialConfig:
|
||||
trial_config, _ = PortalTrialConfig.objects.get_or_create(
|
||||
name='Default',
|
||||
defaults={
|
||||
'is_trial_mode': False,
|
||||
'restrict_production_integrations': True,
|
||||
'auto_cleanup_enabled': True,
|
||||
'trial_banner_text': '',
|
||||
'trial_banner_text_en': '',
|
||||
},
|
||||
)
|
||||
return trial_config
|
||||
|
||||
|
||||
def is_trial_mode_enabled() -> bool:
|
||||
return bool(get_portal_trial_config().is_trial_mode)
|
||||
|
||||
|
||||
def is_trial_expired() -> bool:
|
||||
trial_config = get_portal_trial_config()
|
||||
if not trial_config.is_trial_mode or not trial_config.trial_expires_at:
|
||||
return False
|
||||
return timezone.now() >= trial_config.trial_expires_at
|
||||
|
||||
|
||||
def should_restrict_trial_integrations() -> bool:
|
||||
trial_config = get_portal_trial_config()
|
||||
return bool(trial_config.is_trial_mode and trial_config.restrict_production_integrations)
|
||||
|
||||
|
||||
def get_trial_context() -> dict[str, object]:
|
||||
trial_config = get_portal_trial_config()
|
||||
lang = (get_language() or 'de').split('-')[0]
|
||||
banner_text = ((trial_config.trial_banner_text_en or '').strip() if lang == 'en' else '') or (trial_config.trial_banner_text or '').strip()
|
||||
expired = is_trial_expired()
|
||||
days_remaining = None
|
||||
if trial_config.is_trial_mode and trial_config.trial_expires_at:
|
||||
delta = timezone.localtime(trial_config.trial_expires_at) - timezone.localtime(timezone.now())
|
||||
days_remaining = max(0, delta.days + (1 if delta.seconds > 0 else 0))
|
||||
return {
|
||||
'portal_trial_config': trial_config,
|
||||
'portal_trial_enabled': bool(trial_config.is_trial_mode),
|
||||
'portal_trial_expired': expired,
|
||||
'portal_trial_started_at': trial_config.trial_started_at,
|
||||
'portal_trial_expires_at': trial_config.trial_expires_at,
|
||||
'portal_trial_days_remaining': days_remaining,
|
||||
'portal_trial_banner_text': banner_text,
|
||||
'portal_trial_restrict_integrations': bool(trial_config.is_trial_mode and trial_config.restrict_production_integrations),
|
||||
'portal_trial_cleanup_enabled': bool(trial_config.auto_cleanup_enabled),
|
||||
}
|
||||
|
||||
|
||||
def get_company_email_domain() -> str:
|
||||
branding = get_portal_branding()
|
||||
domain = (branding.company_domain or '').strip().lower().lstrip('@')
|
||||
|
||||
Reference in New Issue
Block a user