91 lines
2.5 KiB
Python
91 lines
2.5 KiB
Python
"""
|
|
Notification Serializers
|
|
"""
|
|
|
|
from rest_framework import serializers
|
|
|
|
from .models import Notification
|
|
|
|
|
|
class NotificationSerializer(serializers.ModelSerializer):
|
|
"""Serializer for Notification model"""
|
|
|
|
site_name = serializers.CharField(source='site.name', read_only=True, default=None)
|
|
|
|
class Meta:
|
|
model = Notification
|
|
fields = [
|
|
'id',
|
|
'notification_type',
|
|
'title',
|
|
'message',
|
|
'severity',
|
|
'site',
|
|
'site_name',
|
|
'action_url',
|
|
'action_label',
|
|
'is_read',
|
|
'read_at',
|
|
'metadata',
|
|
'created_at',
|
|
]
|
|
read_only_fields = ['id', 'created_at', 'read_at']
|
|
|
|
|
|
class NotificationListSerializer(serializers.ModelSerializer):
|
|
"""Lightweight serializer for notification lists"""
|
|
|
|
site_name = serializers.CharField(source='site.name', read_only=True, default=None)
|
|
time_ago = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Notification
|
|
fields = [
|
|
'id',
|
|
'notification_type',
|
|
'title',
|
|
'message',
|
|
'severity',
|
|
'site_name',
|
|
'action_url',
|
|
'action_label',
|
|
'is_read',
|
|
'created_at',
|
|
'time_ago',
|
|
'metadata',
|
|
]
|
|
|
|
def get_time_ago(self, obj):
|
|
"""Return human-readable time since notification"""
|
|
from django.utils import timezone
|
|
from datetime import timedelta
|
|
|
|
now = timezone.now()
|
|
diff = now - obj.created_at
|
|
|
|
if diff < timedelta(minutes=1):
|
|
return 'Just now'
|
|
elif diff < timedelta(hours=1):
|
|
minutes = int(diff.total_seconds() / 60)
|
|
return f'{minutes} minute{"s" if minutes != 1 else ""} ago'
|
|
elif diff < timedelta(days=1):
|
|
hours = int(diff.total_seconds() / 3600)
|
|
return f'{hours} hour{"s" if hours != 1 else ""} ago'
|
|
elif diff < timedelta(days=7):
|
|
days = diff.days
|
|
if days == 1:
|
|
return 'Yesterday'
|
|
return f'{days} days ago'
|
|
else:
|
|
return obj.created_at.strftime('%b %d, %Y')
|
|
|
|
|
|
class MarkReadSerializer(serializers.Serializer):
|
|
"""Serializer for marking notifications as read"""
|
|
|
|
notification_ids = serializers.ListField(
|
|
child=serializers.IntegerField(),
|
|
required=False,
|
|
help_text='List of notification IDs to mark as read. If empty, marks all as read.'
|
|
)
|