Skip to content

Commit 47f4198

Browse files
shreyanshdwivediiamareebjamal
authored andcommitted
fix: checks if paid ticket has payment method enabled (#6176)
* fix: checks if paid ticket has payment method enabled * introduce is_payment_enabeled function in event model * updates is_payment_enabled function
1 parent 2bfa553 commit 47f4198

File tree

2 files changed

+46
-3
lines changed

2 files changed

+46
-3
lines changed

app/api/tickets.py

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from flask_rest_jsonapi import ResourceDetail, ResourceList, ResourceRelationship
33
from flask_rest_jsonapi.exceptions import ObjectNotFound
44
from flask_jwt import current_identity as current_user, _jwt_required
5+
from sqlalchemy.orm.exc import NoResultFound
56

67
from app.api.bootstrap import api
78
from app.api.helpers.db import safe_query
@@ -16,7 +17,7 @@
1617
from app.models.ticket import Ticket, TicketTag, ticket_tags_table
1718
from app.models.event import Event
1819
from app.models.ticket_holder import TicketHolder
19-
from app.api.helpers.exceptions import ConflictException, MethodNotAllowed
20+
from app.api.helpers.exceptions import ConflictException, MethodNotAllowed, UnprocessableEntity
2021
from app.api.helpers.db import get_count
2122

2223
class TicketListPost(ResourceList):
@@ -43,10 +44,30 @@ def before_post(self, args, kwargs, data):
4344
if get_count(db.session.query(Event).filter_by(id=int(data['event']), is_ticketing_enabled=False)) > 0:
4445
raise MethodNotAllowed({'parameter': 'event_id'}, "Ticketing is disabled for this Event")
4546

47+
def before_create_object(self, data, view_kwargs):
48+
"""
49+
before create method to check if paid ticket has a paymentMethod enabled
50+
:param data:
51+
:param view_kwargs:
52+
:return:
53+
"""
54+
if data.get('type') == 'paid' and data.get('event'):
55+
try:
56+
event = db.session.query(Event).filter_by(id=data['event'], deleted_at=None).one()
57+
except NoResultFound:
58+
raise UnprocessableEntity({'event_id': data['event']}, "Event does not exist")
59+
if not event.is_payment_enabled():
60+
raise UnprocessableEntity(
61+
{'event_id': data['event']}, "Event having paid ticket must have a payment method")
62+
4663
schema = TicketSchema
4764
methods = ['POST', ]
4865
data_layer = {'session': db.session,
49-
'model': Ticket}
66+
'model': Ticket,
67+
'methods': {
68+
'before_create_object': before_create_object,
69+
'before_post': before_post
70+
}}
5071

5172

5273
class TicketList(ResourceList):
@@ -144,13 +165,31 @@ def before_get_object(self, view_kwargs):
144165
else:
145166
view_kwargs['id'] = None
146167

168+
def before_update_object(self, ticket, data, view_kwargs):
169+
"""
170+
method to check if paid ticket has payment method before updating ticket object
171+
:param ticket:
172+
:param data:
173+
:param view_kwargs:
174+
:return:
175+
"""
176+
if ticket.type == 'paid':
177+
try:
178+
event = db.session.query(Event).filter_by(id=ticket.event.id, deleted_at=None).one()
179+
except NoResultFound:
180+
raise UnprocessableEntity({'event_id': ticket.event.id}, "Event does not exist")
181+
if not event.is_payment_enabled():
182+
raise UnprocessableEntity(
183+
{'event_id': ticket.event.id}, "Event having paid ticket must have a payment method")
184+
147185
decorators = (api.has_permission('is_coorganizer', fetch='event_id',
148186
fetch_as="event_id", model=Ticket, methods="PATCH,DELETE"),)
149187
schema = TicketSchema
150188
data_layer = {'session': db.session,
151189
'model': Ticket,
152190
'methods': {
153-
'before_get_object': before_get_object
191+
'before_get_object': before_get_object,
192+
'before_update_object': before_update_object
154193
}}
155194

156195

app/models/event.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,10 @@ def get_average_rating(self):
356356
avg = round(avg, 2)
357357
return avg
358358

359+
def is_payment_enabled(self):
360+
return self.can_pay_by_paypal or self.can_pay_by_stripe or self.can_pay_by_omise or self.can_pay_by_alipay \
361+
or self.can_pay_by_cheque or self.can_pay_by_bank or self.can_pay_onsite
362+
359363
@property
360364
def average_rating(self):
361365
return self.get_average_rating()

0 commit comments

Comments
 (0)