Skip to content

Commit 040e821

Browse files
committed
Edit ticket models
1 parent f79660a commit 040e821

File tree

6 files changed

+97
-23
lines changed

6 files changed

+97
-23
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 4.1.5 on 2023-05-24 13:06
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('ticket', '0003_ticket_remove_tickettype_code_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='tickettype',
15+
name='id',
16+
field=models.UUIDField(primary_key=True, serialize=False),
17+
),
18+
]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 4.1.5 on 2023-05-24 13:07
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('ticket', '0004_alter_tickettype_id'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='tickettype',
15+
name='day',
16+
field=models.CharField(choices=[('FRI', '금요일'), ('SAT', '토요일'), ('SUN', '일요일'), ('WEEKEND', '토/일요일')], max_length=10),
17+
),
18+
]
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 4.1.5 on 2023-05-24 13:39
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+
('program', '0003_program'),
11+
('ticket', '0005_alter_tickettype_day'),
12+
]
13+
14+
operations = [
15+
migrations.AddField(
16+
model_name='tickettype',
17+
name='program',
18+
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='program.program'),
19+
),
20+
]

ticket/models.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,21 @@
99

1010

1111
class TicketType(models.Model):
12+
id = models.UUIDField(primary_key=True)
1213
name = models.CharField(max_length=100)
1314
price = models.IntegerField()
1415
min_price = models.IntegerField(null=True, blank=True)
1516
desc = models.TextField(max_length=1000)
1617
day = models.CharField(
1718
max_length=10,
1819
choices=(
20+
("FRI", "금요일"),
1921
("SAT", "토요일"),
2022
("SUN", "일요일"),
2123
("WEEKEND", "토/일요일"),
2224
),
2325
)
24-
# program = models.ForeignKey() # TODO
26+
program = models.ForeignKey("program.Program", on_delete=models.PROTECT, null=True)
2527
is_refundable = models.BooleanField(default=True)
2628

2729
def __str__(self):
@@ -30,6 +32,12 @@ def __str__(self):
3032
@property
3133
def buyable(self) -> bool:
3234
"""잔여 수량이 있는지"""
35+
if self.day == "FRI":
36+
ticket_count = Ticket.objects.filter(
37+
models.Q(ticket_type=self) & models.Q(is_refunded=False)
38+
).count()
39+
return ticket_count < self.program.capacity
40+
3341
sat_ticket_count = Ticket.objects.filter(
3442
models.Q(ticket_type__day="SAT") | models.Q(ticket_type__day="WEEKEND")
3543
).filter(is_refunded=False).count()

ticket/view_models.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,24 @@
55

66

77
@dataclass(init=False)
8-
class ConferenceTicketTypeViewModel:
9-
code: str
8+
class TicketTypeViewModel:
9+
id: str
1010
name: str
1111
price: int
1212
min_price: Optional[int]
1313
desc: str
14-
day: str
14+
day: str # choice
15+
# program: ...
16+
is_refundable: bool
1517

1618
def __init__(self, model: TicketType):
17-
self.code = model.code
19+
self.id = model.id
1820
self.name = model.name
1921
self.price = model.price
2022
self.min_price = model.min_price
2123
self.desc = model.desc
2224
self.day = model.day
25+
self.is_refundable = model.is_refundable
2326

2427
def to_dict(self):
2528
return asdict(self)

ticket/views.py

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
import json
22
import traceback
33
from datetime import datetime
4-
from typing import Callable, Literal
4+
from typing import Callable, Literal, Dict, List
55

66
from django.contrib.auth import get_user_model
77
from django.http import HttpRequest, HttpResponse
88
from django.shortcuts import get_object_or_404, render
9-
from django.views.decorators.csrf import csrf_exempt
109
from django.views import View
10+
from django.views.decorators.csrf import csrf_exempt
1111

12+
import payment.utils
13+
from program.models import CONFERENCE, TUTORIAL, SPRINT
1214
from .models import Ticket, TicketType
1315
from .requests import (
1416
AddConferenceTicketRequest,
1517
CheckConferenceTicketTypeBuyableRequest,
1618
GetConferenceTicketTypesRequest,
1719
RequestParsingException,
1820
)
19-
from .view_models import ConferenceTicketTypeViewModel
20-
21-
import payment.utils
21+
from .view_models import TicketTypeViewModel
2222

2323
User = get_user_model()
2424

@@ -64,20 +64,27 @@ def get__get_ticket_types(request: HttpRequest, **kwargs) -> HttpResponse:
6464

6565
ticket_types = TicketType.objects.all()
6666

67-
return HttpResponse(
68-
json.dumps(
69-
[
70-
ConferenceTicketTypeViewModel(ticket_type).to_dict()
71-
for ticket_type in ticket_types
72-
]
73-
)
74-
)
67+
response: Dict[str, List[dict]] = {
68+
"conference": [],
69+
"tutorial": [],
70+
"sprint": [],
71+
}
72+
73+
for ticket_type in ticket_types:
74+
if ticket_type.program.program_type == CONFERENCE:
75+
response["conference"].append(TicketTypeViewModel(ticket_type).to_dict())
76+
elif ticket_type.program.program_type == TUTORIAL:
77+
response["tutorial"].append(TicketTypeViewModel(ticket_type).to_dict())
78+
elif ticket_type.program.program_type == SPRINT:
79+
response["sprint"].append(TicketTypeViewModel(ticket_type).to_dict())
80+
81+
return HttpResponse(json.dumps(response))
7582

7683

7784
@request_method("GET")
7885
@exception_wrapper
7986
def get__check_conference_ticket_type_buyable(
80-
request: HttpRequest, **kwargs
87+
request: HttpRequest, **kwargs
8188
) -> HttpResponse:
8289
"""특정 티켓 종류 구매 가능 여부 조회"""
8390
request = CheckConferenceTicketTypeBuyableRequest(request, **kwargs)
@@ -143,10 +150,10 @@ def post__add_conference_ticket(request: HttpRequest, **kwargs) -> HttpResponse:
143150

144151
bought_tickets = Ticket.objects.filter(user=user)
145152
if any(
146-
(
147-
not bought_ticket.ticket_type.can_coexist(ticket_type)
148-
for bought_ticket in bought_tickets
149-
)
153+
(
154+
not bought_ticket.ticket_type.can_coexist(ticket_type)
155+
for bought_ticket in bought_tickets
156+
)
150157
):
151158
return HttpResponse("Duplicate day", status=400)
152159

0 commit comments

Comments
 (0)