70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
from enum import Enum as PyEnum
|
|
from typing import Optional, List
|
|
from datetime import datetime, time
|
|
|
|
from sqlalchemy import Column, CheckConstraint
|
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
|
|
from sqlmodel import SQLModel, Field, Relationship, Enum
|
|
from pydantic import BaseModel, constr
|
|
|
|
|
|
class ShopStatus(PyEnum):
|
|
ACTIVE = "active"
|
|
INACTIVE = "inactive"
|
|
SUSPENDED = "suspended"
|
|
|
|
|
|
class ShopLinkEntry(BaseModel):
|
|
name: constr(strip_whitespace=True, min_length=1)
|
|
url: constr(strip_whitespace=True, min_length=1)
|
|
|
|
|
|
class ShopLinks(BaseModel):
|
|
links: List[ShopLinkEntry]
|
|
|
|
|
|
class ShopBusinessHourEntry(BaseModel):
|
|
day: constr(strip_whitespace=True, min_length=1)
|
|
open_time: time
|
|
close_time: time
|
|
|
|
|
|
class ShopBusinessHours(BaseModel):
|
|
hours: List[ShopBusinessHourEntry]
|
|
|
|
|
|
class Shop(SQLModel, table=True):
|
|
__tablename__ = 'shop'
|
|
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
owner_id: int = Field(foreign_key='user.id', nullable=False)
|
|
name: str = Field(max_length=100, nullable=False, unique=True)
|
|
description: str = Field(max_length=500, nullable=False)
|
|
created_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
|
|
updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
|
|
status: ShopStatus = Field(sa_column=Column(Enum(ShopStatus)))
|
|
logo: Optional[str] = Field(max_length=100)
|
|
contact_email: str = Field(max_length=128, nullable=False, unique=True)
|
|
phone_number: str = Field(max_length=15, nullable=False)
|
|
address: str = Field(nullable=False)
|
|
currency: str = Field(max_length=3, nullable=False)
|
|
|
|
business_hours: ShopBusinessHours = Field(
|
|
sa_column=Column(JSONB, nullable=False, default=lambda: {})
|
|
)
|
|
links: ShopLinks = Field(
|
|
sa_column=Column(JSONB, nullable=False, default=lambda: {})
|
|
)
|
|
|
|
owner: Optional["User"] = Relationship(back_populates='owned_shops')
|
|
registered_users: List["User"] = Relationship(back_populates='registered_shop')
|
|
|
|
__table_args__ = (
|
|
CheckConstraint("business_hours ? 'hours'", name="check_business_hours_keys"),
|
|
CheckConstraint("links ? 'links'", name="check_links_keys"),
|
|
)
|
|
|
|
|
|
__all__ = ["Shop", "ShopBusinessHours", "ShopLinks", "ShopStatus"]
|