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.
88 lines
2.4 KiB
Python
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}"
|