|
|
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__()}, }
|