بکاند: بدنه مقاله به سند ساختاریافته TipTap (JSON) + مهاجرت داده
- body مقاله از لیست پاراگراف به سند ProseMirror تغییر کرد:
{"type": "doc", "content": [...]} — در In/Out/Patch schemas
- اعتبارسنجی ساختاری (type=doc + content لیست) با field_validator —
امنیت رندر بر عهده رندر استاتیک TipTap در فرانتاند است
- app/migrations.py: مهاجرتهای DDL و داده در یکجا؛ migrate_article_bodies
ردیفهای قدیمی (لیست پاراگراف) را idempotent به سند تبدیل میکند —
در startup و seed اجرا میشود، دیتابیس موجود بدون از دست رفتن داده ارتقا مییابد
- seed بدنههای لیستی را قبل از درج به سند تبدیل میکند
- README بکاند: فرمت بدنه و رفتار مهاجرت مستند شد
This commit is contained in:
+6
-2
@@ -14,7 +14,8 @@ from typing import Any
|
||||
from . import models, seed_data
|
||||
from .auth import hash_password
|
||||
from .config import settings
|
||||
from .database import Base, SessionLocal, engine, run_light_migrations
|
||||
from .database import Base, SessionLocal, engine
|
||||
from .migrations import paragraphs_to_doc, run_all as run_migrations
|
||||
|
||||
# (مدل، دادههای اولیه، برچسب گزارش)
|
||||
CONTENT: list[tuple[Any, list[dict], str]] = [
|
||||
@@ -53,7 +54,7 @@ def seed(force: bool = False) -> None:
|
||||
print("جداول قبلی حذف شدند.")
|
||||
|
||||
Base.metadata.create_all(bind=engine)
|
||||
run_light_migrations()
|
||||
run_migrations()
|
||||
|
||||
for model, rows, label in CONTENT:
|
||||
if db.query(model).count() > 0:
|
||||
@@ -62,6 +63,9 @@ def seed(force: bool = False) -> None:
|
||||
payload = dict(row)
|
||||
if hasattr(model, "position") and "position" not in payload:
|
||||
payload["position"] = idx
|
||||
# بدنه مقالات در seed بهصورت لیست پاراگراف است — به سند تبدیل میشود
|
||||
if model is models.Article and isinstance(payload.get("body"), list):
|
||||
payload["body"] = paragraphs_to_doc(payload["body"])
|
||||
db.add(model(**payload))
|
||||
|
||||
if db.query(models.AdminUser).count() == 0:
|
||||
|
||||
Reference in New Issue
Block a user