final all done 2nd last plan before goign live
This commit is contained in:
90
backend/igny8_core/business/notifications/serializers.py
Normal file
90
backend/igny8_core/business/notifications/serializers.py
Normal file
@@ -0,0 +1,90 @@
|
||||
"""
|
||||
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.'
|
||||
)
|
||||
Reference in New Issue
Block a user