From daa98d0f16dc2fc10b5ce210a8d6cbbade0b154a Mon Sep 17 00:00:00 2001 From: aramesh-site deploy Date: Tue, 13 Oct 2026 12:48:37 +0000 Subject: [PATCH] =?UTF-8?q?fix(db):=20=D9=BE=D9=87=D9=86=E2=80=8C=DA=A9?= =?UTF-8?q?=D8=B1=D8=AF=D9=86=20=D8=B3=D8=AA=D9=88=D9=86=E2=80=8C=D9=87?= =?UTF-8?q?=D8=A7=DB=8C=20location/usage=20=D9=BE=D8=B1=D9=88=DA=98=D9=87?= =?UTF-8?q?=20=D8=A8=D9=87=20=DB=B2=DB=B5=DB=B6=20=D9=86=D9=88=DB=8C=D8=B3?= =?UTF-8?q?=D9=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit نشانی انگلیسی ترانویسی‌شده از ۱۲۸ نویسه بلندتر می‌شود (بلندترین: ۱۶۱) و درج ترجمهٔ ۶۵ پروژه با خطای StringDataRightTruncation شکست خورد. مدل + مهاجرت ALTER COLUMN TYPE (idempotent) اضافه شد. --- backend/app/migrations.py | 5 +++++ backend/app/models.py | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/backend/app/migrations.py b/backend/app/migrations.py index 9f7a855..ea558ef 100644 --- a/backend/app/migrations.py +++ b/backend/app/migrations.py @@ -153,6 +153,11 @@ def run_ddl_migrations() -> None: conn.execute( text("ALTER TABLE articles ADD COLUMN IF NOT EXISTS seo_keyphrase VARCHAR(128) NOT NULL DEFAULT ''") ) + # نشانی/کاربری پروژه: نشانی انگلیسی (ترانویسی) از ۱۲۸ نویسه بلندتر می‌شود + conn.execute(text("ALTER TABLE projects ALTER COLUMN location TYPE VARCHAR(256)")) + conn.execute(text("ALTER TABLE projects ALTER COLUMN location_en TYPE VARCHAR(256)")) + conn.execute(text("ALTER TABLE projects ALTER COLUMN usage TYPE VARCHAR(256)")) + conn.execute(text("ALTER TABLE projects ALTER COLUMN usage_en TYPE VARCHAR(256)")) # نام نویسنده و توضیحات سئوی اختصاصی مقاله — فیلدهایی که پنل قبلاً نمایش می‌داد ولی در دیتابیس نبودند conn.execute( text("ALTER TABLE articles ADD COLUMN IF NOT EXISTS author VARCHAR(128) NOT NULL DEFAULT ''") diff --git a/backend/app/models.py b/backend/app/models.py index 4b9d18c..32d29dc 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -64,8 +64,8 @@ class Project(Base): slug: Mapped[str] = mapped_column(String(128), unique=True, index=True) title: Mapped[str] = mapped_column(String(256)) title_en: Mapped[str] = mapped_column(String(256), default="") - location: Mapped[str] = mapped_column(String(128), default="") - location_en: Mapped[str] = mapped_column(String(128), default="") + location: Mapped[str] = mapped_column(String(256), default="") + location_en: Mapped[str] = mapped_column(String(256), default="") year: Mapped[str] = mapped_column(String(64), default="") year_en: Mapped[str] = mapped_column(String(64), default="") status: Mapped[str] = mapped_column(String(16), default="done") # done | progress @@ -85,12 +85,17 @@ class Project(Base): # مشخصات تکمیلی پروژه — به درخواست تیم: نوع پروژه و کاربری project_type: Mapped[str] = mapped_column(String(128), default="") project_type_en: Mapped[str] = mapped_column(String(128), default="") - usage: Mapped[str] = mapped_column(String(128), default="") - usage_en: Mapped[str] = mapped_column(String(128), default="") + usage: Mapped[str] = mapped_column(String(256), default="") + usage_en: Mapped[str] = mapped_column(String(256), default="") summary: Mapped[str] = mapped_column(Text, default="") summary_en: Mapped[str] = mapped_column(Text, default="") body: Mapped[list] = mapped_column(JSON, default=list) body_en: Mapped[list] = mapped_column(JSON, default=list) + # آخرین به‌روزرسانی رکورد — فقط برای lastmod نقشه سایت؛ ردیف‌های قدیمی NULL می‌مانند + # تا lastmod جعلی تولید نشود (با هر ذخیرهٔ پنل پر می‌شود) + updated_at: Mapped[datetime | None] = mapped_column( + DateTime(timezone=True), default=utcnow, onupdate=utcnow, nullable=True + ) class Article(Base): @@ -138,6 +143,11 @@ class Article(Base): # هشتگ‌ها/برچسب‌ها — هر زبان جدا tags: Mapped[list] = mapped_column(JSON, default=list) tags_en: Mapped[list] = mapped_column(JSON, default=list) + # آخرین به‌روزرسانی رکورد — فقط برای lastmod نقشه سایت؛ ردیف‌های قدیمی NULL می‌مانند + # تا lastmod جعلی تولید نشود (با هر ذخیرهٔ پنل پر می‌شود) + updated_at: Mapped[datetime | None] = mapped_column( + DateTime(timezone=True), default=utcnow, onupdate=utcnow, nullable=True + ) class Testimonial(Base):