Files
guilan-ace-backend/apps/communications/models.py
Amirhossein Khalili 3ec28638d1 feat: replace email flows with in-app notifications
Add recipient notification detail and filtering, a queued admin composer, and contextual automatic titles. Retire email delivery, obsolete auth routes, newsletter data, and related templates and settings.
2026-09-26 12:23:10 +03:30

88 lines
2.4 KiB
Python

from django.db import models
from django.contrib.auth import get_user_model
from core.models import BaseModel
User = get_user_model()
class AnnouncementType(models.TextChoices):
GENERAL = 'general', 'General'
EVENT = 'event', 'Event'
ACADEMIC = 'academic', 'Academic'
URGENT = 'urgent', 'Urgent'
class AnnouncementPriority(models.TextChoices):
LOW = 'low', 'Low'
NORMAL = 'normal', 'Normal'
HIGH = 'high', 'High'
URGENT = 'urgent', 'Urgent'
class Announcement(BaseModel):
title = models.CharField(max_length=200, verbose_name='Title')
content = models.TextField(verbose_name='Content')
announcement_type = models.CharField(
max_length=20,
choices=AnnouncementType.choices,
default=AnnouncementType.GENERAL,
verbose_name='Type'
)
priority = models.CharField(
max_length=10,
choices=AnnouncementPriority.choices,
default=AnnouncementPriority.NORMAL,
verbose_name='Priority'
)
author = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='announcements',
verbose_name='Author'
)
is_published = models.BooleanField(default=False, verbose_name='Published')
publish_date = models.DateTimeField(null=True, blank=True, verbose_name='Publish Date')
class Meta:
verbose_name = 'Announcement'
verbose_name_plural = 'Announcements'
ordering = ['-created_at']
def __str__(self):
return self.title
@property
def content_html(self):
"""Convert markdown content to HTML"""
import markdown
return markdown.markdown(self.content)
class PushNotificationDevice(BaseModel):
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='push_devices',
verbose_name='User'
)
device_token = models.TextField(verbose_name='Device Token')
device_type = models.CharField(
max_length=10,
choices=[
('web', 'Web'),
('android', 'Android'),
('ios', 'iOS'),
],
verbose_name='Device Type'
)
is_active = models.BooleanField(default=True, verbose_name='Active')
class Meta:
verbose_name = 'Push Notification Device'
verbose_name_plural = 'Push Notification Devices'
unique_together = ['user', 'device_token']
def __str__(self):
return f"{self.user.username} - {self.device_type}"