from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Boolean, Enum from sqlalchemy.sql import func from pydantic import BaseModel, Field from .database import Base from typing import Optional from app.models.user import Gender # 复用用户模型中的性别枚举 # 数据库模型 class AddressDB(Base): __tablename__ = "delivery_addresses" id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column(Integer, ForeignKey("users.userid"), index=True) community_id = Column(Integer, index=True) community_name = Column(String(100), nullable=True) community_building_id = Column(Integer, ForeignKey("community_buildings.id"), nullable=True) community_building_name = Column(String(100), nullable=True) address_detail = Column(String(200)) name = Column(String(50)) phone = Column(String(11)) gender = Column(Enum(Gender), nullable=False, default=Gender.UNKNOWN) is_default = Column(Boolean, default=False) create_time = Column(DateTime(timezone=True), server_default=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now()) # Pydantic 模型 class AddressCreate(BaseModel): community_id: int community_building_id: Optional[int] = None address_detail: str = Field(..., max_length=200) name: str = Field(..., max_length=50) phone: str = Field(..., pattern="^1[3-9]\d{9}$") gender: Gender = Gender.UNKNOWN is_default: bool = True class AddressUpdate(BaseModel): community_id: Optional[int] = None community_building_id: Optional[int] = None address_detail: Optional[str] = Field(None, max_length=200) name: Optional[str] = Field(None, max_length=50) phone: Optional[str] = Field(None, pattern="^1[3-9]\d{9}$") gender: Optional[Gender] = None is_default: Optional[bool] = None class AddressInfo(BaseModel): id: int community_id: int community_name:Optional[str] community_name: Optional[str] = None community_building_id: Optional[int] community_building_name: Optional[str] address_detail: str name: str phone: str gender: Gender is_default: bool class Config: from_attributes = True