haldis/app/fatmodels.py

54 lines
1.3 KiB
Python
Raw Normal View History

2016-09-10 21:01:13 +00:00
from models import User, Location, Order, OrderItem, Product
from sqlalchemy.sql import func, desc
2016-09-10 14:52:46 +00:00
2016-09-10 21:01:13 +00:00
class FatModel:
@classmethod
def all(cls):
return cls.query.all()
2016-09-10 14:52:46 +00:00
@classmethod
def amount(cls):
return cls.query.count()
2016-09-10 21:01:13 +00:00
class FatLocation(Location, FatModel): pass
class FatOrder(Order, FatModel):
# It's hard to add the unique user constraint,
# as DISTINCT seems to apply after a GROUP BY and aggregate
# So DISTINCT ... count(user_id) ... will count all users,
# even if they get reduced by the disctinct afterwards.
@classmethod
def items_per_order(cls):
return Order.query.\
join(OrderItem).\
group_by(Order.id).\
with_entities(Order.id, func.count(OrderItem.user_id).label('total'))
2016-09-10 14:52:46 +00:00
2016-09-10 21:01:13 +00:00
class FatUser(User, FatModel): pass
2016-09-10 14:52:46 +00:00
2016-09-10 21:01:13 +00:00
class FatOrderItem(OrderItem, FatModel): pass
2016-09-10 14:52:46 +00:00
2016-09-10 21:01:13 +00:00
class FatProduct(Product, FatModel):
@classmethod
def top4(cls):
top4 = OrderItem.query\
.join(Product)\
.join(Location)\
.group_by(Product.id)\
.with_entities(Product.name,
Location.name,
func.count(Product.id).label('count')
)\
.order_by(desc('count'))\
.limit(4)
for top in top4:
print(top)