backend_and_cms/backend/app/models.py

277 lines
7.5 KiB
Python

import uuid
from typing import Optional, Dict, Any
from pydantic import EmailStr, BaseModel
from sqlmodel import Field, Relationship, SQLModel
from datetime import datetime
from sqlalchemy import JSON
# Shared properties
class UserBase(SQLModel):
email: EmailStr = Field(unique=True, index=True, max_length=255)
is_active: bool = True
is_superuser: bool = False
full_name: str | None = Field(default=None, max_length=255)
# Properties to receive via API on creation
class UserCreate(UserBase):
password: str = Field(min_length=8, max_length=40)
class UserRegister(SQLModel):
email: EmailStr = Field(max_length=255)
password: str = Field(min_length=8, max_length=40)
full_name: str | None = Field(default=None, max_length=255)
# Properties to receive via API on update, all are optional
class UserUpdate(UserBase):
email: EmailStr | None = Field(default=None, max_length=255) # type: ignore
password: str | None = Field(default=None, min_length=8, max_length=40)
class UserUpdateMe(SQLModel):
full_name: str | None = Field(default=None, max_length=255)
email: EmailStr | None = Field(default=None, max_length=255)
class UpdatePassword(SQLModel):
current_password: str = Field(min_length=8, max_length=40)
new_password: str = Field(min_length=8, max_length=40)
# Database model, database table inferred from class name
class User(UserBase, table=True):
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
hashed_password: str
items: list["Item"] = Relationship(back_populates="owner", cascade_delete=True)
# Properties to return via API, id is always required
class UserPublic(UserBase):
id: uuid.UUID
class UsersPublic(SQLModel):
data: list[UserPublic]
count: int
# Shared properties
class ItemBase(SQLModel):
title: str = Field(min_length=1, max_length=255)
description: str | None = Field(default=None, max_length=255)
# Properties to receive on item creation
class ItemCreate(ItemBase):
pass
# Properties to receive on item update
class ItemUpdate(ItemBase):
title: str | None = Field(default=None, min_length=1, max_length=255) # type: ignore
# Database model, database table inferred from class name
class Item(ItemBase, table=True):
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
title: str = Field(max_length=255)
owner_id: uuid.UUID = Field(
foreign_key="user.id", nullable=False, ondelete="CASCADE"
)
owner: User | None = Relationship(back_populates="items")
# Properties to return via API, id is always required
class ItemPublic(ItemBase):
id: uuid.UUID
owner_id: uuid.UUID
class ItemsPublic(SQLModel):
data: list[ItemPublic]
count: int
# Generic message
class Message(SQLModel):
message: str
# JSON payload containing access token
class Token(SQLModel):
access_token: str
token_type: str = "bearer"
# Contents of JWT token
class TokenPayload(SQLModel):
sub: str | None = None
class NewPassword(SQLModel):
token: str
new_password: str = Field(min_length=8, max_length=40)
# Client Messages
class MessageBase(SQLModel):
name: str = Field(max_length=255)
phone: str = Field(max_length=255)
email: str = Field(max_length=255)
message: str = Field(max_length=1024)
class Message(MessageBase, table=True):
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
created_at: datetime = Field(default_factory=datetime.now)
class MessageCreate(MessageBase):
pass
class MessagePublic(MessageBase):
id: uuid.UUID
class MessagesPublic(SQLModel):
data: list[Message]
count: int
# setting
class SettingBase(SQLModel):
address: str = Field(max_length=255)
google_map_api_key: str = Field(max_length=255)
latitude: float
longitude: float
phone: str = Field(max_length=255)
email: str = Field(max_length=255)
facebook: str = Field(max_length=255)
instagram: str = Field(max_length=255)
youtube: str = Field(max_length=255)
youtube_link: str = Field(max_length=255)
whatsapp: str = Field(max_length=255)
class SettingCreate(SettingBase):
pass
class Setting(SettingBase, table=True):
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
# About us
class AboutUsBase(SQLModel):
description: str = Field(max_length=1024)
image:str | None = Field(default=None, max_length=255)
title: str = Field(max_length=255)
index: int
class AboutUsCreate(AboutUsBase):
pass
class AboutUs(AboutUsBase, table=True):
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
class AboutUsPublic(AboutUsBase):
id: uuid.UUID
class AboutsUpdate(AboutUsBase):
pass
class AboutsListPublic(SQLModel):
data: list[AboutUsPublic]
count: int
#courses
class CourseBase(SQLModel):
title: str = Field(max_length=255)
sort_description: str = Field(max_length=32768)
long_description: str = Field(max_length=32768)
information: str = Field(max_length=32768)
contant: str = Field(max_length=32768)
remark: str = Field(max_length=32768)
class CourseCreate(CourseBase):
pass
class CourseUpdate(CourseBase):
pass
class Course(CourseBase, table=True):
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
created_at: datetime = Field(default_factory=datetime.now)
images: list["Image"] = Relationship(back_populates="course", cascade_delete=True)
info_images: list["Info_Image"] = Relationship(back_populates="course", cascade_delete=True)
schedule: list["Schedule"] = Relationship(back_populates="course", cascade_delete=True)
class CoursePublic(CourseBase):
id: uuid.UUID
title: str
images: list["Image"]
info_images: list["Info_Image"]
schedule: list["Schedule"]
created_at: datetime
class CoursesPublic(SQLModel):
data: list[CoursePublic]
count: int
# Image
class ImageBase(SQLModel):
image: str = Field(max_length=255)
index: int
class ImagePublic(ImageBase):
id: uuid.UUID
class ImageCreate(ImageBase):
course_id: uuid.UUID
class Image(ImageBase, table=True):
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
course_id: uuid.UUID = Field(foreign_key="course.id", nullable=False, ondelete="CASCADE")
course: Course | None = Relationship(back_populates="images")
class Info_ImageBase(SQLModel):
image: str = Field(max_length=255)
index: int
class Info_ImageCreate(Info_ImageBase):
course_id: uuid.UUID
class Info_Image(Info_ImageBase, table=True):
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
course_id: uuid.UUID = Field(foreign_key="course.id", nullable=False, ondelete="CASCADE")
course: Course | None = Relationship(back_populates="info_images")
# schedules
class ScheduleBase(SQLModel):
title: str = Field(max_length=255)
info1: str = Field(max_length=255)
info2: str = Field(max_length=255)
date: str = datetime
class ScheduleUpdate(ScheduleBase):
pass
class ScheduleCreate(ScheduleBase):
course_id: uuid.UUID
class Schedule(ScheduleBase, table=True):
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
course_id: uuid.UUID = Field(foreign_key="course.id", nullable=False, ondelete="CASCADE")
course: Course | None = Relationship(back_populates="schedule")
class CoursePublicWithImages(CoursePublic):
images: list[Image] = []
info_images: list[Info_Image] = []
schedule: list[Schedule] = []