Unify commercial runtime ownership across backend and frontend so platform, experience, and hospitality modules use the shared commercial source of truth. Co-authored-by: Cursor <cursoragent@cursor.com>
148 lines
4.9 KiB
Python
148 lines
4.9 KiB
Python
#!/usr/bin/env python3
|
|
"""Seed demo Experience (Torbat Pages) data via service layer.
|
|
|
|
Run from repo root:
|
|
cd backend/services/experience
|
|
set AUTH_REQUIRED=false
|
|
set EXPERIENCE_SEED_TENANT_ID=<your-tenant-uuid>
|
|
python scripts/seed_experience.py
|
|
|
|
Or with PYTHONPATH:
|
|
set PYTHONPATH=backend/services/experience;backend
|
|
python backend/services/experience/scripts/seed_experience.py
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
import os
|
|
import sys
|
|
import uuid
|
|
|
|
# Allow running without installing package
|
|
_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
|
if _ROOT not in sys.path:
|
|
sys.path.insert(0, _ROOT)
|
|
_BACKEND = os.path.abspath(os.path.join(_ROOT, "..", ".."))
|
|
if _BACKEND not in sys.path:
|
|
sys.path.insert(0, _BACKEND)
|
|
_SHARED = os.path.join(_BACKEND, "shared-lib")
|
|
if os.path.isdir(_SHARED) and _SHARED not in sys.path:
|
|
sys.path.insert(0, _SHARED)
|
|
|
|
os.environ.setdefault("AUTH_REQUIRED", "false")
|
|
|
|
from app.core.database import AsyncSessionLocal # noqa: E402
|
|
from app.models.types import LifecycleStatus, PageType, PublishStatus # noqa: E402
|
|
from app.schemas.foundation import ExperienceWorkspaceCreate # noqa: E402
|
|
from app.schemas.forms import ExperienceFormCreate # noqa: E402
|
|
from app.schemas.sites import ExperiencePageCreate, ExperienceSiteCreate # noqa: E402
|
|
from app.schemas.templates import ExperienceTemplateCreate # noqa: E402
|
|
from app.services.foundation import ExperienceWorkspaceService # noqa: E402
|
|
from app.services.forms import ExperienceFormService # noqa: E402
|
|
from app.services.sites import ExperiencePageService, ExperienceSiteService # noqa: E402
|
|
from app.services.templates import ExperienceTemplateService # noqa: E402
|
|
from shared.security import CurrentUser # noqa: E402
|
|
|
|
|
|
def _actor() -> CurrentUser:
|
|
return CurrentUser(
|
|
user_id="00000000-0000-0000-0000-000000000001",
|
|
email="seed@torbatyar.local",
|
|
username="seed",
|
|
roles=["platform_admin"],
|
|
)
|
|
|
|
|
|
async def seed() -> None:
|
|
tenant_raw = os.environ.get("EXPERIENCE_SEED_TENANT_ID")
|
|
if not tenant_raw:
|
|
tenant_id = uuid.uuid4()
|
|
print(f"EXPERIENCE_SEED_TENANT_ID not set — using generated tenant: {tenant_id}")
|
|
else:
|
|
tenant_id = uuid.UUID(tenant_raw)
|
|
|
|
async with AsyncSessionLocal() as db:
|
|
ws_svc = ExperienceWorkspaceService(db)
|
|
site_svc = ExperienceSiteService(db)
|
|
page_svc = ExperiencePageService(db)
|
|
form_svc = ExperienceFormService(db)
|
|
tpl_svc = ExperienceTemplateService(db)
|
|
actor = _actor()
|
|
|
|
ws = await ws_svc.create(
|
|
tenant_id,
|
|
ExperienceWorkspaceCreate(
|
|
code="demo-ws",
|
|
name="فضای کاری دمو",
|
|
description="Seeded by seed_experience.py",
|
|
status=LifecycleStatus.ACTIVE,
|
|
),
|
|
actor=actor,
|
|
)
|
|
print(f"workspace: {ws.id}")
|
|
|
|
site = await site_svc.create(
|
|
tenant_id,
|
|
ExperienceSiteCreate(
|
|
workspace_id=ws.id,
|
|
code="demo-site",
|
|
name="سایت دمو",
|
|
publish_status=PublishStatus.DRAFT,
|
|
),
|
|
actor=actor,
|
|
)
|
|
print(f"site: {site.id}")
|
|
|
|
page = await page_svc.create(
|
|
tenant_id,
|
|
ExperiencePageCreate(
|
|
workspace_id=ws.id,
|
|
site_id=site.id,
|
|
code="home",
|
|
slug="home",
|
|
title="صفحه اصلی",
|
|
page_type=PageType.LANDING,
|
|
),
|
|
actor=actor,
|
|
)
|
|
print(f"page: {page.id}")
|
|
|
|
form = await form_svc.create(
|
|
tenant_id,
|
|
ExperienceFormCreate(
|
|
workspace_id=ws.id,
|
|
site_id=site.id,
|
|
page_id=page.id,
|
|
code="contact",
|
|
name="فرم تماس",
|
|
form_schema_json={
|
|
"fields": [
|
|
{"name": "full_name", "type": "text", "label": "نام", "required": True},
|
|
{"name": "email", "type": "email", "label": "ایمیل", "required": True},
|
|
]
|
|
},
|
|
),
|
|
actor=actor,
|
|
)
|
|
print(f"form: {form.id}")
|
|
|
|
tpl = await tpl_svc.create(
|
|
tenant_id,
|
|
ExperienceTemplateCreate(
|
|
workspace_id=ws.id,
|
|
code="landing-starter",
|
|
name="قالب لندینگ",
|
|
page_type="landing",
|
|
),
|
|
actor=actor,
|
|
)
|
|
print(f"template: {tpl.id}")
|
|
|
|
await db.commit()
|
|
print("Seed complete.")
|
|
print(f"Use X-Tenant-ID: {tenant_id}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(seed())
|