ref: master
core/types/order.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
from sqlalchemy import Column, String, Integer, DateTime, ForeignKey from sqlalchemy.orm import relationship from datetime import datetime as dt from core.types.order_product import OrderProduct from core.types.product import Product from sqlalchemy.sql import func from sqlalchemy_utils import ChoiceType from enum import Enum from core.database import db, Base class OrderStatus(Enum): draft = 'draft' confirmed = 'confirmed' class Order(Base): __tablename__ = 'orders' id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.id'), nullable=False) cycle_id = Column(Integer, ForeignKey('cycles.id'), nullable=False) status = Column(ChoiceType(OrderStatus, impl=String(150)), server_default='draft') created_at = Column(DateTime, nullable=False) updated_at = Column(DateTime, nullable=False) order_products = relationship('OrderProduct', backref="order", lazy=True, cascade="save-update, merge, delete") def __init__(self, user_id, cycle_id): self.user_id = user_id self.cycle_id = cycle_id @classmethod def create_for(class_object, user, cycle): order = class_object(user.id, cycle.id) db.add(order) db.commit() return order def add_products(self, product_ids): # Delete the current products for this order for product in self.order_products: db.delete(product) db.commit() # Create the new entries for product_id in product_ids: order_product = OrderProduct(self.id, product_id, 1) db.add(order_product) db.commit() def reopen(self): self.status = OrderStatus.draft def confirm(self): self.status = OrderStatus.confirmed def selected_product_ids(self): return list(map(lambda entry: entry.product_id, self.order_products)) def products(self): return list(map(lambda entry_id: Product.query.get(entry_id), self.selected_product_ids())) def total(self): prices = list(map(lambda product: product.price_on(self.cycle), self.products())) return sum(prices, 0) def to_json(self): return { "id": self.id, "user_id": self.user_id, "cycle_id": self.cycle_id, "products": self.selected_product_ids() } |