You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
4.0 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. from rest_framework import serializers
  2. from rest_polymorphic.serializers import PolymorphicSerializer
  3. from .models import (
  4. BoundingBoxProject,
  5. ImageCaptioningProject,
  6. ImageClassificationProject,
  7. IntentDetectionAndSlotFillingProject,
  8. Member,
  9. Project,
  10. SegmentationProject,
  11. Seq2seqProject,
  12. SequenceLabelingProject,
  13. Speech2textProject,
  14. Tag,
  15. TextClassificationProject,
  16. )
  17. class MemberSerializer(serializers.ModelSerializer):
  18. username = serializers.SerializerMethodField()
  19. rolename = serializers.SerializerMethodField()
  20. @classmethod
  21. def get_username(cls, instance):
  22. user = instance.user
  23. return user.username if user else None
  24. @classmethod
  25. def get_rolename(cls, instance):
  26. role = instance.role
  27. return role.name if role else None
  28. class Meta:
  29. model = Member
  30. fields = ("id", "user", "role", "username", "rolename")
  31. class TagSerializer(serializers.ModelSerializer):
  32. class Meta:
  33. model = Tag
  34. fields = (
  35. "id",
  36. "project",
  37. "text",
  38. )
  39. read_only_fields = ("id", "project")
  40. class ProjectSerializer(serializers.ModelSerializer):
  41. tags = TagSerializer(many=True, required=False)
  42. class Meta:
  43. model = Project
  44. fields = [
  45. "id",
  46. "name",
  47. "description",
  48. "guideline",
  49. "project_type",
  50. "updated_at",
  51. "random_order",
  52. "created_by",
  53. "collaborative_annotation",
  54. "single_class_classification",
  55. "is_text_project",
  56. "can_define_label",
  57. "can_define_relation",
  58. "can_define_category",
  59. "can_define_span",
  60. "tags",
  61. ]
  62. read_only_fields = (
  63. "updated_at",
  64. "is_text_project",
  65. "can_define_label",
  66. "can_define_relation",
  67. "can_define_category",
  68. "can_define_span",
  69. )
  70. def create(self, validated_data):
  71. tags = TagSerializer(data=validated_data.pop("tags", []), many=True)
  72. project = self.Meta.model.objects.create(**validated_data)
  73. tags.is_valid()
  74. tags.save(project=project)
  75. return project
  76. def update(self, instance, validated_data):
  77. # Don't update tags. Please use TagAPI.
  78. validated_data.pop("tags", None)
  79. return super().update(instance, validated_data)
  80. class TextClassificationProjectSerializer(ProjectSerializer):
  81. class Meta(ProjectSerializer.Meta):
  82. model = TextClassificationProject
  83. class SequenceLabelingProjectSerializer(ProjectSerializer):
  84. class Meta(ProjectSerializer.Meta):
  85. model = SequenceLabelingProject
  86. fields = ProjectSerializer.Meta.fields + ["allow_overlapping", "grapheme_mode", "use_relation"]
  87. class Seq2seqProjectSerializer(ProjectSerializer):
  88. class Meta(ProjectSerializer.Meta):
  89. model = Seq2seqProject
  90. class IntentDetectionAndSlotFillingProjectSerializer(ProjectSerializer):
  91. class Meta(ProjectSerializer.Meta):
  92. model = IntentDetectionAndSlotFillingProject
  93. class Speech2textProjectSerializer(ProjectSerializer):
  94. class Meta(ProjectSerializer.Meta):
  95. model = Speech2textProject
  96. class ImageClassificationProjectSerializer(ProjectSerializer):
  97. class Meta(ProjectSerializer.Meta):
  98. model = ImageClassificationProject
  99. class BoundingBoxProjectSerializer(ProjectSerializer):
  100. class Meta(ProjectSerializer.Meta):
  101. model = BoundingBoxProject
  102. class SegmentationProjectSerializer(ProjectSerializer):
  103. class Meta(ProjectSerializer.Meta):
  104. model = SegmentationProject
  105. class ImageCaptioningProjectSerializer(ProjectSerializer):
  106. class Meta(ProjectSerializer.Meta):
  107. model = ImageCaptioningProject
  108. class ProjectPolymorphicSerializer(PolymorphicSerializer):
  109. model_serializer_mapping = {
  110. Project: ProjectSerializer,
  111. **{cls.Meta.model: cls for cls in ProjectSerializer.__subclasses__()},
  112. }