Skip to content

Commit f583f84

Browse files
committed
feat: 어드민에서 특정 필드가 markdown으로 노출되도록 수정
1 parent 4a2eba1 commit f583f84

File tree

8 files changed

+160
-8
lines changed

8 files changed

+160
-8
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Generated by Django 5.2 on 2025-06-22 08:49
2+
3+
import core.models
4+
from django.db import migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
dependencies = [
9+
("cms", "0011_remove_sitemap_uq__sitemap__parent_route_code_and_more"),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name="historicalsection",
15+
name="body",
16+
field=core.models.MarkdownField(help_text="Content of the page, Written in markdown format"),
17+
),
18+
migrations.AlterField(
19+
model_name="historicalsection",
20+
name="body_en",
21+
field=core.models.MarkdownField(help_text="Content of the page, Written in markdown format", null=True),
22+
),
23+
migrations.AlterField(
24+
model_name="historicalsection",
25+
name="body_ko",
26+
field=core.models.MarkdownField(help_text="Content of the page, Written in markdown format", null=True),
27+
),
28+
migrations.AlterField(
29+
model_name="section",
30+
name="body",
31+
field=core.models.MarkdownField(help_text="Content of the page, Written in markdown format"),
32+
),
33+
migrations.AlterField(
34+
model_name="section",
35+
name="body_en",
36+
field=core.models.MarkdownField(help_text="Content of the page, Written in markdown format", null=True),
37+
),
38+
migrations.AlterField(
39+
model_name="section",
40+
name="body_ko",
41+
field=core.models.MarkdownField(help_text="Content of the page, Written in markdown format", null=True),
42+
),
43+
]

app/cms/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import re
88
import typing
99

10-
from core.models import BaseAbstractModel, BaseAbstractModelQuerySet
10+
from core.models import BaseAbstractModel, BaseAbstractModelQuerySet, MarkdownField
1111
from django.core.exceptions import ValidationError
1212
from django.core.validators import MinValueValidator
1313
from django.db import models
@@ -145,7 +145,7 @@ class Section(BaseAbstractModel):
145145
order = models.IntegerField(default=0)
146146

147147
css = models.TextField(null=True, blank=True, default=None)
148-
body = models.TextField(help_text="Content of the page, Written in markdown format")
148+
body = MarkdownField(help_text="Content of the page, Written in markdown format")
149149

150150
class Meta:
151151
ordering = ["order"]

app/core/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,7 @@ def delete(self, using: str | None = None) -> None:
7070
self.deleted_at = Now()
7171
self.deleted_by = get_current_user()
7272
super().save(using=using, update_fields={"deleted_by", "deleted_at"})
73+
74+
75+
class MarkdownField(models.TextField):
76+
is_markdown = True

app/core/viewset/json_schema_viewset.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import typing
55

66
from core.const.tag import OpenAPITag
7+
from core.models import MarkdownField
78
from core.serializer.json_schema_serializer import JsonSchemaSerializer
89
from django.db.models.base import Model
10+
from django.db.models.fields import TextField
911
from django.db.models.fields.files import FileField
1012
from django.db.models.fields.related import ForeignKey, ManyToManyField
1113
from drf_spectacular import openapi, types, utils
@@ -37,6 +39,11 @@ def get_enum_values(model: Model, is_nullable: bool) -> list[dict[str, str]]:
3739

3840
return enum_values
3941

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+
4047
def get_json_schema(self) -> dict:
4148
serializer_class = typing.cast(type[JsonSchemaSerializer], self.get_serializer_class())
4249

@@ -67,11 +74,23 @@ def get_json_schema(self) -> dict:
6774
e_values = self.get_enum_values(field.related_model, False)
6875
result["schema"]["properties"][field.name]["items"]["oneOf"] = e_values
6976
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"})
7178
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"})
7380
elif isinstance(field, TranslationField):
7481
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"})
7594

