Skip to content

Commit 1aebc2f

Browse files
Merge pull request #6877 from fossasia/master
fix: Ticket sold count query (#6871)
2 parents 67d41a1 + 8bca1f1 commit 1aebc2f

File tree

2 files changed

+40
-12
lines changed

2 files changed

+40
-12
lines changed

app/api/attendees.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,17 @@
2424
from app.settings import get_settings
2525

2626

27-
def get_sold_and_reserved_tickets_count(event_id):
27+
def get_sold_and_reserved_tickets_count(ticket_id):
2828
order_expiry_time = get_settings()['order_expiry_time']
2929
return (
3030
db.session.query(TicketHolder.id)
3131
.join(Order)
32-
.filter(TicketHolder.order_id == Order.id)
3332
.filter(
34-
Order.event_id == int(event_id),
33+
TicketHolder.ticket_id == ticket_id,
34+
TicketHolder.order_id == Order.id,
35+
TicketHolder.deleted_at.is_(None),
36+
)
37+
.filter(
3538
Order.deleted_at.is_(None),
3639
or_(
3740
Order.status == 'placed',
@@ -82,7 +85,7 @@ def before_post(self, args, kwargs, data):
8285
"Ticket belongs to a different Event",
8386
)
8487
# Check if the ticket is already sold out or not.
85-
if get_sold_and_reserved_tickets_count(ticket.event_id) >= ticket.quantity:
88+
if get_sold_and_reserved_tickets_count(ticket.id) >= ticket.quantity:
8689
raise ConflictException(
8790
{'pointer': '/data/attributes/ticket_id'}, "Ticket already sold out"
8891
)

tests/all/integration/api/helpers/test_order.py

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def test_count_sold_and_reserved_tickets(self):
6262

6363
with self.app.test_request_context():
6464
ticket = TicketFactory()
65+
other_ticket = TicketFactory()
6566

6667
completed_order = OrderFactory(status='completed')
6768
placed_order = OrderFactory(status='placed')
@@ -79,24 +80,48 @@ def test_count_sold_and_reserved_tickets(self):
7980
db.session.commit()
8081

8182
# will not be counted as they have no order_id
82-
AttendeeFactoryBase.create_batch(2)
83+
AttendeeFactoryBase.create_batch(2, ticket_id=ticket.id)
8384
# will be counted as attendee have valid orders
84-
AttendeeFactoryBase.create_batch(6, order_id=completed_order.id)
85+
AttendeeFactoryBase.create_batch(
86+
6, order_id=completed_order.id, ticket_id=ticket.id
87+
)
8588
# will be counted as attendee has valid placed order
86-
AttendeeFactoryBase(order_id=placed_order.id)
89+
AttendeeFactoryBase(order_id=placed_order.id, ticket_id=ticket.id)
90+
# will not be counted as they are deleted
91+
AttendeeFactoryBase.create_batch(
92+
3,
93+
order_id=placed_order.id,
94+
ticket_id=ticket.id,
95+
deleted_at=datetime.utcnow(),
96+
)
8797
# will be counted as attendee has initializing order under order expiry time
88-
AttendeeFactoryBase.create_batch(4, order_id=initializing_order.id)
98+
AttendeeFactoryBase.create_batch(
99+
4, order_id=initializing_order.id, ticket_id=ticket.id
100+
)
89101
# will be counted as attendee has pending order under 30+order expiry time
90-
AttendeeFactoryBase.create_batch(2, order_id=pending_order.id)
102+
AttendeeFactoryBase.create_batch(
103+
2, order_id=pending_order.id, ticket_id=ticket.id
104+
)
91105
# will not be counted as the order is not under order expiry time
92-
AttendeeFactoryBase.create_batch(3, order_id=expired_time_order.id)
106+
AttendeeFactoryBase.create_batch(
107+
3, order_id=expired_time_order.id, ticket_id=ticket.id
108+
)
93109
# will not be counted as the order has an expired state
94-
AttendeeFactoryBase.create_batch(5, order_id=expired_order.id)
110+
AttendeeFactoryBase.create_batch(
111+
5, order_id=expired_order.id, ticket_id=ticket.id
112+
)
113+
# will not be counted as the attendees have different ticket ID
114+
AttendeeFactoryBase.create_batch(
115+
2, order_id=completed_order.id, ticket_id=other_ticket.id
116+
)
95117

96-
count = get_sold_and_reserved_tickets_count(ticket.event_id)
118+
count = get_sold_and_reserved_tickets_count(ticket.id)
97119

98120
self.assertEqual(count, 13)
99121

122+
# Last 2 attendees belong to other ticket
123+
self.assertEqual(get_sold_and_reserved_tickets_count(other_ticket.id), 2)
124+
100125

101126
if __name__ == '__main__':
102127
unittest.main()

0 commit comments

Comments
 (0)