Add points field to Chore model to support point-based reward system

This commit is contained in:
2026-02-01 13:30:44 +11:00
parent 0a8489a89c
commit 0c5dbb7ad7

View File

@@ -1,40 +1 @@
"""Chore model."""
from sqlalchemy import Boolean, Column, Integer, String, DateTime, ForeignKey, Enum as SQLEnum
from sqlalchemy.orm import relationship
from datetime import datetime
from app.core.database import Base
import enum
class ChoreFrequency(str, enum.Enum):
"""Chore frequency options."""
ON_TRIGGER = "on_trigger"
DAILY = "daily"
WEEKLY = "weekly"
FORTNIGHTLY = "fortnightly"
MONTHLY = "monthly"
class ChoreStatus(str, enum.Enum):
"""Chore status options."""
PENDING = "pending"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
SKIPPED = "skipped"
class Chore(Base):
"""Chore model."""
__tablename__ = "chores"
id = Column(Integer, primary_key=True, index=True)
title = Column(String(200), nullable=False)
description = Column(String(500))
room = Column(String(50)) # bedroom1, bedroom2, kitchen, bathroom1, etc.
frequency = Column(SQLEnum(ChoreFrequency), nullable=False)
status = Column(SQLEnum(ChoreStatus), default=ChoreStatus.PENDING)
assigned_user_id = Column(Integer, ForeignKey("users.id"))
due_date = Column(DateTime)
completed_at = Column(DateTime)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationships
assigned_user = relationship("User", back_populates="chores")
IiIiQ2hvcmUgbW9kZWwuIiIiCmZyb20gc3FsYWxjaGVteSBpbXBvcnQgQm9vbGVhbiwgQ29sdW1uLCBJbnRlZ2VyLCBTdHJpbmcsIERhdGVUaW1lLCBGb3JlaWduS2V5LCBFbnVtIGFzIFNRTEVudW0KZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgcmVsYXRpb25zaGlwCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCmZyb20gYXBwLmNvcmUuZGF0YWJhc2UgaW1wb3J0IEJhc2UKaW1wb3J0IGVudW0KCmNsYXNzIENob3JlRnJlcXVlbmN5KHN0ciwgZW51bS5FbnVtKToKICAgICIiIkNob3JlIGZyZXF1ZW5jeSBvcHRpb25zLiIiIgogICAgT05fVFJJR0dFUiA9ICJvbl90cmlnZ2VyIgogICAgREFJTFkgPSAiZGFpbHkiCiAgICBXRUVLTFkgPSAid2Vla2x5IgogICAgRk9SVE5JR0hUTFkgPSAiZm9ydG5pZ2h0bHkiCiAgICBNT05USExZID0gIm1vbnRobHkiCgpjbGFzcyBDaG9yZVN0YXR1cyhzdHIsIGVudW0uRW51bS5FbnVtKToKICAgICIiIkNob3JlIHN0YXR1cyBvcHRpb25zLiIiIgogICAgUEVORElORyA9ICJwZW5kaW5nIgogICAgSU5fUFJPR1JFU1MgPSAiaW5fcHJvZ3Jlc3MiCiAgICBDT01QTEVURUQgPSAiY29tcGxldGVkIgogICAgU0tJUFBFRCA9ICJza2lwcGVkIgoKY2xhc3MgQ2hvcmUoQmFzZSk6CiAgICAiIiJDaG9yZSBtb2RlbC4iIiIKICAgIF9fdGFibGVuYW1lX18gPSAiY2hvcmVzIgogICAgCiAgICBpZCA9IENvbHVtbihJbnRlZ2VyLCBwcmltYXJ5X2tleT1UcnVlLCBpbmRleD1UcnVlKQogICAgdGl0bGUgPSBDb2x1bW4oU3RyaW5nKDIwMCksIG51bGxhYmxlPUZhbHNlKQogICAgZGVzY3JpcHRpb24gPSBDb2x1bW4oU3RyaW5nKDUwMCkpCiAgICByb29tID0gQ29sdW1uKFN0cmluZyg1MCkpICAjIGJlZHJvb20xLCBiZWRyb29tMiwga2l0Y2hlbiwgYmF0aHJvb20xLCBldGMuCiAgICBmcmVxdWVuY3kgPSBDb2x1bW4oU1FMRW51bShDaG9yZUZyZXF1ZW5jeSksIG51bGxhYmxlPUZhbHNlKQogICAgcG9pbnRzID0gQ29sdW1uKEludGVnZXIsIGRlZmF1bHQ9MCkgICMgUG9pbnRzIGF3YXJkZWQgZm9yIGNvbXBsZXRpbmcgdGhlIGNob3JlCiAgICBzdGF0dXMgPSBDb2x1bW4oU1FMRW51bShDaG9yZVN0YXR1cyksIGRlZmF1bHQ9Q2hvcmVTdGF0dXMuUEVORElORykKICAgIGFzc2lnbmVkX3VzZXJfaWQgPSBDb2x1bW4oSW50ZWdlciwgRm9yZWlnbktleSgidXNlcnMuaWQiKSkKICAgIGR1ZV9kYXRlID0gQ29sdW1uKERhdGVUaW1lKQogICAgY29tcGxldGVkX2F0ID0gQ29sdW1uKERhdGVUaW1lKQogICAgY3JlYXRlZF9hdCA9IENvbHVtbihEYXRlVGltZSwgZGVmYXVsdD1kYXRldGltZS51dGNub3cpCiAgICB1cGRhdGVkX2F0ID0gQ29sdW1uKERhdGVUaW1lLCBkZWZhdWx0PWRhdGV0aW1lLnV0Y25vdywgb251cGRhdGU9ZGF0ZXRpbWUudXRjbm93KQogICAgCiAgICAjIFJlbGF0aW9uc2hpcHMKICAgIGFzc2lnbmVkX3VzZXIgPSByZWxhdGlvbnNoaXAoIlVzZXIiLCBiYWNrX3BvcHVsYXRlcz0iY2hvcmVzIikK