|
4 | 4 | import typing |
5 | 5 |
|
6 | 6 | from core.const.tag import OpenAPITag |
| 7 | +from core.models import MarkdownField |
7 | 8 | from core.serializer.json_schema_serializer import JsonSchemaSerializer |
8 | 9 | from django.db.models.base import Model |
| 10 | +from django.db.models.fields import TextField |
9 | 11 | from django.db.models.fields.files import FileField |
10 | 12 | from django.db.models.fields.related import ForeignKey, ManyToManyField |
11 | 13 | from drf_spectacular import openapi, types, utils |
@@ -37,6 +39,11 @@ def get_enum_values(model: Model, is_nullable: bool) -> list[dict[str, str]]: |
37 | 39 |
|
38 | 40 | return enum_values |
39 | 41 |
|
| 42 | + @staticmethod |
| 43 | + def set_ui_schema(ui_schema: dict, field_name: str, data: dict) -> None: |
| 44 | + ui_schema.setdefault(field_name, {}) |
| 45 | + ui_schema[field_name].update(data) |
| 46 | + |
40 | 47 | def get_json_schema(self) -> dict: |
41 | 48 | serializer_class = typing.cast(type[JsonSchemaSerializer], self.get_serializer_class()) |
42 | 49 |
|
@@ -67,11 +74,23 @@ def get_json_schema(self) -> dict: |
67 | 74 | e_values = self.get_enum_values(field.related_model, False) |
68 | 75 | result["schema"]["properties"][field.name]["items"]["oneOf"] = e_values |
69 | 76 | result["schema"]["properties"][field.name]["uniqueItems"] = True |
70 | | - result["ui_schema"][field.name] = {"ui:field": "m2m_select"} |
| 77 | + self.set_ui_schema(result["ui_schema"], field.name, {"ui:field": "m2m_select"}) |
71 | 78 | elif isinstance(field, FileField): |
72 | | - result["ui_schema"][field.name] = {"ui:field": "file"} |
| 79 | + self.set_ui_schema(result["ui_schema"], field.name, {"ui:field": "file"}) |
73 | 80 | elif isinstance(field, TranslationField): |
74 | 81 | result["translation_fields"].add(field.translated_field.name) |
| 82 | + if isinstance(field.translated_field, MarkdownField): |
| 83 | + self.set_ui_schema( |
| 84 | + result["ui_schema"], field.name, {"ui:widget": "textarea", "ui:field": "markdown"} |
| 85 | + ) |
| 86 | + elif isinstance(field.translated_field, TextField): |
| 87 | + self.set_ui_schema(result["ui_schema"], field.name, {"ui:widget": "textarea"}) |
| 88 | + elif isinstance(field, MarkdownField): |
| 89 | + self.set_ui_schema( |
| 90 | + result["ui_schema"], field.name, {"ui:widget": "textarea", "ui:field": "markdown"} |
| 91 | + ) |
| 92 | + elif isinstance(field, TextField): |
| 93 | + self.set_ui_schema(result["ui_schema"], field.name, {"ui:widget": "textarea"}) |
75 | 94 |
|
76 | 95 | result["translation_fields"] = list(result["translation_fields"]) |
77 | 96 | return result |
|
0 commit comments