7695
result["translation_fields"] = list(result["translation_fields"])
7796
return result
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Generated by Django 5.2 on 2025-06-22 08:49
2+
3+
import core.models
4+
from django.db import migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
dependencies = [
9+
("presentation", "0004_remove_presentationcategory_uq__prst_cat__type__name_and_more"),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name="historicalpresentationspeaker",
15+
name="biography",
16+
field=core.models.MarkdownField(blank=True, default=""),
17+
),
18+
migrations.AlterField(
19+
model_name="historicalpresentationspeaker",
20+
name="biography_en",
21+
field=core.models.MarkdownField(blank=True, default="", null=True),
22+
),
23+
migrations.AlterField(
24+
model_name="historicalpresentationspeaker",
25+
name="biography_ko",
26+
field=core.models.MarkdownField(blank=True, default="", null=True),
27+
),
28+
migrations.AlterField(
29+
model_name="presentationspeaker",
30+
name="biography",
31+
field=core.models.MarkdownField(blank=True, default=""),
32+
),
33+
migrations.AlterField(
34+
model_name="presentationspeaker",
35+
name="biography_en",
36+
field=core.models.MarkdownField(blank=True, default="", null=True),
37+
),
38+
migrations.AlterField(
39+
model_name="presentationspeaker",
40+
name="biography_ko",
41+
field=core.models.MarkdownField(blank=True, default="", null=True),
42+
),
43+
]

app/event/presentation/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import contextlib
55
import functools
66

7-
from core.models import BaseAbstractModel, BaseAbstractModelQuerySet
7+
from core.models import BaseAbstractModel, BaseAbstractModelQuerySet, MarkdownField
88
from django.contrib.auth import get_user_model
99
from django.db import models
1010
from event.models import Event
@@ -97,4 +97,4 @@ class PresentationCategoryRelation(models.Model):
9797
class PresentationSpeaker(BaseAbstractModel):
9898
presentation = models.ForeignKey(Presentation, on_delete=models.PROTECT, related_name="speakers")
9999
user = models.ForeignKey(User, on_delete=models.PROTECT)
100-
biography = models.TextField(blank=True, default="")
100+
biography = MarkdownField(blank=True, default="")
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Generated by Django 5.2 on 2025-06-22 08:49
2+
3+
import core.models
4+
from django.db import migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
dependencies = [
9+
("sponsor", "0011_remove_sponsor_uq__spsr__name_and_more"),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name="historicalsponsor",
15+
name="description",
16+
field=core.models.MarkdownField(blank=True, default=""),
17+
),
18+
migrations.AlterField(
19+
model_name="historicalsponsor",
20+
name="description_en",
21+
field=core.models.MarkdownField(blank=True, default="", null=True),
22+
),
23+
migrations.AlterField(
24+
model_name="historicalsponsor",
25+
name="description_ko",
26+
field=core.models.MarkdownField(blank=True, default="", null=True),
27+
),
28+
migrations.AlterField(
29+
model_name="sponsor",
30+
name="description",
31+
field=core.models.MarkdownField(blank=True, default=""),
32+
),
33+
migrations.AlterField(
34+
model_name="sponsor",
35+
name="description_en",
36+
field=core.models.MarkdownField(blank=True, default="", null=True),
37+
),
38+
migrations.AlterField(
39+
model_name="sponsor",
40+
name="description_ko",
41+
field=core.models.MarkdownField(blank=True, default="", null=True),
42+
),
43+
]

app/event/sponsor/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import contextlib
33
import functools
44

5-
from core.models import BaseAbstractModel
5+
from core.models import BaseAbstractModel, MarkdownField
66
from django.db import models
77
from event.models import Event
88

@@ -12,7 +12,7 @@ class Sponsor(BaseAbstractModel):
1212
name = models.CharField(max_length=256)
1313

1414
logo = models.ForeignKey(to="file.PublicFile", on_delete=models.PROTECT)
15-
description = models.TextField(blank=True, default="")
15+
description = MarkdownField(blank=True, default="")
1616

1717
tiers = models.ManyToManyField(to="SponsorTier", through="SponsorTierSponsorRelation")
1818
tags = models.ManyToManyField(to="SponsorTag", through="SponsorTagRelation")

0 commit comments

Comments
 (0)