Skip to content

Commit

Permalink
feat: Add max_quantity of ticket in order-statistics-event and includ…
Browse files Browse the repository at this point in the history
…ed order_statistics in event
  • Loading branch information
codedsun committed Jan 10, 2020
1 parent 3ea3814 commit 1bc2451
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 2 deletions.
7 changes: 5 additions & 2 deletions app/api/order_statistics/events.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from flask_rest_jsonapi import ResourceDetail
from marshmallow_jsonapi import fields
from marshmallow_jsonapi.flask import Schema
from marshmallow_jsonapi.flask import Schema, Relationship
from sqlalchemy import func

from app.api.bootstrap import api
Expand All @@ -9,6 +9,7 @@
from app.api.helpers.utilities import dasherize
from app.models import db
from app.models.event import Event
from app.models.ticket import Ticket
from app.models.order import Order, OrderTicket


Expand Down Expand Up @@ -48,14 +49,16 @@ def tickets_count(self, obj):
Order.event_id == obj_id, Order.status == 'placed').scalar()
completed = db.session.query(func.sum(OrderTicket.quantity.label('sum'))).join(Order.order_tickets).filter(
Order.event_id == obj_id, Order.status == 'completed').scalar()
max = db.session.query(func.sum(Ticket.quantity.label('sum'))).filter(Ticket.event_id == obj_id).scalar()
result = {
'total': total or 0,
'draft': draft or 0,
'cancelled': cancelled or 0,
'pending': pending or 0,
'expired': expired or 0,
'placed': placed or 0,
'completed': completed or 0
'completed': completed or 0,
'max': max or 0
}
return result

Expand Down
5 changes: 5 additions & 0 deletions app/api/schema/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,11 @@ def validate_timezone(self, data, original_data):
related_view_kwargs={'event_id': '<id>'},
schema='StripeAuthorizationSchema',
type_='stripe-authorization')
order_statistics = Relationship(attribute='order_statistics',
related_view='v1.order_statistics_event_detail',
related_view_kwargs={'id': '<id>'},
schema='OrderStatisticsEventSchema',
type_='order-statistics-event')


class EventSchema(EventSchemaPublic):
Expand Down
90 changes: 90 additions & 0 deletions app/models/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from app.models.ticket_fee import get_fee
from app.models.ticket_fee import get_maximum_fee
from app.models.ticket_holder import TicketHolder
from app.models.order import Order, OrderTicket


def get_new_event_identifier(length=8):
Expand Down Expand Up @@ -447,6 +448,17 @@ def has_sessions(self):
def has_speakers(self):
return Speaker.query.filter_by(event_id=self.id).count() > 0

@property
def order_statistics(self):
statistics = {
'sales': sales_count(id=self.id),
'orders': orders_count(id=self.id),
'tickets': tickets_count_statistics(id=self.id),
'identifier': self.identifier,
'id': self.id
}
return statistics


@event.listens_for(Event, 'after_update')
@event.listens_for(Event, 'after_insert')
Expand All @@ -468,3 +480,81 @@ def receive_after_delete(mapper, connection, target):
"""
if current_app.config['ENABLE_ELASTICSEARCH']:
sync.mark_event(sync.REDIS_EVENT_DELETE, target.id)


def tickets_count_statistics(id):
obj_id = id
total = db.session.query(func.sum(OrderTicket.quantity.label('sum'))).join(Order.order_tickets).filter(
Order.event_id == obj_id).scalar()
draft = db.session.query(func.sum(OrderTicket.quantity.label('sum'))).join(Order.order_tickets).filter(
Order.event_id == obj_id, Order.status == 'draft').scalar()
cancelled = db.session.query(func.sum(OrderTicket.quantity.label('sum'))).join(Order.order_tickets).filter(
Order.event_id == obj_id, Order.status == 'cancelled').scalar()
pending = db.session.query(func.sum(OrderTicket.quantity.label('sum'))).join(Order.order_tickets).filter(
Order.event_id == obj_id, Order.status == 'pending').scalar()
expired = db.session.query(func.sum(OrderTicket.quantity.label('sum'))).join(Order.order_tickets).filter(
Order.event_id == obj_id, Order.status == 'expired').scalar()
placed = db.session.query(func.sum(OrderTicket.quantity.label('sum'))).join(Order.order_tickets).filter(
Order.event_id == obj_id, Order.status == 'placed').scalar()
completed = db.session.query(func.sum(OrderTicket.quantity.label('sum'))).join(Order.order_tickets).filter(
Order.event_id == obj_id, Order.status == 'completed').scalar()
max = db.session.query(func.sum(Ticket.quantity.label('sum'))).filter(Ticket.event_id == obj_id).scalar()
result = {
'total': total or 0,
'draft': draft or 0,
'cancelled': cancelled or 0,
'pending': pending or 0,
'expired': expired or 0,
'placed': placed or 0,
'completed': completed or 0,
'max': max or 0
}
return result


def orders_count(id):
obj_id = id
total = get_count(db.session.query(Order).filter(Order.event_id == obj_id))
draft = get_count(db.session.query(Order).filter(Order.event_id == obj_id, Order.status == 'draft'))
cancelled = get_count(db.session.query(Order).filter(Order.event_id == obj_id, Order.status == 'cancelled'))
pending = get_count(db.session.query(Order).filter(Order.event_id == obj_id, Order.status == 'pending'))
expired = get_count(db.session.query(Order).filter(Order.event_id == obj_id, Order.status == 'expired'))
placed = get_count(db.session.query(Order).filter(Order.event_id == obj_id, Order.status == 'placed'))
completed = get_count(db.session.query(Order).filter(Order.event_id == obj_id, Order.status == 'completed'))
result = {
'total': total or 0,
'draft': draft or 0,
'cancelled': cancelled or 0,
'pending': pending or 0,
'expired': expired or 0,
'placed': placed or 0,
'completed': completed or 0
}
return result


def sales_count(id):
obj_id = id
total = db.session.query(func.sum(Order.amount.label('sum'))).filter(Order.event_id == obj_id).scalar()
draft = db.session.query(func.sum(Order.amount.label('sum'))).filter(Order.event_id == obj_id,
Order.status == 'draft').scalar()
cancelled = db.session.query(func.sum(Order.amount.label('sum'))).filter(Order.event_id == obj_id,
Order.status == 'cancelled').scalar()
pending = db.session.query(func.sum(Order.amount.label('sum'))).filter(Order.event_id == obj_id,
Order.status == 'pending').scalar()
expired = db.session.query(func.sum(Order.amount.label('sum'))).filter(Order.event_id == obj_id,
Order.status == 'expired').scalar()
placed = db.session.query(func.sum(Order.amount.label('sum'))).filter(Order.event_id == obj_id,
Order.status == 'placed').scalar()
completed = db.session.query(func.sum(Order.amount.label('sum'))).filter(Order.event_id == obj_id,
Order.status == 'completed').scalar()
result = {
'total': total or 0,
'draft': draft or 0,
'cancelled': cancelled or 0,
'pending': pending or 0,
'expired': expired or 0,
'placed': placed or 0,
'completed': completed or 0
}
return result

0 comments on commit 1bc2451

Please sign in to comment.