From 350df3aaf25f8033aa4ada3ab476272707dd1195 Mon Sep 17 00:00:00 2001 From: iamareebjamal Date: Mon, 5 Oct 2020 17:48:52 +0530 Subject: [PATCH 1/3] fix: Admin Sales API --- app/api/admin_sales/events.py | 7 +++++-- app/api/admin_sales/marketer.py | 2 +- app/api/admin_sales/organizer.py | 2 +- app/api/admin_sales/utils.py | 17 ++++++++++++----- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/app/api/admin_sales/events.py b/app/api/admin_sales/events.py index 125b94a9c2..fad635508e 100644 --- a/app/api/admin_sales/events.py +++ b/app/api/admin_sales/events.py @@ -26,10 +26,13 @@ class Meta: inflect = dasherize id = fields.String() + identifier = fields.String() name = fields.String() + created_at = fields.DateTime() starts_at = fields.DateTime() ends_at = fields.DateTime() payment_currency = fields.String() + payment_country = fields.String() sales = fields.Method('calc_sales') @staticmethod @@ -38,7 +41,7 @@ def calc_sales(obj): Returns sales (dictionary with total sales and ticket count) for placed, completed and pending orders """ - return summary(obj.orders) + return summary(obj) class AdminSalesByEventsList(ResourceList): @@ -48,7 +51,7 @@ class AdminSalesByEventsList(ResourceList): """ def query(self, _): - return self.session.query(Event).outerjoin(Order).outerjoin(OrderTicket) + return Event.query methods = ['GET'] decorators = (api.has_permission('is_admin'),) diff --git a/app/api/admin_sales/marketer.py b/app/api/admin_sales/marketer.py index b4888fa818..6b6ef1664d 100644 --- a/app/api/admin_sales/marketer.py +++ b/app/api/admin_sales/marketer.py @@ -33,7 +33,7 @@ def calc_sales(obj): Returns sales (dictionary with total sales and ticket count) for placed, completed and pending orders """ - return summary(obj.orders) + return summary(obj) class AdminSalesByMarketerList(ResourceList): diff --git a/app/api/admin_sales/organizer.py b/app/api/admin_sales/organizer.py index e80673cb15..007c43f3ef 100644 --- a/app/api/admin_sales/organizer.py +++ b/app/api/admin_sales/organizer.py @@ -42,7 +42,7 @@ def calc_sales(obj): Returns sales (dictionary with total sales and ticket count) for placed, completed and pending orders """ - return summary(obj.orders) + return summary(obj) class AdminSalesByOrganizersList(ResourceList): diff --git a/app/api/admin_sales/utils.py b/app/api/admin_sales/utils.py index 2a70b8fdae..a8cb578e57 100644 --- a/app/api/admin_sales/utils.py +++ b/app/api/admin_sales/utils.py @@ -2,22 +2,29 @@ This module contains common sales calculations that are used throughout the admin section """ +from sqlalchemy import func +from app.models.order import Order +from app.models.ticket_holder import TicketHolder +from app.api.helpers.db import get_count -def status_summary(orders, status): + +def status_summary(event, status): """ Groups orders by status and returns the total sales and ticket count as a dictionary """ + sales = Order.query.filter_by(event_id=event.id, status=status).with_entities(func.sum(Order.amount)).scalar() or 0 + tickets = get_count(TicketHolder.query.join(Order).filter(Order.event_id == event.id, Order.status == status)) return { - 'sales_total': sum(o.amount for o in orders if o.status == status), - 'ticket_count': sum(o.tickets_count for o in orders if o.status == status), + 'sales_total': sales, + 'ticket_count': tickets, } -def summary(orders): +def summary(event): """ Returns sales as dictionary for all status codes """ status_codes = ['placed', 'completed', 'pending'] - return {s: status_summary(orders, s) for s in status_codes} + return {s: status_summary(event, s) for s in status_codes} From 1db9f34b356f5cc5d91478b98ef0fbaba0198196 Mon Sep 17 00:00:00 2001 From: iamareebjamal Date: Mon, 5 Oct 2020 17:50:49 +0530 Subject: [PATCH 2/3] fix --- app/api/admin_sales/utils.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/app/api/admin_sales/utils.py b/app/api/admin_sales/utils.py index a8cb578e57..bad33117d2 100644 --- a/app/api/admin_sales/utils.py +++ b/app/api/admin_sales/utils.py @@ -4,9 +4,9 @@ """ from sqlalchemy import func +from app.api.helpers.db import get_count from app.models.order import Order from app.models.ticket_holder import TicketHolder -from app.api.helpers.db import get_count def status_summary(event, status): @@ -14,8 +14,17 @@ def status_summary(event, status): Groups orders by status and returns the total sales and ticket count as a dictionary """ - sales = Order.query.filter_by(event_id=event.id, status=status).with_entities(func.sum(Order.amount)).scalar() or 0 - tickets = get_count(TicketHolder.query.join(Order).filter(Order.event_id == event.id, Order.status == status)) + sales = ( + Order.query.filter_by(event_id=event.id, status=status) + .with_entities(func.sum(Order.amount)) + .scalar() + or 0 + ) + tickets = get_count( + TicketHolder.query.join(Order).filter( + Order.event_id == event.id, Order.status == status + ) + ) return { 'sales_total': sales, 'ticket_count': tickets, From cf65c09cfabec57f4df147f0413f2932ed415a34 Mon Sep 17 00:00:00 2001 From: iamareebjamal Date: Mon, 5 Oct 2020 18:01:58 +0530 Subject: [PATCH 3/3] fix --- app/api/admin_sales/utils.py | 40 +++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/app/api/admin_sales/utils.py b/app/api/admin_sales/utils.py index bad33117d2..c74a460295 100644 --- a/app/api/admin_sales/utils.py +++ b/app/api/admin_sales/utils.py @@ -4,27 +4,26 @@ """ from sqlalchemy import func -from app.api.helpers.db import get_count from app.models.order import Order from app.models.ticket_holder import TicketHolder -def status_summary(event, status): +def status_summary(sales_summary, tickets_summary, status): """ Groups orders by status and returns the total sales and ticket count as a dictionary """ - sales = ( - Order.query.filter_by(event_id=event.id, status=status) - .with_entities(func.sum(Order.amount)) - .scalar() - or 0 - ) - tickets = get_count( - TicketHolder.query.join(Order).filter( - Order.event_id == event.id, Order.status == status - ) - ) + sales = 0 + tickets = 0 + + for sale_status, sale in sales_summary: + if sale_status == status: + sales = sale + + for ticket_status, ticket in tickets_summary: + if ticket_status == status: + tickets = ticket + return { 'sales_total': sales, 'ticket_count': tickets, @@ -35,5 +34,18 @@ def summary(event): """ Returns sales as dictionary for all status codes """ + sales_summary = ( + Order.query.filter_by(event_id=event.id) + .with_entities(Order.status, func.sum(Order.amount)) + .group_by(Order.status) + .all() + ) + tickets_summary = ( + TicketHolder.query.join(Order) + .filter(Order.event_id == event.id) + .with_entities(Order.status, func.count()) + .group_by(Order.status) + .all() + ) status_codes = ['placed', 'completed', 'pending'] - return {s: status_summary(event, s) for s in status_codes} + return {s: status_summary(sales_summary, tickets_summary, s) for s in status_codes}