Files
Cellar---Alcools-collection/backend/models.py
T
2026-06-26 11:54:29 +02:00

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)