99 lines
2.4 KiB
Python
99 lines
2.4 KiB
Python
from pydantic import BaseModel, Field
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
from enum import Enum
|
|
|
|
|
|
class NotificationType(str, 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):
|
|
LOW = "low"
|
|
NORMAL = "normal"
|
|
HIGH = "high"
|
|
URGENT = "urgent"
|
|
|
|
|
|
class NotificationBase(BaseModel):
|
|
type: NotificationType
|
|
priority: NotificationPriority = NotificationPriority.NORMAL
|
|
title: str = Field(..., max_length=255)
|
|
message: str
|
|
project_id: Optional[int] = None
|
|
task_id: Optional[int] = None
|
|
submission_id: Optional[int] = None
|
|
|
|
|
|
class NotificationCreate(NotificationBase):
|
|
user_id: int
|
|
|
|
|
|
class NotificationResponse(NotificationBase):
|
|
id: int
|
|
user_id: int
|
|
read: bool
|
|
email_sent: bool
|
|
email_sent_at: Optional[datetime] = None
|
|
created_at: datetime
|
|
read_at: Optional[datetime] = None
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class NotificationMarkRead(BaseModel):
|
|
notification_ids: list[int]
|
|
|
|
|
|
class NotificationPreferencesBase(BaseModel):
|
|
# Email notification preferences
|
|
email_enabled: bool = True
|
|
email_task_assigned: bool = True
|
|
email_task_status_changed: bool = True
|
|
email_submission_reviewed: bool = True
|
|
email_work_submitted: bool = True
|
|
email_deadline_approaching: bool = True
|
|
email_project_update: bool = True
|
|
email_comment_added: bool = True
|
|
|
|
# In-app notification preferences
|
|
inapp_enabled: bool = True
|
|
inapp_task_assigned: bool = True
|
|
inapp_task_status_changed: bool = True
|
|
inapp_submission_reviewed: bool = True
|
|
inapp_work_submitted: bool = True
|
|
inapp_deadline_approaching: bool = True
|
|
inapp_project_update: bool = True
|
|
inapp_comment_added: bool = True
|
|
|
|
# Digest settings
|
|
email_digest_enabled: bool = False
|
|
email_digest_frequency: str = "daily"
|
|
|
|
|
|
class NotificationPreferencesUpdate(NotificationPreferencesBase):
|
|
pass
|
|
|
|
|
|
class NotificationPreferencesResponse(NotificationPreferencesBase):
|
|
id: int
|
|
user_id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class NotificationStats(BaseModel):
|
|
total: int
|
|
unread: int
|
|
by_type: dict[str, int]
|