Files
Choreus/backend/models.py
T
2026-08-09 21:45:06 -04:00

57 lines
2.4 KiB
Python

from datetime import datetime, timezone
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean, Enum
from sqlalchemy.orm import relationship
import enum
from backend.database import Base
class UserRole(str, enum.Enum):
ADMIN = "admin"
REGULAR = "regular"
class RecurrenceType(str, enum.Enum):
DAILY = "daily"
WEEKLY = "weekly"
SPONTANEOUS = "spontaneous"
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
email = Column(String, unique=True, index=True, nullable=False)
name = Column(String, nullable=False)
google_id = Column(String, unique=True, nullable=True, index=True)
avatar_url = Column(String, nullable=True)
role = Column(String, default=UserRole.REGULAR.value, nullable=False)
weekly_star_quota = Column(Integer, default=15, nullable=False)
is_active = Column(Boolean, default=True, nullable=False)
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
completions = relationship("ChoreCompletion", back_populates="user", cascade="all, delete-orphan")
class ChoreType(Base):
__tablename__ = "chore_types"
id = Column(Integer, primary_key=True, index=True)
title = Column(String, nullable=False)
description = Column(String, nullable=True)
star_reward = Column(Integer, default=1, nullable=False) # 1 to 5 stars
recurrence = Column(String, default=RecurrenceType.DAILY.value, nullable=False) # daily, weekly, spontaneous
icon = Column(String, default="CheckSquare", nullable=False)
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
completions = relationship("ChoreCompletion", back_populates="chore_type", cascade="all, delete-orphan")
class ChoreCompletion(Base):
__tablename__ = "chore_completions"
id = Column(Integer, primary_key=True, index=True)
chore_type_id = Column(Integer, ForeignKey("chore_types.id", ondelete="CASCADE"), nullable=False)
user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
completed_at = Column(DateTime, default=lambda: datetime.now(timezone.utc), nullable=False)
stars_earned = Column(Integer, nullable=False)
week_identifier = Column(String, nullable=False, index=True) # e.g., '2026-W32'
notes = Column(String, nullable=True)
user = relationship("User", back_populates="completions")
chore_type = relationship("ChoreType", back_populates="completions")