Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,18 @@ local-makemigrations:
local-migrate:
@ENV_PATH=envfile/.env.local uv run python app/manage.py migrate

# Show django makemigrations
local-showmigrations:
@ENV_PATH=envfile/.env.local uv run python app/manage.py showmigrations

# Create admin superuser
local-createsuperuser:
@ENV_PATH=envfile/.env.local uv run python app/manage.py createsuperuser

# Reverse django migrations
local-reverse-migrations:
@ENV_PATH=envfile/.env.local uv run python app/manage.py migrate $(app) $(number)

# Run pytest
local-test:
@ENV_PATH=envfile/.env.local cd app && uv run pytest -v
Expand Down
2 changes: 2 additions & 0 deletions app/core/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,8 @@
"user",
"file",
"cms",
"event",
"event.presentation",
"admin_api",
# django-constance
"constance",
Expand Down
2 changes: 2 additions & 0 deletions app/core/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@

# type: ignore[assignment]
v1_apis: list[resolvers.URLPattern | resolvers.URLResolver] = [
path("cms/", include("cms.urls")),
Comment thread
earthyoung marked this conversation as resolved.
path("admin-api/", include("admin_api.urls")),
path("cms/", include("cms.urls")),
path("event/presentations/", include("event.presentation.urls")),
]

urlpatterns = [
Expand Down
Empty file added app/event/__init__.py
Empty file.
1 change: 1 addition & 0 deletions app/event/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Register your models here.
16 changes: 16 additions & 0 deletions app/event/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import importlib

from django.apps import AppConfig


class EventConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
Comment thread
earthyoung marked this conversation as resolved.
Outdated
name = "event"

def ready(self):
importlib.import_module("event.translation")

from event.models import Event
from simple_history import register

register(Event)
209 changes: 209 additions & 0 deletions app/event/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
# Generated by Django 5.2 on 2025-06-03 04:16

import uuid

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 = [
("user", "0002_historicalorganization_historicaluserext_and_more"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name="Event",
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)),
("banner_image", models.TextField(blank=True, null=True)),
("slogan", models.CharField(blank=True, max_length=1000, null=True)),
("slogan_ko", models.CharField(blank=True, max_length=1000, null=True)),
("slogan_en", models.CharField(blank=True, max_length=1000, 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),
),
("event_start_at", models.DateTimeField(blank=True, null=True)),
("event_end_at", models.DateTimeField(blank=True, null=True)),
(
"banner_display_start_at",
models.DateTimeField(blank=True, null=True),
),
("banner_display_end_at", models.DateTimeField(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,
),
),
(
"organization",
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
related_name="events",
to="user.organization",
),
),
(
"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="HistoricalEvent",
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)),
("banner_image", models.TextField(blank=True, null=True)),
("slogan", models.CharField(blank=True, max_length=1000, null=True)),
("slogan_ko", models.CharField(blank=True, max_length=1000, null=True)),
("slogan_en", models.CharField(blank=True, max_length=1000, 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),
),
("event_start_at", models.DateTimeField(blank=True, null=True)),
("event_end_at", models.DateTimeField(blank=True, null=True)),
(
"banner_display_start_at",
models.DateTimeField(blank=True, null=True),
),
("banner_display_end_at", models.DateTimeField(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,
),
),
(
"history_user",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
),
(
"organization",
models.ForeignKey(
blank=True,
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="user.organization",
),
),
(
"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 event",
"verbose_name_plural": "historical events",
"ordering": ("-history_date", "-history_id"),
"get_latest_by": ("history_date", "history_id"),
},
bases=(simple_history.models.HistoricalChanges, models.Model),
),
]
Empty file.
27 changes: 27 additions & 0 deletions app/event/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from core.models import BaseAbstractModel
from django.core.exceptions import ValidationError
from django.db import models
from user.models import Organization


class Event(BaseAbstractModel):
organization = models.ForeignKey(Organization, on_delete=models.PROTECT, related_name="events")
name = models.CharField(max_length=256, null=True, blank=True)
banner_image = models.TextField(null=True, blank=True)
slogan = models.CharField(max_length=1000, null=True, blank=True)
description = models.CharField(max_length=1000, null=True, blank=True)
event_start_at = models.DateTimeField(null=True, blank=True)
event_end_at = models.DateTimeField(null=True, blank=True)
banner_display_start_at = models.DateTimeField(null=True, blank=True)
banner_display_end_at = models.DateTimeField(null=True, blank=True)

def clean(self) -> None:
super().clean()
if self.event_start_at and self.event_end_at and self.event_start_at > self.event_end_at:
raise ValidationError("event의 종료 날짜는 시작 날짜보다 이전일 수 없습니다.")
if (
self.banner_display_start_at
and self.banner_display_end_at
and self.banner_display_start_at > self.banner_display_end_at
):
raise ValidationError("banner 전시 종료 날짜는 시작 날짜보다 이전일 수 없습니다.")
Empty file.
1 change: 1 addition & 0 deletions app/event/presentation/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Register your models here.
19 changes: 19 additions & 0 deletions app/event/presentation/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import importlib

from django.apps import AppConfig


class PresentationConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
Comment thread
earthyoung marked this conversation as resolved.
Outdated
name = "event.presentation"

def ready(self):
importlib.import_module("event.presentation.translation")

from event.presentation.models import Presentation, PresentationCategory, PresentationSpeaker, PresentationType
from simple_history import register

register(PresentationType)
register(PresentationCategory)
register(Presentation)
register(PresentationSpeaker)
Loading