Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
3 changes: 2 additions & 1 deletion app/core/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@

# type: ignore[assignment]
v1_apis: list[resolvers.URLPattern | resolvers.URLResolver] = [
path("admin-api/", include("admin_api.urls")),
path("cms/", include("cms.urls")),
path("admin-api/", include("admin_api.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.
15 changes: 15 additions & 0 deletions app/event/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import importlib

from django.apps import AppConfig


class EventConfig(AppConfig):
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-05 11:04

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_organization_historicalorganization_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.
18 changes: 18 additions & 0 deletions app/event/presentation/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import importlib

from django.apps import AppConfig


class PresentationConfig(AppConfig):
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