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() 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