LinkDesk/backend/models/notification.py

90 lines
3.6 KiB
Python

from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, Text, Enum as SQLEnum
from sqlalchemy.orm import relationship
from database import Base
from datetime import datetime
import enum
class NotificationType(str, enum.Enum):
TASK_ASSIGNED = "task_assigned"
TASK_STATUS_CHANGED = "task_status_changed"
SUBMISSION_REVIEWED = "submission_reviewed"
WORK_SUBMITTED = "work_submitted"
DEADLINE_APPROACHING = "deadline_approaching"
PROJECT_UPDATE = "project_update"
COMMENT_ADDED = "comment_added"
class NotificationPriority(str, enum.Enum):
LOW = "low"
NORMAL = "normal"
HIGH = "high"
URGENT = "urgent"
class Notification(Base):
__tablename__ = "notifications"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)
type = Column(SQLEnum(NotificationType), nullable=False)
priority = Column(SQLEnum(NotificationPriority), default=NotificationPriority.NORMAL)
title = Column(String(255), nullable=False)
message = Column(Text, nullable=False)
read = Column(Boolean, default=False, index=True)
# Optional references to related entities
project_id = Column(Integer, ForeignKey("projects.id"), nullable=True)
task_id = Column(Integer, ForeignKey("tasks.id"), nullable=True)
submission_id = Column(Integer, ForeignKey("submissions.id"), nullable=True)
# Email notification tracking
email_sent = Column(Boolean, default=False)
email_sent_at = Column(DateTime, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
read_at = Column(DateTime, nullable=True)
# Relationships
user = relationship("User", back_populates="notifications")
project = relationship("Project", foreign_keys=[project_id])
task = relationship("Task", foreign_keys=[task_id])
submission = relationship("Submission", foreign_keys=[submission_id])
class UserNotificationPreference(Base):
__tablename__ = "user_notification_preferences"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False, unique=True)
# Email notification preferences
email_enabled = Column(Boolean, default=True)
email_task_assigned = Column(Boolean, default=True)
email_task_status_changed = Column(Boolean, default=True)
email_submission_reviewed = Column(Boolean, default=True)
email_work_submitted = Column(Boolean, default=True)
email_deadline_approaching = Column(Boolean, default=True)
email_project_update = Column(Boolean, default=True)
email_comment_added = Column(Boolean, default=True)
# In-app notification preferences
inapp_enabled = Column(Boolean, default=True)
inapp_task_assigned = Column(Boolean, default=True)
inapp_task_status_changed = Column(Boolean, default=True)
inapp_submission_reviewed = Column(Boolean, default=True)
inapp_work_submitted = Column(Boolean, default=True)
inapp_deadline_approaching = Column(Boolean, default=True)
inapp_project_update = Column(Boolean, default=True)
inapp_comment_added = Column(Boolean, default=True)
# Digest settings
email_digest_enabled = Column(Boolean, default=False)
email_digest_frequency = Column(String(50), default="daily") # daily, weekly
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationships
user = relationship("User", back_populates="notification_preferences")