بک‌اند: ویرایش جزئی (PATCH) و ترتیب‌بندی مجموعه‌ها برای ویرایش زنده

- PATCH /api/admin/{resource}/{id} — ویرایش جزئی؛ فقط فیلدهای ارسال‌شده
  به‌روزرسانی می‌شوند (PUT قبلاً کل رکورد را جایگزین می‌کرد و برای
  ویرایش زنده قابل استفاده نبود). اسکیماهای Patch به‌صورت خودکار از
  اسکیماهای In با create_model ساخته می‌شوند (هر ۲۴ منبع).
- ستون position برای ۱۴ جدول مجموعه‌ای (خدمات، پروژه‌ها، مقالات، نظرات،
  سوالات، تیم، تایم‌لاین، آمار، چرا آرامش، مدل‌های سرمایه‌گذاری، مراحل کار،
  دفاتر، گالری، منو) — مهاجرت سبک idempotent در startup و seed
  (ALTER TABLE ADD COLUMN IF NOT EXISTS) تا دیتابیس‌های موجود هم ارتقا یابند
- POST /api/admin/{resource}/reorder — ذخیره ترتیب جدید بر اساس لیست id
- خواندن عمومی بر اساس (position, id) مرتب می‌شود؛ رکورد جدید در انتهای لیست
- seed فقط جدول‌های خالی را با position صحیح پر می‌کند
This commit is contained in:
MMD
2026-09-06 21:57:07 +03:30
parent bf3c67f405
commit 6e422ec3dc
7 changed files with 218 additions and 57 deletions
+7 -3
View File
@@ -14,7 +14,7 @@ from typing import Any
from . import models, seed_data
from .auth import hash_password
from .config import settings
from .database import Base, SessionLocal, engine
from .database import Base, SessionLocal, engine, run_light_migrations
# (مدل، داده‌های اولیه، برچسب گزارش)
CONTENT: list[tuple[Any, list[dict], str]] = [
@@ -53,12 +53,16 @@ def seed(force: bool = False) -> None:
print("جداول قبلی حذف شدند.")
Base.metadata.create_all(bind=engine)
run_light_migrations()
for model, rows, label in CONTENT:
if db.query(model).count() > 0:
continue
for row in rows:
db.add(model(**row))
for idx, row in enumerate(rows):
payload = dict(row)
if hasattr(model, "position") and "position" not in payload:
payload["position"] = idx
db.add(model(**payload))
if db.query(models.AdminUser).count() == 0:
db.add(