Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
1 change: 1 addition & 0 deletions app/core/const/tag.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ class OpenAPITag:
EVENT = "Event"
EVENT_PRESENTATION = "Event > Presentation"
EVENT_SPONSOR = "Event > Sponsor"
EVENT_PRESENTATION_BOOKMARK = "Event > Presentation Bookmark"

SHOP_USER = "Shop > 고객"
SHOP_PRODUCT = "Shop > 상품"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Generated by Django 6.0.6 on 2026-07-11 05:12

import uuid

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("event", "0006_event_logo_historicalevent_logo"),
("presentation", "0016_room_order"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name="PresentationBookmark",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
(
"event",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="presentation_bookmarks",
to="event.event",
),
),
(
"presentation",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="bookmarks",
to="presentation.presentation",
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="presentation_bookmarks",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"constraints": [
models.UniqueConstraint(
fields=("user", "presentation"),
name="uq__prst_bkmk__user__presentation",
)
],
},
),
]
19 changes: 19 additions & 0 deletions app/event/presentation/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,3 +210,22 @@ class RoomSchedule(BaseAbstractModel):

def __str__(self) -> str:
return f"[{self.room}] {self.start_at} - {self.end_at} ({self.presentation})"


class PresentationBookmark(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="presentation_bookmarks")
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name="presentation_bookmarks")

@MU-Software MU-Software Jul 11, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기에 event를 두신건 빠른 쿼리를 위해서일까요? presentation__type__event로도 쿼리는 가능할 것 같아서요!
그리고 앞서 말씀드린 filterset_class에선 아래처럼 정의하고요.

class PresentationBookmark(filters.FilterSet):
    event_id = filters.UUIDFilter(field_name="presentation__type__event_id")
    event_name = filters.CharFilter(field_name="presentation__type__event__name", lookup_expr="icontains")

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 감사합니다. 이렇게 바꿔볼게요!

presentation = models.ForeignKey(Presentation, on_delete=models.CASCADE, related_name="bookmarks")
created_at = models.DateTimeField(auto_now_add=True)

class Meta:
constraints = [
models.UniqueConstraint(
fields=["user", "presentation"],
name="uq__prst_bkmk__user__presentation",
)
]

def __str__(self) -> str:
return f"[Bookmark] {self.user} - {self.presentation}"
12 changes: 12 additions & 0 deletions app/event/presentation/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@
from rest_framework import serializers


class PresentationBookmarkRequestSerializer(serializers.Serializer):
presentation_id = serializers.UUIDField()

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

serializers.PrimaryKeyRelatedField를 사용하시면, 나중에 create 메소드에서 한번 더 쿼리하실 필요 없을 것 같아요!



class PresentationBookmarkListResponseSerializer(serializers.Serializer):
presentation_ids = serializers.ListField(child=serializers.UUIDField())


class PresentationBookmarkResponseSerializer(serializers.Serializer):
presentation_id = serializers.UUIDField()


class PresentationTypeSerializer(serializers.ModelSerializer):
event = EventSerializer(read_only=True)

Expand Down
Loading
Loading