from rest_framework import serializers from rest_polymorphic.serializers import PolymorphicSerializer from .models import ( BoundingBoxProject, ImageCaptioningProject, ImageClassificationProject, IntentDetectionAndSlotFillingProject, Member, Project, SegmentationProject, Seq2seqProject, SequenceLabelingProject, Speech2textProject, Tag, TextClassificationProject, ) class MemberSerializer(serializers.ModelSerializer): username = serializers.SerializerMethodField() rolename = serializers.SerializerMethodField() @classmethod def get_username(cls, instance): user = instance.user return user.username if user else None @classmethod def get_rolename(cls, instance): role = instance.role return role.name if role else None class Meta: model = Member fields = ("id", "user", "role", "username", "rolename") class TagSerializer(serializers.ModelSerializer): class Meta: model = Tag fields = ( "id", "project", "text", ) read_only_fields = ("id", "project") class ProjectSerializer(serializers.ModelSerializer): tags = TagSerializer(many=True, required=False) author = serializers.SerializerMethodField() @classmethod def get_author(cls, instance): if instance.created_by: return instance.created_by.username return "" class Meta: model = Project fields = [ "id", "name", "description", "guideline", "project_type", "created_at", "updated_at", "random_order", "author", "collaborative_annotation", "single_class_classification", "is_text_project", "tags", ] read_only_fields = ( "created_at", "updated_at", "author", "is_text_project", ) def create(self, validated_data): tags = TagSerializer(data=validated_data.pop("tags", []), many=True) project = self.Meta.model.objects.create(**validated_data) tags.is_valid() tags.save(project=project) return project def update(self, instance, validated_data): # Don't update tags. Please use TagAPI. validated_data.pop("tags", None) return super().update(instance, validated_data) class TextClassificationProjectSerializer(ProjectSerializer): class Meta(ProjectSerializer.Meta): model = TextClassificationProject class SequenceLabelingProjectSerializer(ProjectSerializer): class Meta(ProjectSerializer.Meta): model = SequenceLabelingProject fields = ProjectSerializer.Meta.fields + ["allow_overlapping", "grapheme_mode", "use_relation"] class Seq2seqProjectSerializer(ProjectSerializer): class Meta(ProjectSerializer.Meta): model = Seq2seqProject class IntentDetectionAndSlotFillingProjectSerializer(ProjectSerializer): class Meta(ProjectSerializer.Meta): model = IntentDetectionAndSlotFillingProject class Speech2textProjectSerializer(ProjectSerializer): class Meta(ProjectSerializer.Meta): model = Speech2textProject class ImageClassificationProjectSerializer(ProjectSerializer): class Meta(ProjectSerializer.Meta): model = ImageClassificationProject class BoundingBoxProjectSerializer(ProjectSerializer): class Meta(ProjectSerializer.Meta): model = BoundingBoxProject class SegmentationProjectSerializer(ProjectSerializer): class Meta(ProjectSerializer.Meta): model = SegmentationProject class ImageCaptioningProjectSerializer(ProjectSerializer): class Meta(ProjectSerializer.Meta): model = ImageCaptioningProject class ProjectPolymorphicSerializer(PolymorphicSerializer): model_serializer_mapping = { Project: ProjectSerializer, **{cls.Meta.model: cls for cls in ProjectSerializer.__subclasses__()}, }