from rest_framework import serializers from rest_polymorphic.serializers import PolymorphicSerializer from .models import Tag, Project, TextClassificationProject, SequenceLabelingProject, Seq2seqProject, \ IntentDetectionAndSlotFillingProject, Speech2textProject, ImageClassificationProject from .models import Member 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) class Meta: model = Project fields = ( 'id', 'name', 'description', 'guideline', 'project_type', 'updated_at', 'random_order', 'created_by', 'collaborative_annotation', 'single_class_classification', 'is_text_project', 'can_define_label', 'can_define_relation', 'can_define_category', 'can_define_span', 'tags' ) read_only_fields = ( 'updated_at', 'is_text_project', 'can_define_label', 'can_define_relation', 'can_define_category', 'can_define_span', 'tags' ) 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') 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 ProjectPolymorphicSerializer(PolymorphicSerializer): model_serializer_mapping = { Project: ProjectSerializer, **{ cls.Meta.model: cls for cls in ProjectSerializer.__subclasses__() } }