From 76fb96552c161453b0e93c2de0a84d10d2f37ba2 Mon Sep 17 00:00:00 2001 From: SaJH Date: Sat, 19 Apr 2025 16:11:23 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20Makefile=EC=97=90=20migrations=20?= =?UTF-8?q?=EB=AA=85=EB=A0=B9=EC=96=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SaJH --- Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ddf74c0..f216cad 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,11 @@ local-collectstatic: local-shell: @ENV_PATH=envfile/.env.local uv run python app/manage.py shell -# Run django migrations +# Run django makemigrations +local-makemigrations: + @ENV_PATH=envfile/.env.local uv run python app/manage.py makemigrations + +# Run django migrate local-migrate: @ENV_PATH=envfile/.env.local uv run python app/manage.py migrate From 4ab7b1e6e726bdef20eb36661b259bcda96fd705 Mon Sep 17 00:00:00 2001 From: SaJH Date: Sat, 19 Apr 2025 16:11:39 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20django-modeltranslation=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SaJH --- pyproject.toml | 1 + uv.lock | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 134d284..09fa2fe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,7 @@ dependencies = [ "django-environ>=0.12.0", "django-extensions>=3.2.3", "django-filter>=25.1", + "django-modeltranslation>=0.19.13", "django-picklefield>=3.3", "django-simple-history>=3.8.0", "django-storages[s3]>=1.14.6", diff --git a/uv.lock b/uv.lock index e745715..0f0f4d6 100644 --- a/uv.lock +++ b/uv.lock @@ -1,4 +1,5 @@ version = 1 +revision = 1 requires-python = "==3.12.*" [[package]] @@ -111,6 +112,7 @@ dependencies = [ { name = "django-environ" }, { name = "django-extensions" }, { name = "django-filter" }, + { name = "django-modeltranslation" }, { name = "django-picklefield" }, { name = "django-simple-history" }, { name = "django-storages", extra = ["s3"] }, @@ -154,6 +156,7 @@ requires-dist = [ { name = "django-environ", specifier = ">=0.12.0" }, { name = "django-extensions", specifier = ">=3.2.3" }, { name = "django-filter", specifier = ">=25.1" }, + { name = "django-modeltranslation", specifier = ">=0.19.13" }, { name = "django-picklefield", specifier = ">=3.3" }, { name = "django-simple-history", specifier = ">=3.8.0" }, { name = "django-storages", extras = ["s3"], specifier = ">=1.14.6" }, @@ -441,6 +444,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/a6/70dcd68537c434ba7cb9277d403c5c829caf04f35baf5eb9458be251e382/django_filter-25.1-py3-none-any.whl", hash = "sha256:4fa48677cf5857b9b1347fed23e355ea792464e0fe07244d1fdfb8a806215b80", size = 94114 }, ] +[[package]] +name = "django-modeltranslation" +version = "0.19.13" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/e1/54a2f2cff0bf6c5798a0185f4b962d680999a8f0207a61f8aebb75ff8226/django_modeltranslation-0.19.13.tar.gz", hash = "sha256:df2516fdfb6a865fd1dfdda74e549d437d8ca148c1d435663db36edb6863f34e", size = 76720 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/a9/87ddfca789c95e8aaa7d5481d00184046cad925f943aeaee31dd21e62f0b/django_modeltranslation-0.19.13-py3-none-any.whl", hash = "sha256:69b7dc9a8bae152ab84caf969a5ad478f588f4d9f8345545d4f20f66eeb51ef6", size = 53996 }, +] + [[package]] name = "django-picklefield" version = "3.3" From fb9b1134403065eb99020a65caabedd9b63dad19 Mon Sep 17 00:00:00 2001 From: SaJH Date: Sat, 19 Apr 2025 16:12:55 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20django-modeltranslation=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SaJH --- app/core/settings.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/core/settings.py b/app/core/settings.py index c362b7d..7953b2f 100644 --- a/app/core/settings.py +++ b/app/core/settings.py @@ -147,6 +147,10 @@ # Application definition INSTALLED_APPS = [ + # django model translation + # https://django-modeltranslation.readthedocs.io/en/latest/installation.html#installed-apps + "modeltranslation", + # django default apps "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", @@ -170,6 +174,7 @@ "django_extensions", # django-app "user", + "cms", # django-constance "constance", ] @@ -257,6 +262,9 @@ USE_TZ = True +MODELTRANSLATION_DEFAULT_LANGUAGE = "ko" + +MODELTRANSLATION_LANGUAGES = ("ko", "en") # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/5.2/howto/static-files/ From 49d46991e3797c088eca9e50624e47bcfb508899 Mon Sep 17 00:00:00 2001 From: SaJH Date: Sat, 19 Apr 2025 16:14:07 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20cms=20model=20schema=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SaJH --- app/cms/__init__.py | 0 app/cms/apps.py | 5 +++ app/cms/migrations/0001_initial.py | 65 ++++++++++++++++++++++++++++++ app/cms/migrations/__init__.py | 0 app/cms/models.py | 44 ++++++++++++++++++++ app/cms/translation.py | 17 ++++++++ 6 files changed, 131 insertions(+) create mode 100644 app/cms/__init__.py create mode 100644 app/cms/apps.py create mode 100644 app/cms/migrations/0001_initial.py create mode 100644 app/cms/migrations/__init__.py create mode 100644 app/cms/models.py create mode 100644 app/cms/translation.py diff --git a/app/cms/__init__.py b/app/cms/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/cms/apps.py b/app/cms/apps.py new file mode 100644 index 0000000..6e90a36 --- /dev/null +++ b/app/cms/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class CmsConfig(AppConfig): + name = "cms" diff --git a/app/cms/migrations/0001_initial.py b/app/cms/migrations/0001_initial.py new file mode 100644 index 0000000..f676567 --- /dev/null +++ b/app/cms/migrations/0001_initial.py @@ -0,0 +1,65 @@ +# Generated by Django 5.2 on 2025-04-19 07:08 + +import uuid + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Page", + fields=[ + ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ("is_active", models.BooleanField(default=False)), + ("css", models.TextField(blank=True, default=None, null=True)), + ("title", models.CharField(max_length=256)), + ("title_ko", models.CharField(max_length=256, null=True)), + ("title_en", models.CharField(max_length=256, null=True)), + ("subtitle", models.CharField(max_length=512)), + ("subtitle_ko", models.CharField(max_length=512, null=True)), + ("subtitle_en", models.CharField(max_length=512, null=True)), + ], + ), + migrations.CreateModel( + name="Section", + fields=[ + ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ("order", models.IntegerField(default=0)), + ("css", models.TextField(blank=True, default=None, null=True)), + ("body", models.TextField(help_text="Content of the page, Written in markdown format")), + ("body_ko", models.TextField(help_text="Content of the page, Written in markdown format", null=True)), + ("body_en", models.TextField(help_text="Content of the page, Written in markdown format", null=True)), + ("page", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="cms.page")), + ], + ), + migrations.CreateModel( + name="Sitemap", + fields=[ + ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ("name", models.CharField(max_length=256)), + ("name_ko", models.CharField(max_length=256, null=True)), + ("name_en", models.CharField(max_length=256, null=True)), + ("order", models.IntegerField(default=0)), + ("display_start_at", models.DateTimeField(blank=True, null=True)), + ("display_end_at", models.DateTimeField(blank=True, null=True)), + ("page", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="cms.page")), + ( + "parent_sitemap", + models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="children", + to="cms.sitemap", + ), + ), + ], + ), + ] diff --git a/app/cms/migrations/__init__.py b/app/cms/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/cms/models.py b/app/cms/models.py new file mode 100644 index 0000000..83fb295 --- /dev/null +++ b/app/cms/models.py @@ -0,0 +1,44 @@ +import uuid + +from django.db import models +from simple_history.models import HistoricalRecords + + +class Page(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + is_active = models.BooleanField(default=False) + css = models.TextField(null=True, blank=True, default=None) + title = models.CharField(max_length=256) + subtitle = models.CharField(max_length=512) + history = HistoricalRecords() + + def __str__(self): + return str(self.title) + + +class Sitemap(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + parent_sitemap = models.ForeignKey( + "self", null=True, blank=True, default=None, on_delete=models.SET_NULL, related_name="children" + ) + name = models.CharField(max_length=256) + order = models.IntegerField(default=0) + page = models.ForeignKey(Page, on_delete=models.PROTECT) + display_start_at = models.DateTimeField(null=True, blank=True) + display_end_at = models.DateTimeField(null=True, blank=True) + history = HistoricalRecords() + + def __str__(self): + return str(self.name) + + +class Section(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + page = models.ForeignKey(Page, on_delete=models.CASCADE) + order = models.IntegerField(default=0) + css = models.TextField(null=True, blank=True, default=None) + body = models.TextField(help_text="Content of the page, Written in markdown format") + history = HistoricalRecords() + + def __str__(self): + return f"Section {self.order} of {self.page}" diff --git a/app/cms/translation.py b/app/cms/translation.py new file mode 100644 index 0000000..46c1b79 --- /dev/null +++ b/app/cms/translation.py @@ -0,0 +1,17 @@ +from cms.models import Page, Section, Sitemap +from modeltranslation.translator import TranslationOptions, register + + +@register(Page) +class PageTranslationOptions(TranslationOptions): + fields = ("title", "subtitle") + + +@register(Sitemap) +class SitemapTranslationOptions(TranslationOptions): + fields = ("name",) + + +@register(Section) +class SectionTranslationOptions(TranslationOptions): + fields = ("body",)