Push V1 app

This commit is contained in:
jlacoste
2026-06-26 11:54:29 +02:00
parent 8b7caa1a5a
commit 9d1990523f
3881 changed files with 1291493 additions and 1 deletions
+106
View File
@@ -0,0 +1,106 @@
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)