haldis/app/models/order.py

91 lines
3.2 KiB
Python
Raw Normal View History

2019-09-10 01:06:11 +02:00
"Script for everything Order related in the database"
2019-09-08 00:41:50 +02:00
import typing
from datetime import datetime
from utils import first
from hlds.definitions import location_definitions
from .database import db
from .user import User
class Order(db.Model):
2019-09-10 01:06:11 +02:00
"Class used for configuring the Order model in the database"
id = db.Column(db.Integer, primary_key=True)
courier_id = db.Column(db.Integer, nullable=True)
2020-01-26 02:39:58 +01:00
location_id = db.Column(db.String(64))
location_name = db.Column(db.String(128))
starttime = db.Column(db.DateTime)
stoptime = db.Column(db.DateTime)
public = db.Column(db.Boolean, default=True)
2020-01-26 02:39:58 +01:00
2019-09-05 03:33:29 +02:00
items = db.relationship("OrderItem", backref="order", lazy="dynamic")
def __getattr__(self, name):
if name == "location":
2020-07-17 11:40:15 +02:00
return first(
filter(lambda l: l.id == self.location_id, location_definitions)
)
raise AttributeError()
2019-09-08 00:41:50 +02:00
def __repr__(self) -> str:
2019-09-10 01:06:11 +02:00
# pylint: disable=R1705
if self.location:
2019-09-05 03:33:29 +02:00
return "Order %d @ %s" % (self.id, self.location.name or "None")
else:
2019-09-05 03:33:29 +02:00
return "Order %d" % (self.id)
def update_from_hlds(self) -> None:
"""
Update the location name from the HLDS definition.
User should commit after running this to make the change persistent.
"""
2020-07-17 11:40:15 +02:00
assert (
self.location_id
), "location_id must be configured before updating from HLDS"
self.location_name = self.location.name
2019-09-08 00:41:50 +02:00
def group_by_user(self) -> typing.Dict[str, typing.Any]:
2019-09-10 01:06:11 +02:00
"Group items of an Order by user"
2019-09-08 00:41:50 +02:00
group: typing.Dict[str, typing.Any] = dict()
for item in self.items:
user = group.get(item.get_name(), dict())
user["total"] = user.get("total", 0) + item.price
2020-07-17 11:40:15 +02:00
user["to_pay"] = user.get("to_pay", 0) + item.price if not item.paid else 0
user["paid"] = user.get("paid", True) and item.paid
user["dishes"] = user.get("dishes", []) + [item.dish_name]
group[str(item.get_name())] = user
return group
2020-07-17 11:40:15 +02:00
def group_by_dish(
self, sort_comments=False
) -> typing.Dict[str, typing.Dict[str, typing.Any]]:
"Group items of an Order by dish"
2020-03-10 18:39:11 +01:00
group: typing.Dict[str, typing.Dict[str, typing.Any]] = dict()
for item in self.items:
dish = group.get(item.dish_name, dict())
dish["count"] = dish.get("count", 0) + 1
2020-01-27 03:01:49 +01:00
dish["comments"] = dish.get("comments", []) + [item.comment]
group[item.dish_name] = dish
2020-03-10 18:39:11 +01:00
if sort_comments:
for _dish_name, dish_props in group.items():
dish_props["comments"].sort()
return group
def is_closed(self) -> bool:
2020-01-27 03:52:29 +01:00
return self.stoptime and datetime.now() > self.stoptime
2019-09-08 00:41:50 +02:00
def can_close(self, user_id: int) -> bool:
2019-09-10 01:06:11 +02:00
"Check if a user can close the Order"
if self.stoptime and self.stoptime < datetime.now():
return False
user = None
if user_id:
user = User.query.filter_by(id=user_id).first()
print(user)
if self.courier_id == user_id or (user and user.is_admin()):
return True
return False