mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2026-02-05 14:35:17 -05:00
feat: add passkey authentication and enhance user preferences - Add passkey login security event type with fingerprint icon - Include request and site context in email confirmation for backend - Add user_id exact match filter to prevent incorrect user lookups - Enable PATCH method for updating user preferences via API - Add moderation_preferences support to user settings - Optimize ticket queries with select_related and prefetch_related This commit introduces passkey authentication tracking, improves user profile filtering accuracy, and extends the preferences API to support updates. Query optimizations reduce database hits for ticket listings.
160 lines
5.3 KiB
Python
160 lines
5.3 KiB
Python
"""
|
|
Notification serializers.
|
|
"""
|
|
|
|
from rest_framework import serializers
|
|
|
|
from apps.core.choices.serializers import RichChoiceSerializerField
|
|
|
|
from .models import NotificationLog, NotificationPreference, Subscriber, SystemAnnouncement
|
|
|
|
|
|
class SubscriberSerializer(serializers.ModelSerializer):
|
|
"""Serializer for Subscriber model."""
|
|
|
|
subscriber_id = serializers.CharField(source="novu_subscriber_id", read_only=True)
|
|
|
|
class Meta:
|
|
model = Subscriber
|
|
fields = [
|
|
"subscriber_id",
|
|
"first_name",
|
|
"last_name",
|
|
"email",
|
|
"phone",
|
|
"avatar",
|
|
"locale",
|
|
"data",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["subscriber_id", "created_at", "updated_at"]
|
|
|
|
|
|
class CreateSubscriberSerializer(serializers.Serializer):
|
|
"""Serializer for creating a new subscriber."""
|
|
|
|
subscriber_id = serializers.CharField(required=True)
|
|
first_name = serializers.CharField(required=False, allow_blank=True, default="")
|
|
last_name = serializers.CharField(required=False, allow_blank=True, default="")
|
|
email = serializers.EmailField(required=False, allow_blank=True)
|
|
phone = serializers.CharField(required=False, allow_blank=True, default="")
|
|
avatar = serializers.URLField(required=False, allow_blank=True)
|
|
locale = serializers.CharField(required=False, default="en")
|
|
data = serializers.JSONField(required=False, default=dict)
|
|
|
|
|
|
class UpdateSubscriberSerializer(serializers.Serializer):
|
|
"""Serializer for updating a subscriber."""
|
|
|
|
subscriber_id = serializers.CharField(required=True)
|
|
first_name = serializers.CharField(required=False, allow_blank=True)
|
|
last_name = serializers.CharField(required=False, allow_blank=True)
|
|
email = serializers.EmailField(required=False, allow_blank=True)
|
|
phone = serializers.CharField(required=False, allow_blank=True)
|
|
avatar = serializers.URLField(required=False, allow_blank=True)
|
|
locale = serializers.CharField(required=False)
|
|
data = serializers.JSONField(required=False)
|
|
|
|
|
|
class NotificationPreferenceSerializer(serializers.ModelSerializer):
|
|
"""Serializer for NotificationPreference model."""
|
|
|
|
class Meta:
|
|
model = NotificationPreference
|
|
fields = [
|
|
"channel_preferences",
|
|
"workflow_preferences",
|
|
"frequency_settings",
|
|
"is_opted_out",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["updated_at"]
|
|
|
|
|
|
class UpdatePreferencesSerializer(serializers.Serializer):
|
|
"""Serializer for updating notification preferences."""
|
|
|
|
user_id = serializers.CharField(required=True)
|
|
preferences = serializers.JSONField(required=True)
|
|
|
|
|
|
class TriggerNotificationSerializer(serializers.Serializer):
|
|
"""Serializer for triggering a notification."""
|
|
|
|
workflow_id = serializers.CharField(required=True)
|
|
subscriber_id = serializers.CharField(required=True)
|
|
payload = serializers.JSONField(required=False, default=dict)
|
|
overrides = serializers.JSONField(required=False, default=dict)
|
|
|
|
|
|
class ModeratorSubmissionNotificationSerializer(serializers.Serializer):
|
|
"""Serializer for moderator submission notifications."""
|
|
|
|
submission_id = serializers.CharField(required=True)
|
|
submission_type = serializers.CharField(required=True)
|
|
submitter_name = serializers.CharField(required=True)
|
|
action = serializers.CharField(required=True)
|
|
|
|
|
|
class ModeratorReportNotificationSerializer(serializers.Serializer):
|
|
"""Serializer for moderator report notifications."""
|
|
|
|
report_id = serializers.CharField(required=True)
|
|
report_type = serializers.CharField(required=True)
|
|
reported_entity_type = serializers.CharField(required=True)
|
|
reported_entity_id = serializers.CharField(required=True)
|
|
reporter_name = serializers.CharField(required=True)
|
|
reason = serializers.CharField(required=True)
|
|
entity_preview = serializers.CharField(required=False, allow_blank=True)
|
|
reported_at = serializers.DateTimeField(required=False)
|
|
|
|
|
|
class SystemAnnouncementSerializer(serializers.ModelSerializer):
|
|
"""Serializer for system announcements."""
|
|
|
|
class Meta:
|
|
model = SystemAnnouncement
|
|
fields = [
|
|
"id",
|
|
"title",
|
|
"message",
|
|
"severity",
|
|
"action_url",
|
|
"is_active",
|
|
"created_at",
|
|
"expires_at",
|
|
]
|
|
read_only_fields = ["id", "created_at"]
|
|
|
|
|
|
class CreateAnnouncementSerializer(serializers.Serializer):
|
|
"""Serializer for creating system announcements."""
|
|
|
|
title = serializers.CharField(required=True, max_length=255)
|
|
message = serializers.CharField(required=True)
|
|
severity = RichChoiceSerializerField(
|
|
choice_group="announcement_severities",
|
|
domain="notifications",
|
|
default="info",
|
|
)
|
|
action_url = serializers.URLField(required=False, allow_blank=True)
|
|
|
|
|
|
class NotificationLogSerializer(serializers.ModelSerializer):
|
|
"""Serializer for notification logs."""
|
|
|
|
class Meta:
|
|
model = NotificationLog
|
|
fields = [
|
|
"id",
|
|
"workflow_id",
|
|
"notification_type",
|
|
"channel",
|
|
"status",
|
|
"payload",
|
|
"error_message",
|
|
"created_at",
|
|
]
|
|
read_only_fields = ["id", "created_at"]
|