Files
2025-12-27 22:32:29 +00:00

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.'
)