107 lines
3.1 KiB
Python
107 lines
3.1 KiB
Python
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)
|