-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodels.py
More file actions
91 lines (75 loc) · 3.05 KB
/
models.py
File metadata and controls
91 lines (75 loc) · 3.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""
SQLAlchemy models for the application
"""
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Enum, Date, Text
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from database import Base
import enum
class TaskStatus(str, enum.Enum):
PENDING = "Pending"
COMPLETED = "Completed"
class StageStatus(str, enum.Enum):
PENDING = "Pending"
COMPLETED = "Completed"
class UserRole(str, enum.Enum):
ADMIN = "Admin"
CREATOR = "Creator"
class ReminderType(str, enum.Enum):
EMAIL = "EMAIL"
WHATSAPP = "WHATSAPP"
IVR = "IVR"
class User(Base):
"""
User model for system users
"""
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(100), nullable=False)
email = Column(String(100), unique=True, nullable=False, index=True)
phone = Column(String(20), nullable=False)
role = Column(Enum(UserRole), default=UserRole.CREATOR)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
tasks = relationship("Task", back_populates="assigned_user")
class Task(Base):
"""
Task model representing a lesson
"""
__tablename__ = "tasks"
id = Column(Integer, primary_key=True, index=True)
lesson_id = Column(String(50), nullable=False, unique=True, index=True)
assigned_to = Column(Integer, ForeignKey("users.id"), nullable=False)
start_date = Column(Date, nullable=False)
due_date = Column(Date, nullable=False)
status = Column(Enum(TaskStatus), default=TaskStatus.PENDING)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
assigned_user = relationship("User", back_populates="tasks")
stages = relationship("TaskStage", back_populates="task", cascade="all, delete-orphan")
reminder_logs = relationship("ReminderLog", back_populates="task")
class TaskStage(Base):
"""
Task stage model for workflow tracking
"""
__tablename__ = "task_stages"
id = Column(Integer, primary_key=True, index=True)
task_id = Column(Integer, ForeignKey("tasks.id"), nullable=False)
stage_name = Column(String(100), nullable=False)
stage_status = Column(Enum(StageStatus), default=StageStatus.PENDING)
last_updated = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
# Relationships
task = relationship("Task", back_populates="stages")
class ReminderLog(Base):
"""
Reminder log model for tracking all reminders sent
"""
__tablename__ = "reminder_logs"
id = Column(Integer, primary_key=True, index=True)
task_id = Column(Integer, ForeignKey("tasks.id"), nullable=False)
reminder_type = Column(Enum(ReminderType), nullable=False)
sent_date = Column(DateTime(timezone=True), server_default=func.now())
# Relationships
task = relationship("Task", back_populates="reminder_logs")