from datetime import datetime, timedelta from sqlalchemy import Boolean, Column, DateTime, Enum, Float, ForeignKey, Integer, String, Text from sqlalchemy.orm import relationship from database import Base import enum class DrinkCategory(str, enum.Enum): WINE = "wine" BEER = "beer" SPIRIT = "spirit" class WineColor(str, enum.Enum): RED = "red" WHITE = "white" ROSE = "rose" SPARKLING = "sparkling" class SpiritType(str, enum.Enum): WHISKY = "whisky" VODKA = "vodka" RUM = "rum" GIN = "gin" TEQUILA = "tequila" COGNAC = "cognac" CALVADOS = "calvados" OTHER = "other" class BeerStyle(str, enum.Enum): IPA = "ipa" STOUT = "stout" LAGER = "lager" ALE = "ale" WHEAT = "wheat" SOUR = "sour" PILSNER = "pilsner" PORTER = "porter" BELGIAN = "belgian" OTHER = "other" class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String(100), unique=True, nullable=False, index=True) email = Column(String(255), unique=True, nullable=False, index=True) hashed_password = Column(String(255), nullable=False) is_admin = Column(Boolean, default=False) token_version = Column(Integer, default=0) created_at = Column(DateTime, default=datetime.utcnow) drinks = relationship("Drink", back_populates="owner") class Invitation(Base): __tablename__ = "invitations" id = Column(Integer, primary_key=True, index=True) token = Column(String(64), unique=True, nullable=False, index=True) created_by = Column(Integer, ForeignKey("users.id"), nullable=False) used_by = Column(Integer, ForeignKey("users.id"), nullable=True) created_at = Column(DateTime, default=datetime.utcnow) used_at = Column(DateTime, nullable=True) expires_at = Column(DateTime, nullable=False) class Drink(Base): __tablename__ = "drinks" id = Column(Integer, primary_key=True, index=True) owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) name = Column(String(255), nullable=False, index=True) category = Column(Enum(DrinkCategory), nullable=False) image_path = Column(String(500), nullable=True) rating = Column(Float, nullable=True) notes = Column(Text, nullable=True) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) owner = relationship("User", back_populates="drinks") # Wine fields grape_variety = Column(String(255), nullable=True) vintage = Column(Integer, nullable=True) region = Column(String(255), nullable=True) producer = Column(String(255), nullable=True) wine_color = Column(Enum(WineColor), nullable=True) # Beer fields brewery = Column(String(255), nullable=True) beer_style = Column(Enum(BeerStyle), nullable=True) ibu = Column(Float, nullable=True) abv = Column(Float, nullable=True) # Spirit fields spirit_type = Column(Enum(SpiritType), nullable=True) age_years = Column(Integer, nullable=True) distillery = Column(String(255), nullable=True) country = Column(String(255), nullable=True)