78 lines
3.2 KiB
Python
78 lines
3.2 KiB
Python
"""
|
|
Сериализаторы для уведомлений.
|
|
"""
|
|
from rest_framework import serializers
|
|
from .models import Notification, NotificationPreference, ParentChildNotificationSettings, PushSubscription
|
|
|
|
|
|
class NotificationSerializer(serializers.ModelSerializer):
|
|
"""Сериализатор для уведомления."""
|
|
|
|
type_display = serializers.CharField(source='get_notification_type_display', read_only=True)
|
|
channel_display = serializers.CharField(source='get_channel_display', read_only=True)
|
|
|
|
class Meta:
|
|
model = Notification
|
|
fields = [
|
|
'id', 'notification_type', 'type_display', 'channel', 'channel_display',
|
|
'priority', 'title', 'message', 'data', 'action_url',
|
|
'is_read', 'read_at', 'is_sent', 'created_at'
|
|
]
|
|
read_only_fields = [
|
|
'id', 'is_sent', 'read_at', 'created_at'
|
|
]
|
|
|
|
|
|
class NotificationPreferenceSerializer(serializers.ModelSerializer):
|
|
"""Сериализатор для настроек уведомлений."""
|
|
|
|
class Meta:
|
|
model = NotificationPreference
|
|
fields = [
|
|
'id', 'enabled', 'email_enabled', 'telegram_enabled',
|
|
'in_app_enabled', 'type_preferences', 'quiet_hours_enabled',
|
|
'quiet_hours_start', 'quiet_hours_end'
|
|
]
|
|
read_only_fields = ['id']
|
|
|
|
|
|
class ParentChildNotificationSettingsSerializer(serializers.ModelSerializer):
|
|
"""Сериализатор для настроек уведомлений родителя для ребенка."""
|
|
|
|
child_name = serializers.CharField(source='child.user.get_full_name', read_only=True)
|
|
child_id = serializers.IntegerField(source='child.user.id', read_only=True)
|
|
|
|
class Meta:
|
|
model = ParentChildNotificationSettings
|
|
fields = [
|
|
'id', 'parent', 'child', 'child_id', 'child_name',
|
|
'enabled', 'type_settings', 'created_at', 'updated_at'
|
|
]
|
|
read_only_fields = ['id', 'parent', 'child', 'created_at', 'updated_at']
|
|
|
|
def validate_type_settings(self, value):
|
|
"""Валидация настроек типов уведомлений."""
|
|
if not isinstance(value, dict):
|
|
raise serializers.ValidationError("type_settings должен быть словарем")
|
|
|
|
# Проверяем, что все значения - булевы
|
|
from .models import Notification
|
|
valid_types = [choice[0] for choice in Notification.TYPE_CHOICES]
|
|
|
|
for key, val in value.items():
|
|
if key not in valid_types:
|
|
raise serializers.ValidationError(f"Неизвестный тип уведомления: {key}")
|
|
if not isinstance(val, bool):
|
|
raise serializers.ValidationError(f"Значение для {key} должно быть булевым")
|
|
|
|
return value
|
|
|
|
|
|
class PushSubscriptionSerializer(serializers.ModelSerializer):
|
|
"""Сериализатор для Push Subscription."""
|
|
|
|
class Meta:
|
|
model = PushSubscription
|
|
fields = ['id', 'subscription_data', 'user_agent', 'is_active', 'created_at', 'updated_at']
|
|
read_only_fields = ['id', 'created_at', 'updated_at']
|