haldis/app/fatmodels.py

61 lines
1.4 KiB
Python
Raw Permalink Normal View History

2019-09-08 01:58:21 +02:00
import typing
2019-05-29 18:02:55 +02:00
from sqlalchemy.sql import desc, func
2016-09-10 16:52:46 +02:00
2019-05-29 18:02:55 +02:00
from models import Location, Order, OrderItem, Product, User
2016-09-10 16:52:46 +02:00
2016-09-10 23:01:13 +02:00
2019-05-29 18:02:55 +02:00
class FatModel:
2016-09-10 23:01:13 +02:00
@classmethod
def all(cls):
return cls.query.all()
2016-09-10 16:52:46 +02:00
@classmethod
def amount(cls):
return cls.query.count()
2019-05-29 18:02:55 +02:00
class FatLocation(Location, FatModel):
pass
2016-09-10 23:01:13 +02:00
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):
2019-09-05 03:33:29 +02:00
return (
2019-09-10 15:17:35 +02:00
Order.query.join(OrderItem).group_by(Order.id)
.with_entities(Order.id,
func.count(OrderItem.user_id).label("total"))
2019-09-05 03:33:29 +02:00
)
2016-09-10 16:52:46 +02:00
2019-05-29 18:02:55 +02:00
class FatUser(User, FatModel):
pass
2016-09-10 16:52:46 +02:00
2019-05-29 18:02:55 +02:00
class FatOrderItem(OrderItem, FatModel):
pass
2016-09-10 16:52:46 +02:00
2016-09-10 23:01:13 +02:00
class FatProduct(Product, FatModel):
@classmethod
2019-09-08 01:58:21 +02:00
def top4(cls) -> None:
2019-09-05 03:33:29 +02:00
top4 = (
OrderItem.query.join(Product)
.join(Location)
.group_by(Product.id)
.with_entities(
2019-09-10 15:17:35 +02:00
Product.name, Location.name, func.count(
Product.id).label("count")
2019-09-05 03:33:29 +02:00
)
.order_by(desc("count"))
2016-09-10 23:01:13 +02:00
.limit(4)
2019-09-05 03:33:29 +02:00
)
2016-09-10 23:01:13 +02:00
for top in top4:
2019-05-29 18:02:55 +02:00
print(top)