Skip to content

Commit 7c00a0c

Browse files
committed
Feat: 후원 혜택 관리를 위한 API 구현
1 parent 8e54abb commit 7c00a0c

File tree

3 files changed

+83
-14
lines changed

3 files changed

+83
-14
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Generated by Django 4.1.5 on 2024-07-28 12:17
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
("sponsor", "0005_patron"),
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name="SponsorBenefit",
16+
fields=[
17+
(
18+
"id",
19+
models.BigAutoField(
20+
auto_created=True,
21+
primary_key=True,
22+
serialize=False,
23+
verbose_name="ID",
24+
),
25+
),
26+
("name", models.CharField(help_text="혜택 이름", max_length=255)),
27+
("desc", models.TextField(blank=True, help_text="기타", null=True)),
28+
("offer", models.PositiveIntegerField(help_text="제공 하는 혜택 개수")),
29+
("unit", models.CharField(help_text="혜택 단위", max_length=10)),
30+
(
31+
"is_countable",
32+
models.BooleanField(
33+
default=True, help_text="제공 하는 혜택이 셀 수 있는지 여부"
34+
),
35+
),
36+
(
37+
"sponsor_level",
38+
models.ForeignKey(
39+
on_delete=django.db.models.deletion.CASCADE,
40+
related_name="benefits",
41+
to="sponsor.sponsorlevel",
42+
),
43+
),
44+
],
45+
options={
46+
"verbose_name": "후원사 등급 별 혜택",
47+
"verbose_name_plural": "후원사 등급 별 혜택 목록",
48+
},
49+
),
50+
]

sponsor/serializers.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
import rest_framework.serializers as serializers
22
from rest_framework.fields import SerializerMethodField
33

4-
from sponsor.models import Patron, Sponsor, SponsorLevel
4+
from sponsor.models import Patron, Sponsor, SponsorLevel, SponsorBenefit
5+
6+
7+
class SponsorBenefitSerializer(serializers.ModelSerializer):
8+
class Meta:
9+
model = SponsorBenefit
10+
fields = ["name", "desc", "offer", "unit", "is_countable"]
11+
read_only_fields = ["id"]
512

613

714
class SponsorSerializer(serializers.ModelSerializer):
@@ -39,6 +46,23 @@ class Meta:
3946
"limit",
4047
"order",
4148
]
49+
read_only_fields = ["id"]
50+
51+
52+
class SponsorLevelDetailSerializer(SponsorLevelSerializer):
53+
benefits = SponsorBenefitSerializer(many=True)
54+
55+
class Meta(SponsorLevelSerializer.Meta):
56+
fields = [
57+
"name",
58+
"desc",
59+
"visible",
60+
"price",
61+
"limit",
62+
"order",
63+
"benefits",
64+
]
65+
read_only_fields = ["id", "benefits"]
4266

4367

4468
class SponsorDetailSerializer(serializers.ModelSerializer):

sponsor/viewsets.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,26 @@
1515
SponsorRemainingAccountSerializer,
1616
SponsorSerializer,
1717
SponsorLevelSerializer,
18+
SponsorLevelDetailSerializer,
1819
)
1920
from sponsor.slack import send_new_sponsor_notification
2021
from sponsor.validators import SponsorValidater
2122

2223

2324
class SponsorLevelViewSet(ModelViewSet):
2425
lookup_field = "id"
25-
serializer_class = SponsorLevelSerializer
2626
http_method_names = ["get", "post", "put", "delete"]
2727

2828
def get_queryset(self):
2929
return SponsorLevel.objects.get_queryset()
3030

31+
def get_serializer(self, *args, **kwargs):
32+
match self.action:
33+
case "list" | "create":
34+
return SponsorLevelSerializer(*args, **kwargs)
35+
case _:
36+
return SponsorLevelDetailSerializer(*args, **kwargs)
37+
3138
def list(self, request, *args, **kwagrs):
3239
queryset = self.get_queryset()
3340
serializer = self.get_serializer(queryset, many=True)
@@ -45,18 +52,6 @@ def retrieve(self, request, id, *args, **kwargs):
4552
serializer = self.get_serializer(sponsor_level)
4653
return Response(serializer.data)
4754

48-
# def update(self, request, id, *args, **kwargs):
49-
# sponsor_level = self.get_object()
50-
# serializer = self.get_serializer(sponsor_level, data=request.data, partial=True)
51-
# serializer.is_valid(raise_exception=True)
52-
# serializer.save()
53-
# return Response(serializer.data)
54-
55-
# def delete(self, request, id, *args, **kwagrs):
56-
# sponsor_level = self.get_object()
57-
# sponsor_level.delete()
58-
# return Response(status=status.HTTP_204_NO_CONTENT)
59-
6055

6156
class SponsorViewSet(ModelViewSet):
6257
serializer_class = SponsorSerializer

0 commit comments

Comments
 (0)