From 157661b86be0d23001d244685a085e18463f425d Mon Sep 17 00:00:00 2001 From: SaJH Date: Sat, 7 Jun 2025 19:25:33 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=ED=9B=84=EC=9B=90=EC=82=AC=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: SaJH --- app/core/settings.py | 1 + app/event/admin.py | 1 - app/event/sponsor/__init__.py | 0 app/event/sponsor/apps.py | 16 + app/event/sponsor/migrations/0001_initial.py | 322 ++++++++++++++++++ app/event/sponsor/migrations/__init__.py | 0 app/event/sponsor/models.py | 24 ++ app/event/sponsor/serializers.py | 27 ++ app/event/sponsor/translation.py | 12 + app/event/sponsor/urls.py | 8 + app/event/sponsor/views.py | 8 + app/event/tests.py | 1 - app/event/views.py | 1 - .../0003_alter_historicaluserext_is_active.py | 24 ++ 14 files changed, 442 insertions(+), 3 deletions(-) delete mode 100644 app/event/admin.py create mode 100644 app/event/sponsor/__init__.py create mode 100644 app/event/sponsor/apps.py create mode 100644 app/event/sponsor/migrations/0001_initial.py create mode 100644 app/event/sponsor/migrations/__init__.py create mode 100644 app/event/sponsor/models.py create mode 100644 app/event/sponsor/serializers.py create mode 100644 app/event/sponsor/translation.py create mode 100644 app/event/sponsor/urls.py create mode 100644 app/event/sponsor/views.py delete mode 100644 app/event/tests.py delete mode 100644 app/event/views.py create mode 100644 app/user/migrations/0003_alter_historicaluserext_is_active.py diff --git a/app/core/settings.py b/app/core/settings.py index 322238f..883255e 100644 --- a/app/core/settings.py +++ b/app/core/settings.py @@ -159,6 +159,7 @@ "cms", "event", "event.presentation", + "event.sponsor", "admin_api", # django-constance "constance", diff --git a/app/event/admin.py b/app/event/admin.py deleted file mode 100644 index 846f6b4..0000000 --- a/app/event/admin.py +++ /dev/null @@ -1 +0,0 @@ -# Register your models here. diff --git a/app/event/sponsor/__init__.py b/app/event/sponsor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/event/sponsor/apps.py b/app/event/sponsor/apps.py new file mode 100644 index 0000000..515f6c5 --- /dev/null +++ b/app/event/sponsor/apps.py @@ -0,0 +1,16 @@ +import importlib + +from django.apps import AppConfig + + +class SponsorConfig(AppConfig): + name = "event.sponsor" + + def ready(self): + importlib.import_module("event.sponsor.translation") + + from event.sponsor.models import Sponsor, SponsorTier + from simple_history import register + + register(SponsorTier) + register(Sponsor) diff --git a/app/event/sponsor/migrations/0001_initial.py b/app/event/sponsor/migrations/0001_initial.py new file mode 100644 index 0000000..5a7caf5 --- /dev/null +++ b/app/event/sponsor/migrations/0001_initial.py @@ -0,0 +1,322 @@ +# Generated by Django 5.2 on 2025-06-07 10:17 + +import uuid + +import core.fields +import django.db.models.deletion +import simple_history.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("event", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="HistoricalSponsor", + fields=[ + ("id", models.UUIDField(db_index=True, default=uuid.uuid4, editable=False)), + ("created_at", models.DateTimeField(blank=True, editable=False)), + ("updated_at", models.DateTimeField(blank=True, editable=False)), + ("deleted_at", models.DateTimeField(blank=True, null=True)), + ("name", models.CharField(blank=True, max_length=256, null=True)), + ("name_ko", models.CharField(blank=True, max_length=256, null=True)), + ("name_en", models.CharField(blank=True, max_length=256, null=True)), + ("logo", models.URLField(blank=True, null=True)), + ("description", models.CharField(blank=True, max_length=1000, null=True)), + ("description_ko", models.CharField(blank=True, max_length=1000, null=True)), + ("description_en", models.CharField(blank=True, max_length=1000, null=True)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField(choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], max_length=1), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "deleted_by", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "event", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="event.event", + ), + ), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "updated_by", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "verbose_name": "historical sponsor", + "verbose_name_plural": "historical sponsors", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="HistoricalSponsorTier", + fields=[ + ("id", models.UUIDField(db_index=True, default=uuid.uuid4, editable=False)), + ("created_at", models.DateTimeField(blank=True, editable=False)), + ("updated_at", models.DateTimeField(blank=True, editable=False)), + ("deleted_at", models.DateTimeField(blank=True, null=True)), + ("name", models.CharField(blank=True, max_length=256, null=True)), + ("name_ko", models.CharField(blank=True, max_length=256, null=True)), + ("name_en", models.CharField(blank=True, max_length=256, null=True)), + ("order", models.IntegerField(blank=True, null=True)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField(choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], max_length=1), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "deleted_by", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "event", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="event.event", + ), + ), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "updated_by", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "verbose_name": "historical sponsor tier", + "verbose_name_plural": "historical sponsor tiers", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="Sponsor", + fields=[ + ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ("deleted_at", models.DateTimeField(blank=True, null=True)), + ("name", models.CharField(blank=True, max_length=256, null=True)), + ("name_ko", models.CharField(blank=True, max_length=256, null=True)), + ("name_en", models.CharField(blank=True, max_length=256, null=True)), + ("logo", models.URLField(blank=True, null=True)), + ("description", models.CharField(blank=True, max_length=1000, null=True)), + ("description_ko", models.CharField(blank=True, max_length=1000, null=True)), + ("description_en", models.CharField(blank=True, max_length=1000, null=True)), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="%(class)s_created_by", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "deleted_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="%(class)s_deleted_by", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "event", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, related_name="sponsors", to="event.event" + ), + ), + ( + "updated_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="%(class)s_updated_by", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="SponsorTier", + fields=[ + ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ("deleted_at", models.DateTimeField(blank=True, null=True)), + ("name", models.CharField(blank=True, max_length=256, null=True)), + ("name_ko", models.CharField(blank=True, max_length=256, null=True)), + ("name_en", models.CharField(blank=True, max_length=256, null=True)), + ("order", models.IntegerField(blank=True, null=True)), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="%(class)s_created_by", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "deleted_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="%(class)s_deleted_by", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "event", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, related_name="sponsor_tiers", to="event.event" + ), + ), + ( + "updated_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="%(class)s_updated_by", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="SponsorTierSponsorRelation", + fields=[ + ( + "id", + core.fields.UUIDAutoField( + auto_created=True, + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "sponsor", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="sponsor_tier_sponsor_relations", + to="sponsor.sponsor", + ), + ), + ( + "sponsor_tier", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="sponsor_tier_sponsor_relations", + to="sponsor.sponsortier", + ), + ), + ], + ), + migrations.AddField( + model_name="sponsor", + name="sponsor_tier", + field=models.ManyToManyField(through="sponsor.SponsorTierSponsorRelation", to="sponsor.sponsortier"), + ), + ] diff --git a/app/event/sponsor/migrations/__init__.py b/app/event/sponsor/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/event/sponsor/models.py b/app/event/sponsor/models.py new file mode 100644 index 0000000..8c5f2b7 --- /dev/null +++ b/app/event/sponsor/models.py @@ -0,0 +1,24 @@ +from core.models import BaseAbstractModel +from django.db import models +from event.models import Event + + +class Sponsor(BaseAbstractModel): + event = models.ForeignKey(Event, on_delete=models.PROTECT, related_name="sponsors") + name = models.CharField(max_length=256, null=True, blank=True) + logo = models.URLField(null=True, blank=True) + description = models.CharField(max_length=1000, null=True, blank=True) + sponsor_tier = models.ManyToManyField(to="SponsorTier", through="SponsorTierSponsorRelation") + + +class SponsorTier(BaseAbstractModel): + event = models.ForeignKey(Event, on_delete=models.PROTECT, related_name="sponsor_tiers") + name = models.CharField(max_length=256, null=True, blank=True) + order = models.IntegerField(null=True, blank=True) + + +class SponsorTierSponsorRelation(models.Model): + sponsor_tier = models.ForeignKey( + SponsorTier, on_delete=models.CASCADE, related_name="sponsor_tier_sponsor_relations" + ) + sponsor = models.ForeignKey(Sponsor, on_delete=models.CASCADE, related_name="sponsor_tier_sponsor_relations") diff --git a/app/event/sponsor/serializers.py b/app/event/sponsor/serializers.py new file mode 100644 index 0000000..4595a86 --- /dev/null +++ b/app/event/sponsor/serializers.py @@ -0,0 +1,27 @@ +from event.sponsor.models import Sponsor, SponsorTier +from rest_framework import serializers + + +class SponsorTierSerializer(serializers.ModelSerializer): + class Meta: + model = SponsorTier + fields = ( + "id", + "name", + "order", + ) + + +class SponsorSerializer(serializers.ModelSerializer): + sponsor_tiers = SponsorTierSerializer(many=True, read_only=True, source="sponsor_tier") + + class Meta: + model = Sponsor + fields = ( + "id", + "event", + "name", + "logo", + "description", + "sponsor_tiers", + ) diff --git a/app/event/sponsor/translation.py b/app/event/sponsor/translation.py new file mode 100644 index 0000000..387c8aa --- /dev/null +++ b/app/event/sponsor/translation.py @@ -0,0 +1,12 @@ +from event.sponsor.models import Sponsor, SponsorTier +from modeltranslation.translator import TranslationOptions, register + + +@register(SponsorTier) +class SponsorTierTranslationOptions(TranslationOptions): + fields = ("name",) + + +@register(Sponsor) +class SponsorTranslationOptions(TranslationOptions): + fields = ("name", "description") diff --git a/app/event/sponsor/urls.py b/app/event/sponsor/urls.py new file mode 100644 index 0000000..922a0e5 --- /dev/null +++ b/app/event/sponsor/urls.py @@ -0,0 +1,8 @@ +from django.urls import include, path +from event.sponsor import views +from rest_framework import routers + +cms_router = routers.SimpleRouter() +cms_router.register("sponsors", views.SponsorViewSet, basename="sponsor") + +urlpatterns = [path("", include(cms_router.urls))] diff --git a/app/event/sponsor/views.py b/app/event/sponsor/views.py new file mode 100644 index 0000000..85a279c --- /dev/null +++ b/app/event/sponsor/views.py @@ -0,0 +1,8 @@ +from event.sponsor.models import Sponsor +from event.sponsor.serializers import SponsorSerializer +from rest_framework import mixins, viewsets + + +class SponsorViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): + queryset = Sponsor.objects.prefetch_related("sponsor_tier").all() + serializer_class = SponsorSerializer diff --git a/app/event/tests.py b/app/event/tests.py deleted file mode 100644 index a39b155..0000000 --- a/app/event/tests.py +++ /dev/null @@ -1 +0,0 @@ -# Create your tests here. diff --git a/app/event/views.py b/app/event/views.py deleted file mode 100644 index 60f00ef..0000000 --- a/app/event/views.py +++ /dev/null @@ -1 +0,0 @@ -# Create your views here. diff --git a/app/user/migrations/0003_alter_historicaluserext_is_active.py b/app/user/migrations/0003_alter_historicaluserext_is_active.py new file mode 100644 index 0000000..bf9ae9d --- /dev/null +++ b/app/user/migrations/0003_alter_historicaluserext_is_active.py @@ -0,0 +1,24 @@ +# Generated by Django 5.2 on 2025-06-07 10:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("user", "0002_organization_historicalorganization_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="historicaluserext", + name="is_active", + field=models.BooleanField( + default=True, + help_text=( + "Designates whether this user should be treated as active. " + "Unselect this instead of deleting accounts." + ), + verbose_name="active", + ), + ), + ] From 54995cbdfd8288084e3a271840c6b74d49e88c95 Mon Sep 17 00:00:00 2001 From: SaJH Date: Sat, 7 Jun 2025 19:28:03 +0900 Subject: [PATCH 2/4] fix: minor Signed-off-by: SaJH --- app/event/sponsor/models.py | 2 +- app/event/sponsor/serializers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/event/sponsor/models.py b/app/event/sponsor/models.py index 8c5f2b7..1c6c3bf 100644 --- a/app/event/sponsor/models.py +++ b/app/event/sponsor/models.py @@ -8,7 +8,7 @@ class Sponsor(BaseAbstractModel): name = models.CharField(max_length=256, null=True, blank=True) logo = models.URLField(null=True, blank=True) description = models.CharField(max_length=1000, null=True, blank=True) - sponsor_tier = models.ManyToManyField(to="SponsorTier", through="SponsorTierSponsorRelation") + sponsor_tiers = models.ManyToManyField(to="SponsorTier", through="SponsorTierSponsorRelation") class SponsorTier(BaseAbstractModel): diff --git a/app/event/sponsor/serializers.py b/app/event/sponsor/serializers.py index 4595a86..272cc41 100644 --- a/app/event/sponsor/serializers.py +++ b/app/event/sponsor/serializers.py @@ -13,7 +13,7 @@ class Meta: class SponsorSerializer(serializers.ModelSerializer): - sponsor_tiers = SponsorTierSerializer(many=True, read_only=True, source="sponsor_tier") + sponsor_tiers = SponsorTierSerializer(many=True, read_only=True) class Meta: model = Sponsor From 65831a4086571247e4ad20a6de74cf1006d8a7a0 Mon Sep 17 00:00:00 2001 From: SaJH Date: Sat, 7 Jun 2025 19:28:31 +0900 Subject: [PATCH 3/4] fix: minor Signed-off-by: SaJH --- ...rename_sponsor_tier_sponsor_sponsor_tiers.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 app/event/sponsor/migrations/0002_rename_sponsor_tier_sponsor_sponsor_tiers.py diff --git a/app/event/sponsor/migrations/0002_rename_sponsor_tier_sponsor_sponsor_tiers.py b/app/event/sponsor/migrations/0002_rename_sponsor_tier_sponsor_sponsor_tiers.py new file mode 100644 index 0000000..2922a16 --- /dev/null +++ b/app/event/sponsor/migrations/0002_rename_sponsor_tier_sponsor_sponsor_tiers.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2 on 2025-06-07 10:28 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("sponsor", "0001_initial"), + ] + + operations = [ + migrations.RenameField( + model_name="sponsor", + old_name="sponsor_tier", + new_name="sponsor_tiers", + ), + ] From a4845775198978574b554e63eef8074bcb16524a Mon Sep 17 00:00:00 2001 From: SaJH Date: Sat, 7 Jun 2025 20:38:07 +0900 Subject: [PATCH 4/4] fix: minor Signed-off-by: SaJH --- ..._historicalsponsor_description_and_more.py | 42 +++++++++++++++++++ app/event/sponsor/models.py | 2 +- app/event/sponsor/views.py | 2 +- 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 app/event/sponsor/migrations/0003_alter_historicalsponsor_description_and_more.py diff --git a/app/event/sponsor/migrations/0003_alter_historicalsponsor_description_and_more.py b/app/event/sponsor/migrations/0003_alter_historicalsponsor_description_and_more.py new file mode 100644 index 0000000..4b69dcd --- /dev/null +++ b/app/event/sponsor/migrations/0003_alter_historicalsponsor_description_and_more.py @@ -0,0 +1,42 @@ +# Generated by Django 5.2 on 2025-06-07 11:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("sponsor", "0002_rename_sponsor_tier_sponsor_sponsor_tiers"), + ] + + operations = [ + migrations.AlterField( + model_name="historicalsponsor", + name="description", + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name="historicalsponsor", + name="description_en", + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name="historicalsponsor", + name="description_ko", + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name="sponsor", + name="description", + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name="sponsor", + name="description_en", + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name="sponsor", + name="description_ko", + field=models.TextField(blank=True, null=True), + ), + ] diff --git a/app/event/sponsor/models.py b/app/event/sponsor/models.py index 1c6c3bf..9155c82 100644 --- a/app/event/sponsor/models.py +++ b/app/event/sponsor/models.py @@ -7,7 +7,7 @@ class Sponsor(BaseAbstractModel): event = models.ForeignKey(Event, on_delete=models.PROTECT, related_name="sponsors") name = models.CharField(max_length=256, null=True, blank=True) logo = models.URLField(null=True, blank=True) - description = models.CharField(max_length=1000, null=True, blank=True) + description = models.TextField(null=True, blank=True) sponsor_tiers = models.ManyToManyField(to="SponsorTier", through="SponsorTierSponsorRelation") diff --git a/app/event/sponsor/views.py b/app/event/sponsor/views.py index 85a279c..27aedd3 100644 --- a/app/event/sponsor/views.py +++ b/app/event/sponsor/views.py @@ -4,5 +4,5 @@ class SponsorViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): - queryset = Sponsor.objects.prefetch_related("sponsor_tier").all() + queryset = Sponsor.objects.prefetch_related("sponsor_tier").filter_active() serializer_class = SponsorSerializer