- API عمومی محتوای سایت (پروژهها، مقالات، خدمات و...) - فرم تماس و خبرنامه با اعتبارسنجی سرور - پنل مدیریت با JWT و CRUD کامل + مدیریت پیامها و مشترکین - اسکریپت seed با دادههای واقعی سایت - تستشده: ۳۶/۳۶ انتهاپوینت
160 lines
5.7 KiB
Python
160 lines
5.7 KiB
Python
from datetime import datetime, timezone
|
|
|
|
from sqlalchemy import JSON, Boolean, DateTime, Integer, String, Text
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
from .database import Base
|
|
|
|
|
|
def utcnow() -> datetime:
|
|
return datetime.now(timezone.utc)
|
|
|
|
|
|
class AdminUser(Base):
|
|
__tablename__ = "admin_users"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
username: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
|
password_hash: Mapped[str] = mapped_column(String(255))
|
|
|
|
|
|
class Brand(Base):
|
|
__tablename__ = "brand"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
name: Mapped[str] = mapped_column(String(128), default="")
|
|
logo: 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="")
|
|
phone_href: Mapped[str] = mapped_column(String(128), default="")
|
|
email: Mapped[str] = mapped_column(String(128), default="")
|
|
address: Mapped[str] = mapped_column(Text, default="")
|
|
|
|
|
|
class Service(Base):
|
|
__tablename__ = "services"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
title: Mapped[str] = mapped_column(String(256))
|
|
desc: Mapped[str] = mapped_column(Text, default="")
|
|
icon: Mapped[str] = mapped_column(String(32), default="draft")
|
|
|
|
|
|
class Project(Base):
|
|
__tablename__ = "projects"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
slug: Mapped[str] = mapped_column(String(128), unique=True, index=True)
|
|
title: Mapped[str] = mapped_column(String(256))
|
|
location: Mapped[str] = mapped_column(String(128), default="")
|
|
year: Mapped[str] = mapped_column(String(64), default="")
|
|
status: Mapped[str] = mapped_column(String(16), default="done") # done | progress
|
|
image: Mapped[str] = mapped_column(Text, default="")
|
|
gallery: Mapped[list] = mapped_column(JSON, default=list)
|
|
area: Mapped[str] = mapped_column(String(64), default="")
|
|
floors: Mapped[str] = mapped_column(String(64), default="")
|
|
units: Mapped[str] = mapped_column(String(64), default="")
|
|
client: Mapped[str] = mapped_column(String(128), default="")
|
|
summary: Mapped[str] = mapped_column(Text, default="")
|
|
body: Mapped[list] = mapped_column(JSON, default=list)
|
|
|
|
|
|
class Article(Base):
|
|
__tablename__ = "articles"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
slug: Mapped[str] = mapped_column(String(128), unique=True, index=True)
|
|
title: Mapped[str] = mapped_column(String(256))
|
|
date: Mapped[str] = mapped_column(String(64), default="")
|
|
category: Mapped[str] = mapped_column(String(64), default="")
|
|
image: Mapped[str] = mapped_column(Text, default="")
|
|
read: Mapped[str] = mapped_column(String(32), default="")
|
|
excerpt: Mapped[str] = mapped_column(Text, default="")
|
|
body: Mapped[list] = mapped_column(JSON, default=list)
|
|
|
|
|
|
class Testimonial(Base):
|
|
__tablename__ = "testimonials"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
name: Mapped[str] = mapped_column(String(128))
|
|
role: Mapped[str] = mapped_column(String(128), default="")
|
|
quote: Mapped[str] = mapped_column(Text, default="")
|
|
|
|
|
|
class Faq(Base):
|
|
__tablename__ = "faqs"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
question: Mapped[str] = mapped_column(Text)
|
|
answer: Mapped[str] = mapped_column(Text, default="")
|
|
|
|
|
|
class TeamMember(Base):
|
|
__tablename__ = "team"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
name: Mapped[str] = mapped_column(String(128))
|
|
role: Mapped[str] = mapped_column(String(128), default="")
|
|
bio: Mapped[str] = mapped_column(Text, default="")
|
|
|
|
|
|
class TimelineItem(Base):
|
|
__tablename__ = "timeline"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
year: Mapped[str] = mapped_column(String(32))
|
|
title: Mapped[str] = mapped_column(String(256))
|
|
desc: Mapped[str] = mapped_column(Text, default="")
|
|
image: Mapped[str] = mapped_column(Text, default="")
|
|
|
|
|
|
class Stat(Base):
|
|
__tablename__ = "stats"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
value: Mapped[int] = mapped_column(Integer)
|
|
suffix: Mapped[str] = mapped_column(String(16), default="")
|
|
label: Mapped[str] = mapped_column(String(128))
|
|
|
|
|
|
class WhyUsItem(Base):
|
|
__tablename__ = "why_us"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
title: Mapped[str] = mapped_column(String(256))
|
|
desc: Mapped[str] = mapped_column(Text, default="")
|
|
|
|
|
|
class BeforeAfter(Base):
|
|
__tablename__ = "before_after"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
title: Mapped[str] = mapped_column(String(256), default="")
|
|
lead: Mapped[str] = mapped_column(Text, default="")
|
|
before: Mapped[str] = mapped_column(Text, default="")
|
|
after: Mapped[str] = mapped_column(Text, default="")
|
|
before_label: Mapped[str] = mapped_column(String(128), default="")
|
|
after_label: Mapped[str] = mapped_column(String(128), default="")
|
|
|
|
|
|
class ContactMessage(Base):
|
|
__tablename__ = "contact_messages"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
name: Mapped[str] = mapped_column(String(128))
|
|
phone: Mapped[str] = mapped_column(String(32))
|
|
note: Mapped[str] = mapped_column(Text, default="")
|
|
is_read: Mapped[bool] = mapped_column(Boolean, default=False)
|
|
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utcnow)
|
|
|
|
|
|
class Subscriber(Base):
|
|
__tablename__ = "subscribers"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
email: Mapped[str] = mapped_column(String(256), unique=True, index=True)
|
|
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
|
|
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utcnow)
|