Skip to content

Commit f0bbec4

Browse files
fix: Discount code quantity calculation (#6878)
1 parent 1aebc2f commit f0bbec4

File tree

4 files changed

+80
-12
lines changed

4 files changed

+80
-12
lines changed

app/api/helpers/ticketing.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,16 @@ def get_order_expiry():
3232
def match_discount_quantity(discount_code, tickets=None, ticket_holders=None):
3333
qty = 0
3434
ticket_ids = [ticket.id for ticket in discount_code.tickets]
35-
old_holders = get_count(
36-
TicketHolder.query.filter(
37-
TicketHolder.ticket_id.in_(ticket_ids) # pytype: disable=attribute-error
38-
)
39-
.join(Order)
40-
.filter(Order.status.in_(['completed', 'placed']))
41-
)
35+
old_holders = discount_code.confirmed_attendees_count
4236
if ticket_holders:
43-
for holder in ticket_holders:
44-
ticket_holder = TicketHolder.query.filter_by(id=holder).one()
45-
if ticket_holder.ticket.id in ticket_ids:
46-
qty += 1
37+
# pytype: disable=attribute-error
38+
qty = get_count(
39+
TicketHolder.query.filter(
40+
TicketHolder.id.in_(ticket_holders),
41+
TicketHolder.ticket_id.in_(ticket_ids),
42+
)
43+
)
44+
# pytype: enable=attribute-error
4745
elif tickets:
4846
for ticket in tickets:
4947
if int(ticket['id']) in ticket_ids:

app/factories/discount_code.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class Meta:
4141
type = "amount"
4242
is_active = True
4343
tickets_number = 30
44-
min_quantity = 10
44+
min_quantity = 1
4545
max_quantity = 20
4646
valid_from = common.date_
4747
valid_till = common.dateEnd_

app/models/discount_code.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from datetime import datetime
22
from sqlalchemy.sql import func
3+
from app.api.helpers.db import get_count
34
from app.models import db
45
from app.models.base import SoftDeletionModel
6+
from app.models.order import Order
7+
from app.models.ticket_holder import TicketHolder
58

69
TICKET = 'ticket'
710
EVENT = 'event'
@@ -75,6 +78,22 @@ def __repr__(self):
7578
def __str__(self):
7679
return self.__repr__()
7780

81+
def get_confirmed_attendees_query(self):
82+
return (
83+
TicketHolder.query.filter_by(deleted_at=None)
84+
.join(Order)
85+
.filter_by(discount_code_id=self.id, deleted_at=None)
86+
.filter(Order.status.in_(['completed', 'placed']))
87+
)
88+
89+
@property
90+
def confirmed_attendees(self):
91+
return self.get_confirmed_attendees_query().all()
92+
93+
@property
94+
def confirmed_attendees_count(self):
95+
return get_count(self.get_confirmed_attendees_query())
96+
7897
@property
7998
def serialize(self):
8099
"""Return object data in easily serializable format"""
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from app.api.helpers.ticketing import TicketingManager
2+
from app.factories.attendee import AttendeeFactoryBase
3+
from app.factories.order import OrderFactory
4+
from app.factories.ticket import TicketFactory
5+
from app.factories.discount_code import DiscountCodeTicketFactory
6+
from app.models import db
7+
8+
from tests.all.integration.utils import OpenEventTestCase
9+
10+
11+
class TestTicketing(OpenEventTestCase):
12+
def test_match_discount_quantity(self):
13+
"""Method to test the quantity calculation of discount code"""
14+
15+
with self.app.test_request_context():
16+
ticket = TicketFactory()
17+
discount_code = DiscountCodeTicketFactory(tickets_number=5)
18+
discount_code.tickets.append(ticket)
19+
20+
order_without_discount = OrderFactory(status='completed')
21+
22+
db.session.commit()
23+
24+
# Attendees associated with the order without discount code should not be counted
25+
AttendeeFactoryBase.create_batch(
26+
10, order_id=order_without_discount.id, ticket_id=ticket.id
27+
)
28+
29+
self.assertTrue(
30+
TicketingManager.match_discount_quantity(
31+
discount_code, ticket_holders=[1]
32+
)
33+
)
34+
35+
order_with_discount = OrderFactory(
36+
status='completed', discount_code_id=discount_code.id
37+
)
38+
39+
db.session.commit()
40+
41+
# Attendees associated with the order with discount code should be counted
42+
AttendeeFactoryBase.create_batch(
43+
5, order_id=order_with_discount.id, ticket_id=ticket.id
44+
)
45+
46+
self.assertFalse(
47+
TicketingManager.match_discount_quantity(
48+
discount_code, ticket_holders=[1]
49+
)
50+
)
51+
self.assertEqual(5, discount_code.confirmed_attendees_count)

0 commit comments

Comments
 (0)