""" Сериализаторы для уведомлений. """ 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']