1515 get_jwt_identity )
1616from flask_limiter .util import get_remote_address
1717from healthcheck import EnvironmentDump
18- from flask_rest_jsonapi .exceptions import ObjectNotFound
1918from sqlalchemy .orm .exc import NoResultFound
2019
2120from app import get_settings
2221from app import limiter
23- from app .api .helpers .db import save_to_db , get_count , safe_query
22+ from app .api .helpers .db import save_to_db , get_count
2423from app .api .helpers .auth import AuthManager , blacklist_token
2524from app .api .helpers .jwt import jwt_authenticate
26- from app .api .helpers .errors import ForbiddenError , UnprocessableEntityError , NotFoundError , BadRequestError
25+ from app .api .helpers .errors import UnprocessableEntityError , NotFoundError , BadRequestError
2726from app .api .helpers .files import make_frontend_url
28- from app .api .helpers .mail import send_email_to_attendees
2927from app .api .helpers .mail import send_email_with_action , \
3028 send_email_confirmation
3129from app .api .helpers .notification import send_notification_with_action
32- from app .api .helpers .order import create_pdf_tickets_for_holder , calculate_order_amount
33- from app .api .helpers .storage import UPLOAD_PATHS
34- from app .api .helpers .storage import generate_hash
3530from app .api .helpers .third_party_auth import GoogleOAuth , FbOAuth , TwitterOAuth , InstagramOAuth
36- from app .api .helpers .ticketing import TicketingManager
3731from app .api .helpers .utilities import get_serializer , str_generator
38- from app .api .helpers .permission_manager import has_access
3932from app .models import db
4033from app .models .mail import PASSWORD_RESET , PASSWORD_CHANGE , \
4134 PASSWORD_RESET_AND_VERIFY
4235from app .models .notification import PASSWORD_CHANGE as PASSWORD_CHANGE_NOTIF
43- from app .models .discount_code import DiscountCode
44- from app .models .order import Order
4536from app .models .user import User
46- from app .models .event_invoice import EventInvoice
4737
4838
4939logger = logging .getLogger (__name__ )
5040authorised_blueprint = Blueprint ('authorised_blueprint' , __name__ , url_prefix = '/' )
51- ticket_blueprint = Blueprint ('ticket_blueprint' , __name__ , url_prefix = '/v1' )
5241auth_routes = Blueprint ('auth' , __name__ , url_prefix = '/v1/auth' )
5342
5443
@@ -386,72 +375,6 @@ def return_file(file_name_prefix, file_path, identifier):
386375 return response
387376
388377
389- @ticket_blueprint .route ('/tickets/<string:order_identifier>' )
390- @jwt_required
391- def ticket_attendee_authorized (order_identifier ):
392- if current_user :
393- try :
394- order = Order .query .filter_by (identifier = order_identifier ).first ()
395- except NoResultFound :
396- return NotFoundError ({'source' : '' }, 'This ticket is not associated with any order' ).respond ()
397- if current_user .can_download_tickets (order ):
398- key = UPLOAD_PATHS ['pdf' ]['tickets_all' ].format (identifier = order_identifier )
399- file_path = '../generated/tickets/{}/{}/' .format (key , generate_hash (key )) + order_identifier + '.pdf'
400- try :
401- return return_file ('ticket' , file_path , order_identifier )
402- except FileNotFoundError :
403- create_pdf_tickets_for_holder (order )
404- return return_file ('ticket' , file_path , order_identifier )
405- else :
406- return ForbiddenError ({'source' : '' }, 'Unauthorized Access' ).respond ()
407- else :
408- return ForbiddenError ({'source' : '' }, 'Authentication Required to access ticket' ).respond ()
409-
410-
411- @ticket_blueprint .route ('/orders/invoices/<string:order_identifier>' )
412- @jwt_required
413- def order_invoices (order_identifier ):
414- if current_user :
415- try :
416- order = Order .query .filter_by (identifier = order_identifier ).first ()
417- except NoResultFound :
418- return NotFoundError ({'source' : '' }, 'Order Invoice not found' ).respond ()
419- if current_user .can_download_tickets (order ):
420- key = UPLOAD_PATHS ['pdf' ]['order' ].format (identifier = order_identifier )
421- file_path = '../generated/invoices/{}/{}/' .format (key , generate_hash (key )) + order_identifier + '.pdf'
422- try :
423- return return_file ('invoice' , file_path , order_identifier )
424- except FileNotFoundError :
425- create_pdf_tickets_for_holder (order )
426- return return_file ('invoice' , file_path , order_identifier )
427- else :
428- return ForbiddenError ({'source' : '' }, 'Unauthorized Access' ).respond ()
429- else :
430- return ForbiddenError ({'source' : '' }, 'Authentication Required to access Invoice' ).respond ()
431-
432-
433- @ticket_blueprint .route ('/events/invoices/<string:invoice_identifier>' )
434- @jwt_required
435- def event_invoices (invoice_identifier ):
436- if not current_user :
437- return ForbiddenError ({'source' : '' }, 'Authentication Required to access Invoice' ).respond ()
438- try :
439- event_invoice = EventInvoice .query .filter_by (identifier = invoice_identifier ).first ()
440- event_id = event_invoice .event_id
441- except NoResultFound :
442- return NotFoundError ({'source' : '' }, 'Event Invoice not found' ).respond ()
443- if not current_user .is_organizer (event_id ) and not current_user .is_staff :
444- return ForbiddenError ({'source' : '' }, 'Unauthorized Access' ).respond ()
445- key = UPLOAD_PATHS ['pdf' ]['event_invoices' ].format (identifier = invoice_identifier )
446- file_path = '../generated/invoices/{}/{}/' .format (key , generate_hash (key )) + invoice_identifier + '.pdf'
447- try :
448- return return_file ('event-invoice' , file_path , invoice_identifier )
449- except FileNotFoundError :
450- raise ObjectNotFound ({'source' : '' },
451- "The Event Invoice isn't available at the moment. \
452- Invoices are usually issued on the 1st of every month" )
453-
454-
455378# Access for Environment details & Basic Auth Support
456379def requires_basic_auth (f ):
457380 @wraps (f )
@@ -470,53 +393,3 @@ def decorated(*args, **kwargs):
470393def environment_details ():
471394 envdump = EnvironmentDump (include_config = False )
472395 return envdump .dump_environment ()
473-
474-
475- @ticket_blueprint .route ('/orders/resend-email' , methods = ['POST' ])
476- @limiter .limit (
477- '5/minute' , key_func = lambda : request .json ['data' ]['user' ], error_message = 'Limit for this action exceeded'
478- )
479- @limiter .limit (
480- '60/minute' , key_func = get_remote_address , error_message = 'Limit for this action exceeded'
481- )
482- def resend_emails ():
483- """
484- Sends confirmation email for pending and completed orders on organizer request
485- :param order_identifier:
486- :return: JSON response if the email was succesfully sent
487- """
488- order_identifier = request .json ['data' ]['order' ]
489- order = safe_query (db , Order , 'identifier' , order_identifier , 'identifier' )
490- if (has_access ('is_coorganizer' , event_id = order .event_id )):
491- if order .status == 'completed' or order .status == 'placed' :
492- # fetch tickets attachment
493- order_identifier = order .identifier
494- key = UPLOAD_PATHS ['pdf' ]['tickets_all' ].format (identifier = order_identifier )
495- ticket_path = 'generated/tickets/{}/{}/' .format (key , generate_hash (key )) + order_identifier + '.pdf'
496- key = UPLOAD_PATHS ['pdf' ]['order' ].format (identifier = order_identifier )
497- invoice_path = 'generated/invoices/{}/{}/' .format (key , generate_hash (key )) + order_identifier + '.pdf'
498-
499- # send email.
500- send_email_to_attendees (order = order , purchaser_id = current_user .id , attachments = [ticket_path , invoice_path ])
501- return jsonify (status = True , message = "Verification emails for order : {} has been sent succesfully" .
502- format (order_identifier ))
503- else :
504- return UnprocessableEntityError ({'source' : 'data/order' },
505- "Only placed and completed orders have confirmation" ).respond ()
506- else :
507- return ForbiddenError ({'source' : '' }, "Co-Organizer Access Required" ).respond ()
508-
509-
510- @ticket_blueprint .route ('/orders/calculate-amount' , methods = ['POST' ])
511- @jwt_required
512- def calculate_amount ():
513- data = request .get_json ()
514- tickets = data ['tickets' ]
515- discount_code = None
516- if 'discount-code' in data :
517- discount_code_id = data ['discount-code' ]
518- discount_code = safe_query (db , DiscountCode , 'id' , discount_code_id , 'id' )
519- if not TicketingManager .match_discount_quantity (discount_code , tickets , None ):
520- return UnprocessableEntityError ({'source' : 'discount-code' }, 'Discount Usage Exceeded' ).respond ()
521-
522- return jsonify (calculate_order_amount (tickets , discount_code ))
0 commit comments