Files
aramesh-backend/backend/app/seed.py

127 lines
5.5 KiB
Python

"""اسکریپت seed دیتابیس.
اجرا:
python -m app.seed # فقط جدول‌های خالی پر می‌شوند
python -m app.seed --force # حذف کامل داده‌ها و ساخت مجدد
پر کردن هر جدول مستقل است: روی یک دیتابیس موجود، فقط جدول‌های جدید یا خالی
seed می‌شوند و داده‌های قبلی دست‌نخورده می‌مانند.
"""
import argparse
from typing import Any
from . import models, seed_data, seed_data_en
from .auth import hash_password
from .config import settings
from .database import Base, SessionLocal, engine
from .migrations import paragraphs_to_doc, run_all as run_migrations
# (مدل، داده‌های اولیه، برچسب گزارش)
CONTENT: list[tuple[Any, list[dict], str]] = [
(models.Brand, [seed_data.BRAND], "برند"),
(models.Hero, [seed_data.HERO], "هیرو صفحه اصلی"),
(models.StorySection, [seed_data.STORY], "داستان ما"),
(models.SectionHeadingContent, seed_data.SECTION_HEADINGS, "تیتر بخش‌ها"),
(models.PageHeroContent, seed_data.PAGE_HEROES, "هیرو صفحات"),
(models.NavItem, seed_data.NAV_ITEMS, "منوی ناوبری"),
(models.InvestmentModel, seed_data.INVESTMENT_MODELS, "مدل‌های سرمایه‌گذاری"),
(models.ProcessStep, seed_data.PROCESS_STEPS, "مراحل فرآیند کار"),
(models.Office, seed_data.OFFICES, "دفاتر"),
(models.GalleryImage, seed_data.GALLERY_IMAGES, "گالری تصاویر"),
(models.StatusLabel, seed_data.STATUS_LABELS, "برچسب وضعیت پروژه"),
(models.ContactSectionContent, [seed_data.CONTACT_SECTION], "بخش تماس"),
(models.NewsletterSectionContent, [seed_data.NEWSLETTER], "خبرنامه"),
(models.FooterContent, [seed_data.FOOTER], "فوتر"),
(models.Service, seed_data.SERVICES, "خدمات"),
(models.Stat, seed_data.STATS, "آمار"),
(models.Project, seed_data.PROJECTS, "پروژه‌ها"),
(models.Article, seed_data.ARTICLES, "مقالات"),
(models.Testimonial, seed_data.TESTIMONIALS, "نظرات"),
(models.Faq, seed_data.FAQS, "سوالات متداول"),
(models.TeamMember, seed_data.TEAM, "تیم"),
(models.TimelineItem, seed_data.TIMELINE, "تایم‌لاین"),
(models.WhyUsItem, seed_data.WHY, "چرا آرامش"),
(models.BeforeAfter, [seed_data.BEFORE_AFTER], "قبل/بعد"),
(models.SeoMeta, seed_data.SEO_META, "سئوی صفحات"),
]
# ترجمه انگلیسی همان جدول‌ها — هم‌ترتیب با CONTENT تا با zip ادغام شود
EN_CONTENT: list[list[dict]] = [
[seed_data_en.BRAND],
[seed_data_en.HERO],
[seed_data_en.STORY],
seed_data_en.SECTION_HEADINGS,
seed_data_en.PAGE_HEROES,
seed_data_en.NAV_ITEMS,
seed_data_en.INVESTMENT_MODELS,
seed_data_en.PROCESS_STEPS,
seed_data_en.OFFICES,
seed_data_en.GALLERY_IMAGES,
seed_data_en.STATUS_LABELS,
[seed_data_en.CONTACT_SECTION],
[seed_data_en.NEWSLETTER],
[seed_data_en.FOOTER],
seed_data_en.SERVICES,
seed_data_en.STATS,
seed_data_en.PROJECTS,
seed_data_en.ARTICLES,
seed_data_en.TESTIMONIALS,
seed_data_en.FAQS,
seed_data_en.TEAM,
seed_data_en.TIMELINE,
seed_data_en.WHY,
[seed_data_en.BEFORE_AFTER],
seed_data_en.SEO_META,
]
def seed(force: bool = False) -> None:
db = SessionLocal()
try:
if force:
Base.metadata.drop_all(bind=engine)
print("جداول قبلی حذف شدند.")
Base.metadata.create_all(bind=engine)
run_migrations()
for (model, rows, label), en_rows in zip(CONTENT, EN_CONTENT):
if db.query(model).count() > 0:
continue
for idx, row in enumerate(rows):
# فایل فارسی مرجع است؛ فقط فیلدهای *_en از فایل انگلیسی اضافه می‌شود
payload = {**dict(en_rows[idx]), **dict(row)} if idx < len(en_rows) else dict(row)
if hasattr(model, "position") and "position" not in payload:
payload["position"] = idx
# بدنه مقاله (فارسی و انگلیسی) در seed به‌صورت لیست پاراگراف است — به سند تبدیل می‌شود
if model is models.Article:
for body_key in ("body", "body_en"):
if isinstance(payload.get(body_key), list):
payload[body_key] = paragraphs_to_doc(payload[body_key])
db.add(model(**payload))
if db.query(models.AdminUser).count() == 0:
db.add(
models.AdminUser(
username=settings.admin_username,
password_hash=hash_password(settings.admin_password),
)
)
print(f"کاربر ادمین ساخته شد: {settings.admin_username}")
db.commit()
for model, _, label in CONTENT:
print(f" {label}: {db.query(model).count()} رکورد")
print("✔ seed با موفقیت انجام شد.")
finally:
db.close()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Seed کردن دیتابیس گروه ساختمانی آرامش")
parser.add_argument("--force", action="store_true", help="حذف همه جداول و ساخت مجدد")
args = parser.parse_args()
seed(force=args.force)