This commit is contained in:
2025-12-13 14:39:50 +03:00
commit b666cdcb95
79 changed files with 3081 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
from app.models.user import User, UserRole
from app.models.schedule import Schedule
from app.models.task import Task
from app.models.reward import Reward
from app.models.ai_conversation import AIConversation
__all__ = [
"User",
"UserRole",
"Schedule",
"Task",
"Reward",
"AIConversation",
]

View File

@@ -0,0 +1,19 @@
from sqlalchemy import Column, String, ForeignKey, Text, Integer, JSON
from sqlalchemy.orm import relationship
from app.db.base import BaseModel
class AIConversation(BaseModel):
__tablename__ = "ai_conversations"
user_id = Column(String, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
conversation_id = Column(String, nullable=False, unique=True, index=True)
message = Column(Text, nullable=False)
response = Column(Text, nullable=False)
tokens_used = Column(Integer, nullable=True)
model = Column(String(100), nullable=True)
context = Column(JSON, nullable=True) # Сохранение контекста для продолжения диалога
# Relationships
user = relationship("User", back_populates="conversations")

View File

@@ -0,0 +1,18 @@
from sqlalchemy import Column, String, Integer, ForeignKey, Text
from sqlalchemy.orm import relationship
from app.db.base import BaseModel
class Reward(BaseModel):
__tablename__ = "rewards"
user_id = Column(String, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
title = Column(String(255), nullable=False)
description = Column(Text, nullable=True)
image_url = Column(String(500), nullable=True)
points_required = Column(Integer, nullable=False, default=1)
is_claimed = Column(Boolean, default=False, nullable=False)
# Relationships
user = relationship("User", back_populates="rewards")

View File

@@ -0,0 +1,17 @@
from sqlalchemy import Column, String, Date, ForeignKey
from sqlalchemy.orm import relationship
from app.db.base import BaseModel
class Schedule(BaseModel):
__tablename__ = "schedules"
user_id = Column(String, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
title = Column(String(255), nullable=False)
date = Column(Date, nullable=False, index=True)
description = Column(String(1000), nullable=True)
# Relationships
user = relationship("User", back_populates="schedules")
tasks = relationship("Task", back_populates="schedule", cascade="all, delete-orphan", order_by="Task.order")

View File

@@ -0,0 +1,20 @@
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Text
from sqlalchemy.orm import relationship
from app.db.base import BaseModel
class Task(BaseModel):
__tablename__ = "tasks"
schedule_id = Column(String, ForeignKey("schedules.id", ondelete="CASCADE"), nullable=False, index=True)
title = Column(String(255), nullable=False)
description = Column(Text, nullable=True)
image_url = Column(String(500), nullable=True)
duration_minutes = Column(Integer, nullable=False, default=30)
completed = Column(Boolean, default=False, nullable=False)
order = Column(Integer, nullable=False, default=0)
category = Column(String(100), nullable=True)
# Relationships
schedule = relationship("Schedule", back_populates="tasks")

View File

@@ -0,0 +1,25 @@
from sqlalchemy import Column, String, Enum
from sqlalchemy.orm import relationship
import enum
from app.db.base import BaseModel
class UserRole(str, enum.Enum):
CHILD = "CHILD"
PARENT = "PARENT"
EDUCATOR = "EDUCATOR"
class User(BaseModel):
__tablename__ = "users"
email = Column(String(255), unique=True, nullable=False, index=True)
hashed_password = Column(String(255), nullable=False)
role = Column(Enum(UserRole), nullable=False, default=UserRole.CHILD)
full_name = Column(String(255), nullable=True)
# Relationships
schedules = relationship("Schedule", back_populates="user", cascade="all, delete-orphan")
rewards = relationship("Reward", back_populates="user", cascade="all, delete-orphan")
conversations = relationship("AIConversation", back_populates="user", cascade="all, delete-orphan")