22from flask_rest_jsonapi import ResourceDetail , ResourceList , ResourceRelationship
33from flask_rest_jsonapi .exceptions import ObjectNotFound
44from flask_jwt import current_identity as current_user , _jwt_required
5+ from sqlalchemy .orm .exc import NoResultFound
56
67from app .api .bootstrap import api
78from app .api .helpers .db import safe_query
1617from app .models .ticket import Ticket , TicketTag , ticket_tags_table
1718from app .models .event import Event
1819from 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
2021from app .api .helpers .db import get_count
2122
2223class 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
5273class 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
0 commit comments