We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Create a simple interface for fetching datatypes schemas on grand-challenge 
**Problem**
The grand-challenge datatypes are currently only stored in the [gc-api](https://github.com/DIAGNijmegen/rse-gcapi/tree/master/gcapi/schemas) repository. However, the information is required by other libraries as well. Duplication of this information seems bad.

**Solution**
* [x] It would be nice to have this information in a central location like grand-challenge and provide a simple GET interface to allow the libraries /comic/evalutils and /DIAGNijmegen/rse-gcapi/ to fetch and cache this information (only a few kbs) from grand-challenge.
* [x] The answer type schemas should be added to the generated schema


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `app/grandchallenge/reader_studies/serializers.py`
Content:
```
1 from rest_framework.exceptions import ValidationError
2 from rest_framework.fields import CharField
3 from rest_framework.relations import HyperlinkedRelatedField, SlugRelatedField
4 from rest_framework.serializers import (
5     HyperlinkedModelSerializer,
6     SerializerMethodField,
7 )
8 
9 from grandchallenge.api.swagger import swagger_schema_fields_for_charfield
10 from grandchallenge.cases.models import Image
11 from grandchallenge.reader_studies.models import Answer, Question, ReaderStudy
12 
13 
14 class QuestionSerializer(HyperlinkedModelSerializer):
15     answer_type = CharField(source="get_answer_type_display")
16     reader_study = HyperlinkedRelatedField(
17         view_name="api:reader-study-detail", read_only=True
18     )
19     form_direction = CharField(source="get_direction_display")
20     image_port = CharField(source="get_image_port_display")
21 
22     class Meta:
23         model = Question
24         fields = (
25             "answer_type",
26             "api_url",
27             "form_direction",
28             "help_text",
29             "image_port",
30             "pk",
31             "question_text",
32             "reader_study",
33             "required",
34         )
35         swagger_schema_fields = swagger_schema_fields_for_charfield(
36             answer_type=model._meta.get_field("answer_type"),
37             form_direction=model._meta.get_field(
38                 "direction"
39             ),  # model.direction gets remapped
40             image_port=model._meta.get_field("image_port"),
41         )
42 
43 
44 class ReaderStudySerializer(HyperlinkedModelSerializer):
45     questions = QuestionSerializer(many=True, read_only=True)
46     hanging_list_images = SerializerMethodField()
47 
48     class Meta:
49         model = ReaderStudy
50         fields = (
51             "api_url",
52             "description",
53             "hanging_list_images",
54             "is_valid",
55             "pk",
56             "questions",
57             "title",
58         )
59 
60     def get_hanging_list_images(self, obj: ReaderStudy):
61         """Used by hanging_list_images serializer field."""
62         return obj.get_hanging_list_images_for_user(
63             user=self.context["request"].user
64         )
65 
66 
67 class AnswerSerializer(HyperlinkedModelSerializer):
68     creator = SlugRelatedField(read_only=True, slug_field="username")
69     question = HyperlinkedRelatedField(
70         view_name="api:reader-studies-question-detail",
71         queryset=Question.objects.all(),
72     )
73     images = HyperlinkedRelatedField(
74         many=True, queryset=Image.objects.all(), view_name="api:image-detail"
75     )
76 
77     def validate(self, attrs):
78         question = attrs["question"]
79         images = attrs["images"]
80         answer = attrs["answer"]
81         creator = self.context.get("request").user
82 
83         if not question.reader_study.is_reader(user=creator):
84             raise ValidationError("This user is not a reader for this study.")
85 
86         if not question.is_answer_valid(answer=answer):
87             raise ValidationError(
88                 f"You answer is not the correct type. "
89                 f"{question.get_answer_type_display()} expected, "
90                 f"{type(answer)} found."
91             )
92 
93         if len(images) == 0:
94             raise ValidationError(
95                 "You must specify the images that this answer corresponds to."
96             )
97 
98         reader_study_images = question.reader_study.images.all()
99         for im in images:
100             if im not in reader_study_images:
101                 raise ValidationError(
102                     f"Image {im} does not belong to this reader study."
103                 )
104 
105         if Answer.objects.filter(
106             creator=creator, question=question, images__in=images
107         ).exists():
108             raise ValidationError(
109                 f"User {creator} has already answered this question "
110                 f"for at least 1 of these images."
111             )
112 
113         return attrs
114 
115     class Meta:
116         model = Answer
117         fields = (
118             "answer",
119             "api_url",
120             "created",
121             "creator",
122             "images",
123             "pk",
124             "question",
125         )
126
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/app/grandchallenge/reader_studies/serializers.py b/app/grandchallenge/reader_studies/serializers.py
--- a/app/grandchallenge/reader_studies/serializers.py
+++ b/app/grandchallenge/reader_studies/serializers.py
@@ -8,7 +8,12 @@
 
 from grandchallenge.api.swagger import swagger_schema_fields_for_charfield
 from grandchallenge.cases.models import Image
-from grandchallenge.reader_studies.models import Answer, Question, ReaderStudy
+from grandchallenge.reader_studies.models import (
+    ANSWER_TYPE_SCHEMA,
+    Answer,
+    Question,
+    ReaderStudy,
+)
 
 
 class QuestionSerializer(HyperlinkedModelSerializer):
@@ -123,3 +128,6 @@
             "pk",
             "question",
         )
+        swagger_schema_fields = {
+            "properties": {"answer": {"title": "Answer", **ANSWER_TYPE_SCHEMA}}
+        }

{"golden_diff": "diff --git a/app/grandchallenge/reader_studies/serializers.py b/app/grandchallenge/reader_studies/serializers.py\n--- a/app/grandchallenge/reader_studies/serializers.py\n+++ b/app/grandchallenge/reader_studies/serializers.py\n@@ -8,7 +8,12 @@\n \n from grandchallenge.api.swagger import swagger_schema_fields_for_charfield\n from grandchallenge.cases.models import Image\n-from grandchallenge.reader_studies.models import Answer, Question, ReaderStudy\n+from grandchallenge.reader_studies.models import (\n+    ANSWER_TYPE_SCHEMA,\n+    Answer,\n+    Question,\n+    ReaderStudy,\n+)\n \n \n class QuestionSerializer(HyperlinkedModelSerializer):\n@@ -123,3 +128,6 @@\n             \"pk\",\n             \"question\",\n         )\n+        swagger_schema_fields = {\n+            \"properties\": {\"answer\": {\"title\": \"Answer\", **ANSWER_TYPE_SCHEMA}}\n+        }\n", "issue": "Create a simple interface for fetching datatypes schemas on grand-challenge \n**Problem**\r\nThe grand-challenge datatypes are currently only stored in the [gc-api](https://github.com/DIAGNijmegen/rse-gcapi/tree/master/gcapi/schemas) repository. However, the information is required by other libraries as well. Duplication of this information seems bad.\r\n\r\n**Solution**\r\n* [x] It would be nice to have this information in a central location like grand-challenge and provide a simple GET interface to allow the libraries /comic/evalutils and /DIAGNijmegen/rse-gcapi/ to fetch and cache this information (only a few kbs) from grand-challenge.\r\n* [x] The answer type schemas should be added to the generated schema\r\n\n", "before_files": [{"content": "from rest_framework.exceptions import ValidationError\nfrom rest_framework.fields import CharField\nfrom rest_framework.relations import HyperlinkedRelatedField, SlugRelatedField\nfrom rest_framework.serializers import (\n    HyperlinkedModelSerializer,\n    SerializerMethodField,\n)\n\nfrom grandchallenge.api.swagger import swagger_schema_fields_for_charfield\nfrom grandchallenge.cases.models import Image\nfrom grandchallenge.reader_studies.models import Answer, Question, ReaderStudy\n\n\nclass QuestionSerializer(HyperlinkedModelSerializer):\n    answer_type = CharField(source=\"get_answer_type_display\")\n    reader_study = HyperlinkedRelatedField(\n        view_name=\"api:reader-study-detail\", read_only=True\n    )\n    form_direction = CharField(source=\"get_direction_display\")\n    image_port = CharField(source=\"get_image_port_display\")\n\n    class Meta:\n        model = Question\n        fields = (\n            \"answer_type\",\n            \"api_url\",\n            \"form_direction\",\n            \"help_text\",\n            \"image_port\",\n            \"pk\",\n            \"question_text\",\n            \"reader_study\",\n            \"required\",\n        )\n        swagger_schema_fields = swagger_schema_fields_for_charfield(\n            answer_type=model._meta.get_field(\"answer_type\"),\n            form_direction=model._meta.get_field(\n                \"direction\"\n            ),  # model.direction gets remapped\n            image_port=model._meta.get_field(\"image_port\"),\n        )\n\n\nclass ReaderStudySerializer(HyperlinkedModelSerializer):\n    questions = QuestionSerializer(many=True, read_only=True)\n    hanging_list_images = SerializerMethodField()\n\n    class Meta:\n        model = ReaderStudy\n        fields = (\n            \"api_url\",\n            \"description\",\n            \"hanging_list_images\",\n            \"is_valid\",\n            \"pk\",\n            \"questions\",\n            \"title\",\n        )\n\n    def get_hanging_list_images(self, obj: ReaderStudy):\n        \"\"\"Used by hanging_list_images serializer field.\"\"\"\n        return obj.get_hanging_list_images_for_user(\n            user=self.context[\"request\"].user\n        )\n\n\nclass AnswerSerializer(HyperlinkedModelSerializer):\n    creator = SlugRelatedField(read_only=True, slug_field=\"username\")\n    question = HyperlinkedRelatedField(\n        view_name=\"api:reader-studies-question-detail\",\n        queryset=Question.objects.all(),\n    )\n    images = HyperlinkedRelatedField(\n        many=True, queryset=Image.objects.all(), view_name=\"api:image-detail\"\n    )\n\n    def validate(self, attrs):\n        question = attrs[\"question\"]\n        images = attrs[\"images\"]\n        answer = attrs[\"answer\"]\n        creator = self.context.get(\"request\").user\n\n        if not question.reader_study.is_reader(user=creator):\n            raise ValidationError(\"This user is not a reader for this study.\")\n\n        if not question.is_answer_valid(answer=answer):\n            raise ValidationError(\n                f\"You answer is not the correct type. \"\n                f\"{question.get_answer_type_display()} expected, \"\n                f\"{type(answer)} found.\"\n            )\n\n        if len(images) == 0:\n            raise ValidationError(\n                \"You must specify the images that this answer corresponds to.\"\n            )\n\n        reader_study_images = question.reader_study.images.all()\n        for im in images:\n            if im not in reader_study_images:\n                raise ValidationError(\n                    f\"Image {im} does not belong to this reader study.\"\n                )\n\n        if Answer.objects.filter(\n            creator=creator, question=question, images__in=images\n        ).exists():\n            raise ValidationError(\n                f\"User {creator} has already answered this question \"\n                f\"for at least 1 of these images.\"\n            )\n\n        return attrs\n\n    class Meta:\n        model = Answer\n        fields = (\n            \"answer\",\n            \"api_url\",\n            \"created\",\n            \"creator\",\n            \"images\",\n            \"pk\",\n            \"question\",\n        )\n", "path": "app/grandchallenge/reader_studies/serializers.py"}], "after_files": [{"content": "from rest_framework.exceptions import ValidationError\nfrom rest_framework.fields import CharField\nfrom rest_framework.relations import HyperlinkedRelatedField, SlugRelatedField\nfrom rest_framework.serializers import (\n    HyperlinkedModelSerializer,\n    SerializerMethodField,\n)\n\nfrom grandchallenge.api.swagger import swagger_schema_fields_for_charfield\nfrom grandchallenge.cases.models import Image\nfrom grandchallenge.reader_studies.models import (\n    ANSWER_TYPE_SCHEMA,\n    Answer,\n    Question,\n    ReaderStudy,\n)\n\n\nclass QuestionSerializer(HyperlinkedModelSerializer):\n    answer_type = CharField(source=\"get_answer_type_display\")\n    reader_study = HyperlinkedRelatedField(\n        view_name=\"api:reader-study-detail\", read_only=True\n    )\n    form_direction = CharField(source=\"get_direction_display\")\n    image_port = CharField(source=\"get_image_port_display\")\n\n    class Meta:\n        model = Question\n        fields = (\n            \"answer_type\",\n            \"api_url\",\n            \"form_direction\",\n            \"help_text\",\n            \"image_port\",\n            \"pk\",\n            \"question_text\",\n            \"reader_study\",\n            \"required\",\n        )\n        swagger_schema_fields = swagger_schema_fields_for_charfield(\n            answer_type=model._meta.get_field(\"answer_type\"),\n            form_direction=model._meta.get_field(\n                \"direction\"\n            ),  # model.direction gets remapped\n            image_port=model._meta.get_field(\"image_port\"),\n        )\n\n\nclass ReaderStudySerializer(HyperlinkedModelSerializer):\n    questions = QuestionSerializer(many=True, read_only=True)\n    hanging_list_images = SerializerMethodField()\n\n    class Meta:\n        model = ReaderStudy\n        fields = (\n            \"api_url\",\n            \"description\",\n            \"hanging_list_images\",\n            \"is_valid\",\n            \"pk\",\n            \"questions\",\n            \"title\",\n        )\n\n    def get_hanging_list_images(self, obj: ReaderStudy):\n        \"\"\"Used by hanging_list_images serializer field.\"\"\"\n        return obj.get_hanging_list_images_for_user(\n            user=self.context[\"request\"].user\n        )\n\n\nclass AnswerSerializer(HyperlinkedModelSerializer):\n    creator = SlugRelatedField(read_only=True, slug_field=\"username\")\n    question = HyperlinkedRelatedField(\n        view_name=\"api:reader-studies-question-detail\",\n        queryset=Question.objects.all(),\n    )\n    images = HyperlinkedRelatedField(\n        many=True, queryset=Image.objects.all(), view_name=\"api:image-detail\"\n    )\n\n    def validate(self, attrs):\n        question = attrs[\"question\"]\n        images = attrs[\"images\"]\n        answer = attrs[\"answer\"]\n        creator = self.context.get(\"request\").user\n\n        if not question.reader_study.is_reader(user=creator):\n            raise ValidationError(\"This user is not a reader for this study.\")\n\n        if not question.is_answer_valid(answer=answer):\n            raise ValidationError(\n                f\"You answer is not the correct type. \"\n                f\"{question.get_answer_type_display()} expected, \"\n                f\"{type(answer)} found.\"\n            )\n\n        if len(images) == 0:\n            raise ValidationError(\n                \"You must specify the images that this answer corresponds to.\"\n            )\n\n        reader_study_images = question.reader_study.images.all()\n        for im in images:\n            if im not in reader_study_images:\n                raise ValidationError(\n                    f\"Image {im} does not belong to this reader study.\"\n                )\n\n        if Answer.objects.filter(\n            creator=creator, question=question, images__in=images\n        ).exists():\n            raise ValidationError(\n                f\"User {creator} has already answered this question \"\n                f\"for at least 1 of these images.\"\n            )\n\n        return attrs\n\n    class Meta:\n        model = Answer\n        fields = (\n            \"answer\",\n            \"api_url\",\n            \"created\",\n            \"creator\",\n            \"images\",\n            \"pk\",\n            \"question\",\n        )\n        swagger_schema_fields = {\n            \"properties\": {\"answer\": {\"title\": \"Answer\", **ANSWER_TYPE_SCHEMA}}\n        }\n", "path": "app/grandchallenge/reader_studies/serializers.py"}]}