from sqlalchemy import Column, String, Boolean, DateTime, Integer, ForeignKey, UniqueConstraint from sqlalchemy.orm import relationship from app.core.database.db_session import Base class Country(Base): __tablename__ = "countries" country_id = Column(Integer, primary_key=True, autoincrement=True) country_name = Column(String(100), nullable=False) country_code = Column(String(3), unique=True, nullable=False) currency = Column(String(10), nullable=False) currency_symbol = Column(String(5), nullable=False) phone_code = Column(String(10), nullable=False) timezone = Column(String(100), default="UTC") iso2 = Column(String(2), nullable=False) iso3 = Column(String(3), nullable=False) continent = Column(String(50), nullable=False) is_active = Column(Boolean, default=True) deleted_at = Column(DateTime, nullable=True) class State(Base): __tablename__ = "states" state_id = Column(Integer, primary_key=True, autoincrement=True) country_id = Column(Integer, ForeignKey("countries.country_id", ondelete="RESTRICT"), nullable=False) state_name = Column(String(100), nullable=False) state_code = Column(String(10), nullable=False) is_active = Column(Boolean, default=True) deleted_at = Column(DateTime, nullable=True) country = relationship("Country", foreign_keys=[country_id]) __table_args__ = ( UniqueConstraint("country_id", "state_code", name="uq_country_state"), ) class City(Base): __tablename__ = "cities" city_id = Column(Integer, primary_key=True, autoincrement=True) state_id = Column(Integer, ForeignKey("states.state_id", ondelete="RESTRICT"), nullable=False) city_name = Column(String(100), nullable=False) postal_code = Column(String(15), nullable=False) is_active = Column(Boolean, default=True) deleted_at = Column(DateTime, nullable=True) state = relationship("State", foreign_keys=[state_id])