✏️ Fix: [#69] 알림 상세보기 직렬화 OCP 맞게 수정

This commit is contained in:
sm4640
2025-06-25 23:05:09 +09:00
parent a61442c884
commit f864a54017

View File

@@ -2,6 +2,30 @@ from .models import *
from projects.models import * from projects.models import *
from rest_framework import serializers from rest_framework import serializers
from common.models.choiceModels import NotificationType
NOTIFICATION_REL_MAP_REGISTRY = {
# "model" : "model_cls",
# "serializer" : "serializer_cls"
}
def register_notification_serializer(note_type:NotificationType, model_cls):
def wrapper(serializer_cls):
NOTIFICATION_REL_MAP_REGISTRY[note_type] = {'model' : model_cls, 'serializer' : serializer_cls}
return serializer_cls
return wrapper
@register_notification_serializer(NotificationType.PROJECT_INVITE, ProjectInvitation)
class ProjectInvitationMetaSerializer(serializers.ModelSerializer):
project_invitation_id = serializers.CharField(source='id')
project_title = serializers.CharField(source='project.title')
from_user_nickname = serializers.CharField(source='from_user.nickname')
class Meta:
model = ProjectInvitation
fields = ['project_invitation_id', 'project_title', 'from_user_nickname', 'status']
class NotificationSerializer(serializers.ModelSerializer): class NotificationSerializer(serializers.ModelSerializer):
meta = serializers.SerializerMethodField() meta = serializers.SerializerMethodField()
@@ -10,23 +34,10 @@ class NotificationSerializer(serializers.ModelSerializer):
fields = ['id', 'content', 'note_type', 'is_read', 'created_at', 'meta'] fields = ['id', 'content', 'note_type', 'is_read', 'created_at', 'meta']
def get_meta(self, obj): def get_meta(self, obj):
note_type = obj.note_type
REL_SERIALIZER_MAP = { rel_name = NOTIFICATION_REL_MAP_REGISTRY[note_type]['model']._meta.get_field('notification').remote_field.related_name
'project_invitation' : ProjectInvitationMetaSerializer, rel_obj = getattr(obj, rel_name, None)
} if rel_obj is not None:
return NOTIFICATION_REL_MAP_REGISTRY[note_type]['serializer'](rel_obj).data
for rel_name, serializer_cls in REL_SERIALIZER_MAP.items():
rel_obj = getattr(obj, rel_name, None)
if rel_obj is not None:
return serializer_cls(rel_obj).data
return None return None
class ProjectInvitationMetaSerializer(serializers.ModelSerializer):
project_invitation_id = serializers.CharField(source='id')
project_title = serializers.CharField(source='project.title')
from_user_nickname = serializers.CharField(source='from_user.nickname')
class Meta:
model = ProjectInvitation
fields = ['project_invitation_id', 'project_title', 'from_user_nickname', 'status']