Skip to content

Commit 1521c32

Browse files
prateekj117iamareebjamal
authored andcommitted
chore(refactor): Make separate blueprint for events and orders (#6615)
1 parent 2afb5c7 commit 1521c32

File tree

3 files changed

+73
-54
lines changed

3 files changed

+73
-54
lines changed

app/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ def create_app():
152152
from app.api.settings import admin_misc_routes
153153
from app.api.server_version import info_route
154154
from app.api.custom.orders import ticket_blueprint
155+
from app.api.custom.orders import order_blueprint
156+
from app.api.custom.invoices import event_blueprint
155157

156158
app.register_blueprint(api_v1)
157159
app.register_blueprint(event_copy)
@@ -165,12 +167,14 @@ def create_app():
165167
app.register_blueprint(attendee_misc_routes)
166168
app.register_blueprint(order_misc_routes)
167169
app.register_blueprint(role_invites_misc_routes)
168-
app.register_blueprint(ticket_blueprint)
169170
app.register_blueprint(authorised_blueprint)
170171
app.register_blueprint(admin_blueprint)
171172
app.register_blueprint(alipay_blueprint)
172173
app.register_blueprint(admin_misc_routes)
173174
app.register_blueprint(info_route)
175+
app.register_blueprint(ticket_blueprint)
176+
app.register_blueprint(order_blueprint)
177+
app.register_blueprint(event_blueprint)
174178

175179
add_engine_pidguard(db.engine)
176180

app/api/custom/invoices.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from flask import Blueprint
2+
from flask_rest_jsonapi.exceptions import ObjectNotFound
3+
from flask_jwt_extended import current_user, jwt_required
4+
from sqlalchemy.orm.exc import NoResultFound
5+
6+
7+
from app.api.auth import return_file
8+
from app.api.helpers.errors import ForbiddenError, NotFoundError
9+
from app.api.helpers.order import create_pdf_tickets_for_holder
10+
from app.api.helpers.storage import UPLOAD_PATHS, generate_hash
11+
from app.models.order import Order
12+
from app.models.event_invoice import EventInvoice
13+
from app.api.custom.orders import order_blueprint
14+
15+
event_blueprint = Blueprint('event_blueprint', __name__, url_prefix='/v1/events')
16+
17+
18+
@event_blueprint.route('/invoices/<string:invoice_identifier>')
19+
@jwt_required
20+
def event_invoices(invoice_identifier):
21+
if not current_user:
22+
return ForbiddenError({'source': ''}, 'Authentication Required to access Invoice').respond()
23+
try:
24+
event_invoice = EventInvoice.query.filter_by(identifier=invoice_identifier).first()
25+
event_id = event_invoice.event_id
26+
except NoResultFound:
27+
return NotFoundError({'source': ''}, 'Event Invoice not found').respond()
28+
if not current_user.is_organizer(event_id) and not current_user.is_staff:
29+
return ForbiddenError({'source': ''}, 'Unauthorized Access').respond()
30+
key = UPLOAD_PATHS['pdf']['event_invoices'].format(identifier=invoice_identifier)
31+
file_path = '../generated/invoices/{}/{}/'.format(key, generate_hash(key)) + invoice_identifier + '.pdf'
32+
try:
33+
return return_file('event-invoice', file_path, invoice_identifier)
34+
except FileNotFoundError:
35+
raise ObjectNotFound({'source': ''},
36+
"The Event Invoice isn't available at the moment. \
37+
Invoices are usually issued on the 1st of every month")
38+
39+
40+
@order_blueprint.route('/invoices/<string:order_identifier>')
41+
@jwt_required
42+
def order_invoices(order_identifier):
43+
if current_user:
44+
try:
45+
order = Order.query.filter_by(identifier=order_identifier).first()
46+
except NoResultFound:
47+
return NotFoundError({'source': ''}, 'Order Invoice not found').respond()
48+
if current_user.can_download_tickets(order):
49+
key = UPLOAD_PATHS['pdf']['order'].format(identifier=order_identifier)
50+
file_path = '../generated/invoices/{}/{}/'.format(key, generate_hash(key)) + order_identifier + '.pdf'
51+
try:
52+
return return_file('invoice', file_path, order_identifier)
53+
except FileNotFoundError:
54+
create_pdf_tickets_for_holder(order)
55+
return return_file('invoice', file_path, order_identifier)
56+
else:
57+
return ForbiddenError({'source': ''}, 'Unauthorized Access').respond()
58+
else:
59+
return ForbiddenError({'source': ''}, 'Authentication Required to access Invoice').respond()

app/api/custom/orders.py

Lines changed: 9 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
from flask import Blueprint, jsonify, request
2-
from flask_rest_jsonapi.exceptions import ObjectNotFound
32
from flask_jwt_extended import current_user, jwt_required
4-
from sqlalchemy.orm.exc import NoResultFound
53
from flask_limiter.util import get_remote_address
4+
from sqlalchemy.orm.exc import NoResultFound
65

76

87
from app import limiter
98
from app.models import db
109
from app.api.auth import return_file
1110
from app.api.helpers.db import safe_query
1211
from app.api.helpers.mail import send_email_to_attendees
13-
from app.api.helpers.errors import ForbiddenError, NotFoundError, UnprocessableEntityError
14-
from app.api.helpers.order import create_pdf_tickets_for_holder, calculate_order_amount
12+
from app.api.helpers.errors import ForbiddenError, UnprocessableEntityError, NotFoundError
13+
from app.api.helpers.order import calculate_order_amount, create_pdf_tickets_for_holder
1514
from app.api.helpers.storage import UPLOAD_PATHS
1615
from app.api.helpers.storage import generate_hash
1716
from app.api.helpers.ticketing import TicketingManager
1817
from app.api.helpers.permission_manager import has_access
19-
from app.models.event_invoice import EventInvoice
2018
from app.models.discount_code import DiscountCode
2119
from app.models.order import Order
2220

23-
ticket_blueprint = Blueprint('ticket_blueprint', __name__, url_prefix='/v1')
21+
order_blueprint = Blueprint('order_blueprint', __name__, url_prefix='/v1/orders')
22+
ticket_blueprint = Blueprint('ticket_blueprint', __name__, url_prefix='/v1/tickets')
2423

2524

26-
@ticket_blueprint.route('/tickets/<string:order_identifier>')
25+
@ticket_blueprint.route('/<string:order_identifier>')
26+
@order_blueprint.route('/<string:order_identifier>/tickets-pdf')
2727
@jwt_required
2828
def ticket_attendee_authorized(order_identifier):
2929
if current_user:
@@ -45,51 +45,7 @@ def ticket_attendee_authorized(order_identifier):
4545
return ForbiddenError({'source': ''}, 'Authentication Required to access ticket').respond()
4646

4747

48-
@ticket_blueprint.route('/orders/invoices/<string:order_identifier>')
49-
@jwt_required
50-
def order_invoices(order_identifier):
51-
if current_user:
52-
try:
53-
order = Order.query.filter_by(identifier=order_identifier).first()
54-
except NoResultFound:
55-
return NotFoundError({'source': ''}, 'Order Invoice not found').respond()
56-
if current_user.can_download_tickets(order):
57-
key = UPLOAD_PATHS['pdf']['order'].format(identifier=order_identifier)
58-
file_path = '../generated/invoices/{}/{}/'.format(key, generate_hash(key)) + order_identifier + '.pdf'
59-
try:
60-
return return_file('invoice', file_path, order_identifier)
61-
except FileNotFoundError:
62-
create_pdf_tickets_for_holder(order)
63-
return return_file('invoice', file_path, order_identifier)
64-
else:
65-
return ForbiddenError({'source': ''}, 'Unauthorized Access').respond()
66-
else:
67-
return ForbiddenError({'source': ''}, 'Authentication Required to access Invoice').respond()
68-
69-
70-
@ticket_blueprint.route('/events/invoices/<string:invoice_identifier>')
71-
@jwt_required
72-
def event_invoices(invoice_identifier):
73-
if not current_user:
74-
return ForbiddenError({'source': ''}, 'Authentication Required to access Invoice').respond()
75-
try:
76-
event_invoice = EventInvoice.query.filter_by(identifier=invoice_identifier).first()
77-
event_id = event_invoice.event_id
78-
except NoResultFound:
79-
return NotFoundError({'source': ''}, 'Event Invoice not found').respond()
80-
if not current_user.is_organizer(event_id) and not current_user.is_staff:
81-
return ForbiddenError({'source': ''}, 'Unauthorized Access').respond()
82-
key = UPLOAD_PATHS['pdf']['event_invoices'].format(identifier=invoice_identifier)
83-
file_path = '../generated/invoices/{}/{}/'.format(key, generate_hash(key)) + invoice_identifier + '.pdf'
84-
try:
85-
return return_file('event-invoice', file_path, invoice_identifier)
86-
except FileNotFoundError:
87-
raise ObjectNotFound({'source': ''},
88-
"The Event Invoice isn't available at the moment. \
89-
Invoices are usually issued on the 1st of every month")
90-
91-
92-
@ticket_blueprint.route('/orders/resend-email', methods=['POST'])
48+
@order_blueprint.route('/resend-email', methods=['POST'])
9349
@limiter.limit(
9450
'5/minute', key_func=lambda: request.json['data']['user'], error_message='Limit for this action exceeded'
9551
)
@@ -124,7 +80,7 @@ def resend_emails():
12480
return ForbiddenError({'source': ''}, "Co-Organizer Access Required").respond()
12581

12682

127-
@ticket_blueprint.route('/orders/calculate-amount', methods=['POST'])
83+
@order_blueprint.route('/calculate-amount', methods=['POST'])
12884
@jwt_required
12985
def calculate_amount():
13086
data = request.get_json()

0 commit comments

Comments
 (0)