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