✏️ Fix: [#69] 알림 상세보기 직렬화 OCP 맞게 수정
This commit is contained in:
@@ -2,25 +2,21 @@ from .models import *
|
|||||||
from projects.models import *
|
from projects.models import *
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
class NotificationSerializer(serializers.ModelSerializer):
|
from common.models.choiceModels import NotificationType
|
||||||
meta = serializers.SerializerMethodField()
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = Notification
|
|
||||||
fields = ['id', 'content', 'note_type', 'is_read', 'created_at', 'meta']
|
|
||||||
|
|
||||||
def get_meta(self, obj):
|
NOTIFICATION_REL_MAP_REGISTRY = {
|
||||||
|
# "model" : "model_cls",
|
||||||
|
# "serializer" : "serializer_cls"
|
||||||
|
}
|
||||||
|
|
||||||
REL_SERIALIZER_MAP = {
|
def register_notification_serializer(note_type:NotificationType, model_cls):
|
||||||
'project_invitation' : ProjectInvitationMetaSerializer,
|
def wrapper(serializer_cls):
|
||||||
}
|
NOTIFICATION_REL_MAP_REGISTRY[note_type] = {'model' : model_cls, 'serializer' : serializer_cls}
|
||||||
|
return serializer_cls
|
||||||
for rel_name, serializer_cls in REL_SERIALIZER_MAP.items():
|
return wrapper
|
||||||
rel_obj = getattr(obj, rel_name, None)
|
|
||||||
if rel_obj is not None:
|
|
||||||
return serializer_cls(rel_obj).data
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
@register_notification_serializer(NotificationType.PROJECT_INVITE, ProjectInvitation)
|
||||||
class ProjectInvitationMetaSerializer(serializers.ModelSerializer):
|
class ProjectInvitationMetaSerializer(serializers.ModelSerializer):
|
||||||
project_invitation_id = serializers.CharField(source='id')
|
project_invitation_id = serializers.CharField(source='id')
|
||||||
project_title = serializers.CharField(source='project.title')
|
project_title = serializers.CharField(source='project.title')
|
||||||
@@ -30,3 +26,18 @@ class ProjectInvitationMetaSerializer(serializers.ModelSerializer):
|
|||||||
model = ProjectInvitation
|
model = ProjectInvitation
|
||||||
fields = ['project_invitation_id', 'project_title', 'from_user_nickname', 'status']
|
fields = ['project_invitation_id', 'project_title', 'from_user_nickname', 'status']
|
||||||
|
|
||||||
|
class NotificationSerializer(serializers.ModelSerializer):
|
||||||
|
meta = serializers.SerializerMethodField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Notification
|
||||||
|
fields = ['id', 'content', 'note_type', 'is_read', 'created_at', 'meta']
|
||||||
|
|
||||||
|
def get_meta(self, obj):
|
||||||
|
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
|
||||||
|
|
||||||
Reference in New Issue
Block a user