From f864a54017e89c987a63e3ccfea02108bb90be40 Mon Sep 17 00:00:00 2001 From: sm4640 Date: Wed, 25 Jun 2025 23:05:09 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix:=20[#69]=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EC=83=81=EC=84=B8=EB=B3=B4=EA=B8=B0=20=EC=A7=81?= =?UTF-8?q?=EB=A0=AC=ED=99=94=20OCP=20=EB=A7=9E=EA=B2=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notifications/serializers.py | 47 ++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/notifications/serializers.py b/notifications/serializers.py index a5c8514..22f6514 100644 --- a/notifications/serializers.py +++ b/notifications/serializers.py @@ -2,6 +2,30 @@ from .models import * from projects.models import * 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): meta = serializers.SerializerMethodField() @@ -10,23 +34,10 @@ class NotificationSerializer(serializers.ModelSerializer): fields = ['id', 'content', 'note_type', 'is_read', 'created_at', 'meta'] def get_meta(self, obj): - - REL_SERIALIZER_MAP = { - 'project_invitation' : ProjectInvitationMetaSerializer, - } - - 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 + note_type = obj.note_type + rel_name = NOTIFICATION_REL_MAP_REGISTRY[note_type]['model']._meta.get_field('notification').remote_field.related_name + rel_obj = getattr(obj, rel_name, None) + if rel_obj is not None: + return NOTIFICATION_REL_MAP_REGISTRY[note_type]['serializer'](rel_obj).data 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'] \ No newline at end of file