From 353d4639b44d5d5846ea8016884c3c07e447b323 Mon Sep 17 00:00:00 2001 From: aramesh-site deploy Date: Fri, 9 Oct 2026 19:36:09 +0000 Subject: [PATCH] =?UTF-8?q?feat(brand):=20=D9=84=D9=88=DA=AF=D9=88=DB=8C?= =?UTF-8?q?=20=D8=A7=D8=AE=D8=AA=D8=B5=D8=A7=D8=B5=DB=8C=20=D9=86=D8=B3?= =?UTF-8?q?=D8=AE=D9=87=D9=94=20=D8=A7=D9=86=DA=AF=D9=84=DB=8C=D8=B3=DB=8C?= =?UTF-8?q?=20=E2=80=94=20=D8=B3=D8=AA=D9=88=D9=86=20logo=5Fen=D8=8C=20?= =?UTF-8?q?=D9=85=DB=8C=DA=AF=D8=B1=DB=8C=D8=B4=D9=86=20=DB=B0=DB=B0=DB=B0?= =?UTF-8?q?=DB=B3=D8=8C=20=D9=84=D9=88=DA=A9=D8=A7=D9=84=D8=A7=DB=8C=D8=B2?= =?UTF-8?q?=20=D9=88=20=D9=81=DB=8C=D9=84=D8=AF=20=D9=BE=D9=86=D9=84=20(?= =?UTF-8?q?=DA=A9=D8=AF=20=D8=A7=D8=B2=20=D9=82=D8=A8=D9=84=20=D8=AF=D8=B1?= =?UTF-8?q?=20=D8=AA=D9=88=D9=84=DB=8C=D8=AF=20=D8=A7=D8=AC=D8=B1=D8=A7=20?= =?UTF-8?q?=D9=85=DB=8C=E2=80=8C=D8=B4=D8=AF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/models.py | 1 + backend/app/schemas.py | 2 ++ .../migrations/versions/0003_brand_logo_en.py | 31 +++++++++++++++++++ frontend/src/admin/entities.ts | 2 +- frontend/src/api.tsx | 1 + frontend/src/i18n/localize.ts | 1 + 6 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 backend/migrations/versions/0003_brand_logo_en.py diff --git a/backend/app/models.py b/backend/app/models.py index 9035623..4b9d18c 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -32,6 +32,7 @@ class Brand(Base): name: Mapped[str] = mapped_column(String(128), default="") name_en: Mapped[str] = mapped_column(String(128), default="") logo: Mapped[str] = mapped_column(Text, default="") + logo_en: Mapped[str] = mapped_column(Text, default="") hero: Mapped[str] = mapped_column(Text, default="") contact_bg: Mapped[str] = mapped_column(Text, default="") phone: Mapped[str] = mapped_column(String(64), default="") diff --git a/backend/app/schemas.py b/backend/app/schemas.py index 143c287..fa7e228 100644 --- a/backend/app/schemas.py +++ b/backend/app/schemas.py @@ -23,6 +23,7 @@ class BrandOut(ORMModel): name: str name_en: str = "" logo: str + logo_en: str = "" hero: str contact_bg: str phone: str @@ -443,6 +444,7 @@ class BrandIn(BaseModel): name: str = "" name_en: str = "" logo: str = "" + logo_en: str = "" hero: str = "" contact_bg: str = "" phone: str = "" diff --git a/backend/migrations/versions/0003_brand_logo_en.py b/backend/migrations/versions/0003_brand_logo_en.py new file mode 100644 index 0000000..3acb770 --- /dev/null +++ b/backend/migrations/versions/0003_brand_logo_en.py @@ -0,0 +1,31 @@ +"""لوگوی انگلیسی برند — ستون logo_en در جدول brand. + +نسخهٔ انگلیسی سایت لوگوی اختصاصی خودش را دارد؛ فیلد مشترک logo برای هر دو +زبان کافی نبود. بازگشت به فارسی با خالی‌بودن ستون انجام می‌شود. + +Revision ID: 0003 +Revises: 0002 +Create Date: 2026-10-01 +""" +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +revision: str = "0003" +down_revision: Union[str, None] = "0002" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + cols = sa.inspect(op.get_bind()).get_columns("brand") + existing = {c["name"] for c in cols} + if "logo_en" not in existing: + op.add_column("brand", sa.Column("logo_en", sa.Text(), nullable=False, server_default="")) + + +def downgrade() -> None: + cols = sa.inspect(op.get_bind()).get_columns("brand") + if "logo_en" in {c["name"] for c in cols}: + op.drop_column("brand", "logo_en") diff --git a/frontend/src/admin/entities.ts b/frontend/src/admin/entities.ts index d54e079..9927a80 100644 --- a/frontend/src/admin/entities.ts +++ b/frontend/src/admin/entities.ts @@ -211,7 +211,7 @@ export const ENTITIES: Record = { brand: { resource: 'brand', dataKey: 'brand', title: 'برند و تماس', kind: 'singleton', titleKey: 'name', - fields: [F('name', 'نام برند'), F('logo', 'لوگو', 'image', undefined, true), F('hero', 'تصویر هیرو', 'image', undefined, true), F('contact_bg', 'پس‌زمینه بخش تماس', 'image', undefined, true), F('phone', 'تلفن نمایشی', 'text', undefined, true), F('phone_href', 'لینک تلفن', 'text', undefined, true), F('email', 'ایمیل', 'text', undefined, true), F('address', 'نشانی', 'textarea')], + fields: [F('name', 'نام برند'), F('logo', 'لوگو', 'image'), F('hero', 'تصویر هیرو', 'image', undefined, true), F('contact_bg', 'پس‌زمینه بخش تماس', 'image', undefined, true), F('phone', 'تلفن نمایشی', 'text', undefined, true), F('phone_href', 'لینک تلفن', 'text', undefined, true), F('email', 'ایمیل', 'text', undefined, true), F('address', 'نشانی', 'textarea')], defaults: {}, }, hero: { diff --git a/frontend/src/api.tsx b/frontend/src/api.tsx index 36263b7..e1b94e9 100644 --- a/frontend/src/api.tsx +++ b/frontend/src/api.tsx @@ -12,6 +12,7 @@ export type BrandInfo = { name: string name_en?: string logo: string + logo_en?: string hero: string contact_bg: string phone: string diff --git a/frontend/src/i18n/localize.ts b/frontend/src/i18n/localize.ts index a5cf9b7..b58f898 100644 --- a/frontend/src/i18n/localize.ts +++ b/frontend/src/i18n/localize.ts @@ -19,6 +19,7 @@ export function localizeSite(data: SiteData, lang: Lang): SiteData { brand: { ...data.brand, name: s(data.brand.name, data.brand.name_en), + logo: s(data.brand.logo, data.brand.logo_en), address: s(data.brand.address, data.brand.address_en), }, nav: data.nav.map((n) => ({ ...n, label: s(n.label, n.label_en) })),